当前位置: 首页 > ai >正文

【匹配】Needleman–Wunsch

Needleman-Wunsch

文章目录

  • Needleman-Wunsch
    • 1. 算法介绍
    • 2. 公式及原理
    • 3. 伪代码

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 * dfor 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]   - dinsert ← F[i,  j-1] - dF[i,j] ← max(match, delete, insert)# 3) 回溯还原比对i ← m; j ← naligned_A, aligned_B ← empty stringswhile 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-1else if i>0 and F[i,j] == F[i-1,j] - d:aligned_A.prepend(A[i])aligned_B.prepend('-')i ← i-1else:aligned_A.prepend('-')aligned_B.prepend(B[j])j ← j-1return 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)
http://www.xdnf.cn/news/6412.html

相关文章:

  • 深入理解 Cortex-M 的中断输入和挂起行为
  • RedHat7 如何更换yum镜像源
  • SAM微调fine-tune/PEFT系列论文整理
  • vue-quill-editor富文本编辑器
  • PYTHON训练营DAY26
  • 开发技术.前端开发相关问题
  • RiDoc:高效文档扫描与图像处理工具,助力高效办公
  • 语音识别——通过PyAudio录入音频
  • Secs/Gem第六讲(基于secs4net项目的ChatGpt介绍)
  • gRPC为什么高性能
  • 图神经网络如何模拟人类“理解场景”的过程?
  • 连接指定数据库时提示not currently accepting connections
  • 从代码学习深度学习 - 实战 Kaggle 比赛:图像分类 (CIFAR-10 PyTorch版)
  • Docker构建Nginx、PHP、MySQL及WordPress部署及解释
  • 2025 后端自学UNIAPP【项目实战:旅游项目】5、个人中心页面:微信登录,同意授权,获取用户信息
  • 作业帮Java后台开发面试题及参考答案(下)
  • 双重差分模型学习笔记2(理论)
  • TCVectorDB 向量数据库简介
  • GPU异步执行漏洞攻防实战:从CUDA Stream竞争到安全编程规范
  • 一文读懂--程序的编译汇编和链接
  • MarkitDown:AI时代的文档转换利器
  • 鸽巢原理/抽屉原理
  • RK3588 Uboot 读U盘配置ENV环境变量
  • 鸿蒙OSUniApp制作自定义的下拉菜单组件(鸿蒙系统适配版)#三方框架 #Uniapp
  • 湖北理元理律师事务所:债务优化如何实现“减负不降质”?
  • ChromaDB 向量库优化技巧实战
  • 如何在夸克浏览器里-安装梦精灵AI提示词管理工具
  • Apollo学习——planning模块(2)之planning_component
  • 《山东欧曼谛:美业梦想的启航港》
  • [Linux性能优化] 线程卡顿优化。Linux加入USB(HID)热插拔线程占用CPU优化。Linux中CPU使用率过高优化