全局比对&Needleman-Wunsch算法 | 生物人最值得看的哈佛生信课03

另一篇有关局部比对的文章

全局比对(Global aliment)

全局比对是指将参与比对的两条序列里面的所有字符进行比对。全局比对在全局范围内对两条序列进行比对打分,找出最佳比对,主要被用来寻找关系密切的序列。其可以用来鉴别或证明新序列与已知序列家族的同源性,是进行分子进化分析的重要前提。其代表是Needleman-Wunsch算法。

from:https://zhuanlan.zhihu.com/p/150579075


from:12.global sequence alignment & needleman-wunsch __ algorithm and example_哔哩哔哩_bilibili

Needleman-Wunsch算法步骤

和上次的local aliment部分类似:

在动态规划算法中,解题思路往往是把一个问题分解成更小更简单的子问题,通过解决子问题,来得到原问题的解。

  1. **初始化:**创建一个矩阵,其大小为序列A和序列B的长度加1。这个矩阵用于存储比对分数。

  2. 得分规则:定义匹配match得分(通常为+1),错配mismatch得分(通常为-1)和空位罚分gap(通常为-2)。

  3. 填充矩阵:矩阵的左上角开始,逐个填充矩阵的每个格子。填充的规则如下:

  • 如果当前比较的两个字符相同,则得分通常是正数(例如+1)。
  • 如果字符不同,则得分通常是负数或零(例如-1或0)。
  • 每个格子的得分是以下三个值中的最大值:
    • 左边格子的得分减去空位罚分(代表在序列B中插入一个空格)。
    • 上边格子的得分减去空位罚分(代表在序列A中插入一个空格)。
    • 左上角格子的得分加上匹配得分(如果字符相同)或错配得分(如果字符不同)。
  • **计算出的得分是负数,则保留该负数,因为全局比对要求整个序列对齐,不关心得分为负。**这里是和local alignment不同的地方
  1. 追踪回溯(Traceback)
  • 如果当前格子的得分来自于左上角的格子(即两个字符进行了匹配或错配),则:

  • 如果两个字符相同,将它们配对,并移动到左上角的格子。

  • 如果两个字符不同,也将它们配对(错配),并移动到左上角的格子。

  • 如果当前格子的得分来自于左边的格子,则:

  • 在序列B中添加一个空位(gap),并移动到左边的格子。

  • 如果当前格子的得分来自于上边的格子,则:
    在序列A中添加一个空位(gap),并移动到上边的格子。

全局比对是一种常用的序列比对方法,它可以比对两个序列的整个长度,并给出它们的相似程度。其中 Needleman-Wunsch 是一种经典的全局比对算法。 Needleman-Wunsch 算法的本质是动态规划,它将全局比对的问题拆分成若干个子问题,并通过计算每个子问题的得分来求解终的比对结果。具体实现步骤如下: 1. 初始化得分矩阵(score matrix)并计算第一行和第一列的得分; 2. 逐行逐列计算得分矩阵中的每个元素的得分,根据得分矩阵中每个元素的左上、上、左三个元素的得分值,计算当前元素的得分; 3. 回溯得分矩阵,得到比对结果。 以下是 Needleman-Wunsch 算法的 Python 实现: ```python # Needleman-Wunsch 算法实现 import numpy as np def needleman_wunsch(seq1, seq2, match_score=1, mismatch_score=-1, gap_score=-1): # 初始化得分矩阵 m, n = len(seq1), len(seq2) score_matrix = np.zeros((m+1, n+1)) for i in range(1, m+1): score_matrix[i,0] = score_matrix[i-1,0] + gap_score for j in range(1, n+1): score_matrix[0,j] = score_matrix[0,j-1] + gap_score # 填充得分矩阵 for i in range(1, m+1): for j in range(1, n+1): score1 = score_matrix[i-1,j-1] + (match_score if seq1[i-1] == seq2[j-1] else mismatch_score) score2 = score_matrix[i-1,j] + gap_score score3 = score_matrix[i,j-1] + gap_score score_matrix[i,j] = max(score1, score2, score3) # 回溯得分矩阵,得到比对结果 align1, align2 = '', '' i, j = m, n while i > 0 and j > 0: score, score1, score2, score3 = score_matrix[i,j], score_matrix[i-1,j-1], score_matrix[i-1,j], score_matrix[i,j-1] if score == score1 + (match_score if seq1[i-1] == seq2[j-1] else mismatch_score): align1 = seq1[i-1] + align1 align2 = seq2[j-1] + align2 i, j = i-1, j-1 elif score == score2 + gap_score: align1 = seq1[i-1] + align1 align2 = '-' + align2 i -= 1 else: align1 = '-' + align1 align2 = seq2[j-1] + align2 j -= 1 while i > 0: align1 = seq1[i-1] + align1 align2 = '-' + align2 i -= 1 while j > 0: align1 = '-' + align1 align2 = seq2[j-1] + align2 j -= 1 return align1, align2 ``` 在上面的代码中,我们使用了 `numpy` 库来创建得分矩阵,这使得代码更加简洁和高效。在实现中,我们还可以通过调整 `match_score`、`mismatch_score` 和 `gap_score` 的值来控制比对的结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值