Python 具有仿射间隙惩罚的Smith-Wateman算法的回溯

Python 具有仿射间隙惩罚的Smith-Wateman算法的回溯,python,bioinformatics,biopython,sequence-alignment,Python,Bioinformatics,Biopython,Sequence Alignment,我正在尝试使用仿射间隙惩罚函数实现局部序列对齐的Smith-Waterman算法。我想我知道如何启动和计算计算对齐分数所需的矩阵,但不知道如何回溯以找到对齐。要生成所需的3个矩阵,我有以下代码 for j in range(1, len2): for i in range(1, len1): fxOpen = F[i][j-1] + gap xExtend = Ix[i][j-1] + extend Ix[i][j] = max(fxOpe

我正在尝试使用仿射间隙惩罚函数实现局部序列对齐的Smith-Waterman算法。我想我知道如何启动和计算计算对齐分数所需的矩阵,但不知道如何回溯以找到对齐。要生成所需的3个矩阵,我有以下代码

for j in range(1, len2):
    for i in range(1, len1):
        fxOpen = F[i][j-1] + gap
        xExtend = Ix[i][j-1] + extend
        Ix[i][j] = max(fxOpen, xExtend)

        fyOpen = F[i-1][j] + gap
        yExtend = Iy[i-1][j] + extend
        Iy[i][j] = max(fyOpen, yExtend)

        matchScore = (F[i-1][j-1]  + simMatrixDict[seq1[i-1]+seq2[j-1]])
        xScore = Ix[i-1][j-1] + simMatrixDict[seq1[i-1]+seq2[j-1]]
        yScore = Iy[i-1][j-1] + simMatrixDict[seq1[i-1]+seq2[j-1]]
        F[i][j] = max(0, matchScore, xScore, yScore)

我不确定我是否需要一个矩阵进行回溯,还是只需要一个矩阵?如果您能澄清如何从F中的最大分数进行追溯,我们将不胜感激。

在Smith Waterman中关于追溯的重要一点是,a值所在的矩阵决定了您移动的方向。所以,如果你在
F
中,你是在对角移动,如果你在
Ix
中,你是在水平移动,如果你在
Iy
中,你是在垂直移动。这意味着您需要存储在指针矩阵中的所有内容都是从中得到正方形的矩阵。你来自的矩阵,而不是你要去的矩阵,决定了你要去的方向

例如:

假设您位于
F[5][5]

  • 如果指针矩阵指示转到
    Ix
    ,则转到
    Ix[4][4]
  • 如果指针矩阵指示转到
    Iy
    ,则转到
    Iy[4][4]
  • 如果指针矩阵指示转到
    F
    ,则转到
    F[4][4]
而如果您位于
Ix[5][5]

  • 如果指针矩阵指示转到
    Ix
    ,请转到
    Ix[4][5]
  • 如果指针矩阵指示转到
    F
    ,则转到
    F[4][5]
或者如果您在
Iy[5][5]

  • 如果指针矩阵指示转到
    Iy
    ,请转到
    Iy[5][4]
  • 如果指针矩阵指示转到
    F
    ,则转到
    F[5][4]
假设第一个索引是x坐标,第二个是y坐标

继续回溯,直到到达最大值为0的单元格

构建指针矩阵:
对于
F
Ix
Iy
,每个都需要一个指针矩阵。这些矩阵只需要指出值来自哪个矩阵,因为它可以告诉您前进的方向。因此,当您运行算法的动态编程阶段时,您还应该建立指针矩阵。每次在
F
Ix
Iy
中的单元格中存储新的最大值时,都应更新相应的矩阵以指示其来源。例如,如果在
F[5][5]
中可以获得的最高值是在
F[4][4][/code>中对齐下两个基址,那么Fpointer[5][5]应该设置为
F
,因为这是从
F
矩阵中获得的

你是想把实现算法当作练习吗?您可以在线找到Python实现。示例:,,。感谢您的回复,但这(两个)中只有一个包含仿射间隙惩罚函数,这正是我真正想要的。不幸的是,其中的代码有点超出了我的理解范围,只花了几个月的时间。感谢您的快速回复,我正在努力解决的是如何构建指针矩阵。看起来这三个分数矩阵是独立建立的,所以我看不出你会如何决定何时从一个移动到另一个?大概你需要指向左、上、对角线,然后其他指针告诉你移动到哪个矩阵?好的,我编辑了我的答案,以包含更多关于这方面的信息。基本上,三个矩阵中的每一个都需要一个不同的指针矩阵,但它只需要记录在该单元格中获得最高值时得到的矩阵,因为它告诉您需要了解的关于运动方向的所有信息。既然你问的是回溯,我假设你已经有了动态规划,这样你就可以在每个单元格中找到最好的可能值。设置指针矩阵只是跟踪如何获得该值的问题。我在这里仍有疑问。如果你有时间的话,你能告诉我,即使是伪代码,为什么三个矩阵是必要的吗?我的想法是这样的:回溯只会存储方向。我真的不明白为什么我们在追踪时需要跳转到其他矩阵。在DP中,我们存储该值的来源方向,以便跟踪它(DIAG、LEFT或UP)。如果x,y的最大值来自F,则为DIAG,如果来自Ix,则为LEFT,依此类推。我并不是说这是对的——我只是感到困惑:)我如何保存我来自何方和我在何处?以上建议确实帮助了我,而且效果非常好!非常感谢:-)此解决方案不能保证最佳解决方案。通过Ix[5][5]的最佳路径不一定需要通过Ix[4][5]或F[4][5]。它可以简单地来自Ix[n][5],其中n