我正在尝试使用仿射空位罚函数实现用于局部序列比对的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)
我不确定是否需要单个矩阵进行回溯,或者只需要1?任何有关如何从F中的最高分回溯的澄清都将非常感激。
答案 0 :(得分:6)
史密斯 - 沃特曼关于追溯的重要事项是,一个值所在的矩阵决定了你移动的方向。所以,如果你在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]
时对齐下两个基数,则Fpointer [5] [5]应设置为{{1因为你从F
矩阵到达那里。