【匹配】Needleman–Wunsch

Needleman-Wunsch

1. 算法介绍

  • 背景与目标
    Needleman–Wunsch 算法由 Saul B. Needleman 和 Christian D. Wunsch 于1970年提出,是用于生物序列(如蛋白质或 DNA)全局比对(global alignment)的经典动态规划方法。其核心目标是:

    在允许插入、缺失(gap)和错配的情况下,找到两条序列从头到尾的最优比对,使得总体得分最大。

  • 应用场景

    • 两条全长蛋白质序列或 DNA 序列的全局比对
    • 构建进化距离矩阵、聚类与系统发生学分析
    • 作为后续更复杂比对(如多序列比对、局部比对)的基础
  • 核心思路

    1. 构建一个大小为 ( m + 1 ) × ( n + 1 ) (m+1)\times(n+1) (m+1)×(n+1) 的积分得分矩阵 F F F,其中 m , n m,n m,n 分别为两序列长度;
    2. 以线性或 affine gap penalty 设定缺口代价;
    3. 通过动态规划递推填表,计算从起点到任意 ( i , j ) (i,j) (i,j) 的最优比对得分;
    4. 从右下角回溯(traceback),还原最佳全局比对路径。

2. 公式及原理

2.1 符号与评分函数

  • 序列 A = a 1 a 2 ⋯ a m \mathbf{A}=a_1a_2\cdots a_m A=a1a2am B = b 1 b 2 ⋯ b n \mathbf{B}=b_1b_2\cdots b_n B=b1b2bn

  • 设定匹配/错配得分函数:

    s ( a i , b j ) = { + α , a i = b j ( match ) − β , a i ≠ b j ( mismatch ) s(a_i,b_j) = \begin{cases} +\alpha, & a_i = b_j \quad(\text{match})\\ -\beta, & a_i \neq b_j \quad(\text{mismatch}) \end{cases} s(ai,bj)={+α,β,ai=bj(match)ai=bj(mismatch)

  • 线性缺口惩罚:对于连续插入或删除长度为 k k k,惩罚为 − k ⋅ d -k\cdot d kd

2.2 初始化

F [ 0 , 0 ] = 0 , F [ i , 0 ] = − i ⋅ d ( i = 1 , … , m ) , F [ 0 , j ] = − j ⋅ d ( j = 1 , … , n ) . F[0,0] = 0,\quad F[i,0] = -i\cdot d\quad (i=1,\dots,m),\quad F[0,j] = -j\cdot d\quad (j=1,\dots,n). F[0,0]=0,F[i,0]=id(i=1,,m),F[0,j]=jd(j=1,,n).

2.3 递推公式
对任意 1 ≤ i ≤ m 1\le i\le m 1im, 1 ≤ j ≤ n 1\le j\le n 1jn

F [ i , j ] = max ⁡  ⁣ { F [ i − 1 ,   j − 1 ] + s ( a i , b j ) , F [ i − 1 ,   j ] − d , F [ i ,   j − 1 ] − d . F[i,j] = \max\!\begin{cases} F[i-1,\,j-1] + s(a_i,b_j),\\ F[i-1,\,j] - d,\\ F[i,\,j-1] - d. \end{cases} F[i,j]=max F[i1,j1]+s(ai,bj),F[i1,j]d,F[i,j1]d.

2.4 回溯(Traceback)
( i , j ) = ( m , n ) (i,j)=(m,n) (i,j)=(m,n) 开始:

  • 如果 F [ i , j ] = F [ i − 1 , j − 1 ] + s ( a i , b j ) F[i,j] = F[i-1,j-1] + s(a_i,b_j) F[i,j]=F[i1,j1]+s(ai,bj),则对齐 a i a_i ai b j b_j bj,移动 ( i , j ) → ( i − 1 , j − 1 ) (i,j)\to(i-1,j-1) (i,j)(i1,j1)
  • 否则若 F [ i , j ] = F [ i − 1 , j ] − d F[i,j] = F[i-1,j] - d F[i,j]=F[i1,j]d,则对齐 a i a_i ai 与 gap,移动 ( i , j ) → ( i − 1 , j ) (i,j)\to(i-1,j) (i,j)(i1,j)
  • 否则对齐 gap 与 b j b_j bj,移动 ( i , j ) → ( i , j − 1 ) (i,j)\to(i,j-1) (i,j)(i,j1)
    直到回到 ( 0 , 0 ) (0,0) (0,0)

3. 伪代码

# 输入
#   A[1..m], B[1..n]: 待比对序列
#   s(a,b): 匹配得分函数
#   d: 线性 gap penalty
# 输出
#   aligned_A, aligned_B: 两个同长的对齐序列

function NeedlemanWunsch(A, B, s, d):
    m ← length(A); n ← length(B)

    # 1) 初始化矩阵 F 大小 (m+1)x(n+1)
    for i in 0..m:
        F[i,0] ← -i * d
    for j in 0..n:
        F[0,j] ← -j * d

    # 2) 填表
    for i in 1..m:
        for j in 1..n:
            match ← F[i-1,j-1] + s(A[i], B[j])
            delete ← F[i-1,j]   - d
            insert ← F[i,  j-1] - d
            F[i,j] ← max(match, delete, insert)

    # 3) 回溯还原比对
    i ← m; j ← n
    aligned_A, aligned_B ← empty strings
    while i>0 or j>0:
        if i>0 and j>0 and F[i,j] == F[i-1,j-1] + s(A[i],B[j]):
            aligned_A.prepend(A[i])
            aligned_B.prepend(B[j])
            i ← i-1; j ← j-1
        else if i>0 and F[i,j] == F[i-1,j] - d:
            aligned_A.prepend(A[i])
            aligned_B.prepend('-')
            i ← i-1
        else:
            aligned_A.prepend('-')
            aligned_B.prepend(B[j])
            j ← j-1

    return aligned_A, aligned_B
  • 时间复杂度 O ( m × n ) O(m \times n) O(m×n)
  • 空间复杂度 O ( m × n ) O(m \times n) O(m×n)(可用带回溯链的 Hirschberg 算法降到 O ( m + n ) O(m+n) O(m+n)
为了实现双序列全局比对并应用BLOSUM62矩阵和仿射空位罚分策略,我们推荐参考以下资料:《生物信息学:任选一种编程语言,设计一个双序列全局比对的程序》。该资料提供了一步一步的指导,帮助你理解并实现这一复杂的生物信息学问题。 参考资源链接:[生物信息学:任选一种编程语言,设计一个双序列全局比对的程序](https://wenku.csdn.net/doc/6401acbdcce7214c316ecf52) 首先,你需要理解动态规划的基本原理,尤其是Needleman-Wunsch算法。该算法用于全局比对,通过构建一个得分矩阵,最终找到两条序列的最大相似度。矩阵的每个元素代表了两条序列到当前位置为止的最大比对得分。 接下来,关于BLOSUM62矩阵,它是根据序列比对结果获得的氨基酸替换概率矩阵,对于序列比对中的匹配(match)和不匹配(mismatch)给出了具体的分数。在编程实现时,你需要将这个矩阵嵌入到你的比对算法中,以计算序列间的对齐得分。 对于空位罚分,仿射空位罚分策略比线性罚分策略更加复杂。在这种策略中,开启一个空位(gap opening)的罚分是一个固定的负值,而扩展已有空位(gap extension)的罚分则是一个较小的负值。在动态规划的实现中,需要维护两个额外的罚分矩阵,一个用于记录空位开启罚分,另一个用于记录空位扩展罚分。 最后,通过将BLOSUM62矩阵、仿射空位罚分策略与Needleman-Wunsch算法结合,你可以编写出一个程序,输入两条蛋白质序列,输出序列的全局比对结果及其得分。例如,一个典型的输出格式为: Alignment Score: 12345 E E E E E K K K K K A A A A A F F F E E E E E – – – – – B B B B B F F F 在这个过程中,你需要考虑如何优化算法的性能和内存使用,以及如何处理序列输入和输出格式。 当你掌握了上述技术后,如果你希望进一步深入学习生物信息学中的序列比对技术,包括更高级的算法和应用场景,可以继续参考《生物信息学:任选一种编程语言,设计一个双序列全局比对的程序》。该资料不仅提供了理论知识,还包括了丰富的实例和练习,有助于你将所学知识应用于实际问题解决中。 参考资源链接:[生物信息学:任选一种编程语言,设计一个双序列全局比对的程序](https://wenku.csdn.net/doc/6401acbdcce7214c316ecf52)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值