尼德曼-翁施算法
这是一种对两个序列的相似性进行对比的算法(比如基因序列对比、蛋白质序列对比)
偶尔看到一个硬件spec上有写对smith-waterman算法的优化,然后好奇学习了一下,结果就看到了它的爷爷needleman-wunsch算法。简单记录一下
1. 对于两个序列首先形成如下带空行、空列矩阵,头一个空格置0
GCATGCG
GATTACA
G | C | A | T | G | C | G | ||
---|---|---|---|---|---|---|---|---|
0 | -1 | -2 | -3 | -4 | -5 | -6 | -7 | |
G | -1 | |||||||
A | -2 | |||||||
T | -3 | |||||||
T | -4 | |||||||
A | -5 | |||||||
C | -6 | |||||||
A | -7 |
2. 按照规则:
2.1 对于每个点若其行列字符相等则用其左上角分数+1
2.2 对于每个点若其行列字符相等则对比左、左上、上三个单元格选最大分数-1
3. 得到
G | C | A | T | G | C | G | ||
---|---|---|---|---|---|---|---|---|
0 | -1 | -2 | -3 | -4 | -5 | -6 | -7 | |
G | -1 | 1 | 0 | -1 | -2 | -3 | -4 | -5 |
A | -2 | 0 | 0 | 1 | 0 | -1 | -2 | -3 |
T | -3 | -1 | -1 | 0 | 2 | 1 | 0 | -1 |
T | -4 | -2 | -2 | -1 | 1 | 1 | 0 | -1 |
A | -5 | -3 | -3 | -1 | 0 | 0 | 0 | -1 |
C | -6 | -4 | -2 | -2 | -1 | -1 | 1 | 0 |
A | -7 | -5 | -3 | -1 | -2 | -2 | 0 | 0 |
手算一轮明显感觉到这一段计算是自左上到右下的单向传播;
规则2.1展示出了无论正位(对角线)或是错位(非对角线的左上点)对齐,都能明显放大,特别是连续的对齐(上述字串中的“AT”子串),能轻易制造全局分数最高点(2),这保障了最长子串匹配的成为整个矩阵的峰值点,而后续的计算,都受到此峰值涟漪的影响。围绕2出现扇形的1-0面如下:
2 | 1 | 0 |
1 | 1 | 0 |
0 | 0 | 0 |
4. 自右下向左上进行回溯
4.0 若矩阵点对应的行列字符相同,则下一步跳到左上点;
4.1 不相等则跳到“左上/左/上”的高分点,如果“左上/左/上”存在相同高分点,则按左上>左>上的优先级选择点
4.2 如果回溯到左上角单元格,则行-列各自写自己的字符串
4.3 如果回溯到上单元格则行取字符,列填空
4.4 如果回溯到左边单元格,列取字符行填空
最后就会得到
G | C | A | T | G | C | G | |
---|---|---|---|---|---|---|---|
G | A | T | T | A | C | A |