25. 序列比对原理与算法¶
一句话说明¶
序列比对(Sequence Alignment)是通过算法找出两条或多条生物序列(DNA/RNA/蛋白质)之间的相似区域,从而推断功能、结构或进化关系的核心生信技术。
1. 序列比对是什么¶
白话解释: 序列比对就像"两段文字找相似"。假设你有两句话:
比对就是把这两句话一个字一个字对齐,找出哪些位置相同("我"、"去"、"买了苹果和"),哪些位置不同("今天/昨天"、"超市/商店"、"香蕉/橘子")。
在生物信息学里,"句子"变成了 DNA 序列(ATCG)或蛋白质序列(20种氨基酸字母),"找相似"的目的是: - 功能推断:如果两段序列很像,可能功能也类似 - 进化分析:相似度高说明两个物种亲缘关系近 - 变异检测:reads 比对到参考基因组后,不同的位置就是突变位点
关键概念区分: - 序列相似性(Similarity):两条序列有多"像",可用百分比衡量 - 序列同源性(Homology):两条序列是否有共同祖先(是/否,不能说"80%同源") - 序列一致性(Identity):完全相同的位置比例
2. 全局比对 vs 局部比对¶
2.1 全局比对:Needleman-Wunsch 算法(1970年)¶
白话解释: 把两条序列从头到尾强制对齐,就像两个人并排站着从头比到脚。
适用场景: 两条序列长度差不多、整体都相关(如同一个基因的不同物种版本)。
动态规划原理(白话:填表格找最优路径)¶
动态规划的核心思想:一个大问题拆成很多小问题,每个小问题的最优解叠加起来就是大问题的最优解。
具体步骤:
序列1: A G C T
序列2: A C T
第一步:画一个 (m+1) × (n+1) 的表格(m和n是两条序列的长度)
- A G C T
- [ 0] [-1] [-2] [-3] [-4] ← 第一行/列用gap罚分填满
A [-1] [ 1] [ 0] [-1] [-2]
C [-2] [ 0] [ 0] [ 1] [ 0]
T [-3] [-1] [-1] [ 0] [ 2] ← 右下角就是最终得分
第二步:每个格子从三个方向选最大值:
↖ 对角线(匹配/错配):上一格分数 + 匹配分or错配罚分
← 左边(序列2插入gap):左格分数 + gap罚分
↑ 上边(序列1插入gap):上格分数 + gap罚分
第三步:从右下角回溯到左上角,走过的路径就是最优比对结果
时间复杂度:O(mn),空间复杂度 O(mn)。两条 1000bp 的序列 → 填 100万格。
2.2 局部比对:Smith-Waterman 算法(1981年)¶
白话解释: 只找两条序列里"最像的那一小段",不要求从头对到尾。就像在两本书里找一段相同的引用。
与 Needleman-Wunsch 的关键区别:
| 特征 | Needleman-Wunsch(全局) | Smith-Waterman(局部) |
|---|---|---|
| 目标 | 整条序列对齐 | 找最相似的子片段 |
| 负分处理 | 允许负分 | 负分置零(核心区别) |
| 回溯起点 | 右下角 | 全表最高分的格子 |
| 回溯终点 | 左上角 | 遇到0停止 |
| 适用场景 | 同源基因比较 | 在长序列中找功能域 |
| 时间复杂度 | O(mn) | O(mn) |
适用场景: 一条很长的基因组序列中找一个短的功能域,或两条序列只有局部相似。
2.3 打分矩阵(Scoring Matrix)¶
打分矩阵决定了"两个字母对上了该加几分、对错了该扣几分"。
DNA打分:简单替换¶
蛋白质打分:BLOSUM 和 PAM¶
| 矩阵 | 全称 | 构建方法 | 适用场景 |
|---|---|---|---|
| BLOSUM62 | BLOcks SUbstitution Matrix | 从已知蛋白质家族的保守区域统计氨基酸替换频率,62表示聚类时序列一致性≥62%的归为一组 | 一般搜索,BLAST默认 |
| BLOSUM80 | 同上,80%一致性聚类 | 更严格 | 近缘序列比较 |
| BLOSUM45 | 同上,45%一致性聚类 | 更宽松 | 远缘序列比较 |
| PAM1 | Point Accepted Mutation | 从亲缘极近的序列推算1%突变率的替换概率 | — |
| PAM250 | PAM1矩阵自乘250次 | 模拟250个进化单位 | 远缘序列比较 |
白话记忆: - BLOSUM数字越大→对越近的序列敏感(BLOSUM80看近亲) - PAM数字越大→对越远的序列敏感(PAM250看远亲) - 方向相反!面试常考混淆点
2.4 Gap 罚分(Gap Penalty)¶
Gap = 比对中引入的"空位",代表插入/缺失突变(indel)。
线性罚分(Linear Gap Penalty)¶
仿射罚分(Affine Gap Penalty)— 更符合生物学现实¶
罚分 = 开gap罚分(Gap Open) + 延伸罚分(Gap Extension) × (L-1)
例:Gap Open = -10, Gap Extension = -1, gap长度5
罚分 = -10 + (-1) × 4 = -14
而线性模型:-2 × 5 = -10(惩罚不够)
为什么用仿射? 生物学上,产生一个 indel 事件比延伸一个已有的 indel 更"困难"。一次突变可能删掉一整段,而不是每删一个碱基都是独立事件。所以"开口"要罚重,"延续"罚轻。
3. 启发式比对:BLAST 原理¶
3.1 为什么需要 BLAST¶
Smith-Waterman 保证找到最优解,但 O(mn) 太慢: - 一条 1000bp 的序列搜索一个 30亿bp 的基因组 → 3×10^12 次计算 - 搜索 GenBank 数据库(万亿级碱基)根本不可行
BLAST(Basic Local Alignment Search Tool, 1990年)用启发式(heuristic)方法,牺牲一点准确性换取50倍以上的加速。
3.2 种子-延伸策略(Seed-and-Extend)¶
白话解释: 不要逐字逐句比,先找"关键词",有共同关键词的地方再仔细看。
步骤:
1. 切词(Word/Seed):把查询序列切成短片段
- 蛋白质:默认3个氨基酸一个词(word size=3)
- DNA:默认11个碱基一个词(word size=11)
2. 查表:把这些短词和数据库中所有序列快速比对
- 只保留得分超过阈值 T 的匹配("命中"/hit)
3. 延伸(Extension):从每个命中位置向两边延伸
- 延伸时计分,分数下降超过阈值就停止
- 得到 HSP(High-scoring Segment Pair,高分片段对)
4. 评估:用统计学方法评估 HSP 的显著性(E-value)
3.3 E-value 是什么¶
E-value(Expect value,期望值): 在相同大小的随机数据库中,偶然出现得分≥当前得分的比对数目的期望。
白话解释: "如果数据库全是随机序列,能碰巧出现这么好的比对结果的次数"。
| E-value | 含义 | 判断 |
|---|---|---|
| 1e-50 | 10^-50次偶然出现 | 极其显著,肯定同源 |
| 1e-10 | 非常不可能偶然 | 很显著 |
| 0.01 | 100次随机搜索出现1次 | 可能有意义,需验证 |
| 1 | 随机就能出现1次 | 不显著 |
| 10 | 随机能出现10次 | 无意义 |
关键公式理解(不需要记公式,理解因素): - E-value 与数据库大小成正比(库越大,偶然匹配越多) - E-value 与比对得分成反比(得分越高,越不可能偶然) - E-value ≠ p-value,但 E << 1 时两者近似
3.4 BLAST 家族程序¶
| 程序 | 查询→数据库 | 用途 |
|---|---|---|
| blastn | 核酸→核酸 | DNA序列搜索 |
| blastp | 蛋白→蛋白 | 蛋白质序列搜索 |
| blastx | 核酸(翻译)→蛋白 | 未知DNA翻译后搜索蛋白库 |
| tblastn | 蛋白→核酸(翻译) | 用蛋白质搜索核酸库 |
| tblastx | 核酸(翻译)→核酸(翻译) | 六框翻译互搜,最慢 |
| megablast | 核酸→核酸 | 高度相似序列快速搜索(word size=28) |
| PSI-BLAST | 蛋白→蛋白(迭代) | 发现远缘同源,构建PSSM迭代搜索 |
白话记忆: - 名字里有 "n" = nucleotide(核酸) - 名字里有 "p" = protein(蛋白) - 名字里有 "t" = translated(翻译) - 名字里有 "x" = 查询序列被翻译
4. 短读比对算法:BWT + FM-index¶
4.1 为什么 BLAST 不适合短读比对¶
| 问题 | BLAST | 短读比对需求 |
|---|---|---|
| 查询数量 | 几条到几百条 | 几千万到几亿条reads |
| 速度要求 | 分钟级可接受 | 必须秒级处理每条read |
| 查询长度 | 几百到几千bp | 75-300bp |
| 索引方式 | 每次搜索扫描数据库 | 需要一次建索引反复用 |
| Gap处理 | 支持大gap | 短reads很少有大gap |
总结:BLAST 是为"少量查询搜大库"设计的,短读比对是"海量短查询比对一个固定参考"的场景。
4.2 BWT(Burrows-Wheeler Transform)原理¶
白话解释: BWT 是一种文本变换,能把参考基因组"压缩+重排"成一种特殊格式,让搜索变得极快。
原理演示(以字符串 "banana$" 为例):
第一步:生成所有旋转(cyclic rotations)
banana$ ← 原始
anana$b ← 向左旋转1位
nana$ba ← 向左旋转2位
ana$ban ← 向左旋转3位
na$bana ← 向左旋转4位
a$banan ← 向左旋转5位
$banana ← 向左旋转6位
第二步:按字典序排序
$banana
a$banan
ana$ban
anana$b
banana$
na$bana
nana$ba
第三步:取最后一列 → BWT结果
annb$aa ← 这就是BWT变换后的字符串
特性:相同字符聚集在一起,极易压缩!
4.3 FM-index(Full-text Minute-space index)¶
白话解释: FM-index 是在 BWT 基础上建的索引结构,通过两个表(C表和Occ表)实现O(1)的字符定位。
搜索模式串的核心操作(Backward Search):
- 从模式串的最后一个字符开始
- 每次用 LF-mapping(Last-to-First映射)缩小候选范围
- 最终得到模式串在原文中所有出现位置
时间复杂度:O(m),m是模式串长度
与参考基因组大小无关!
为什么快: - 建索引一次(人类基因组索引约4-8GB),之后每条 read 搜索时间只和 read 长度相关 - 不需要遍历整个基因组 - BWA 和 Bowtie2 都基于此原理
4.4 BWA 与 Bowtie2 的算法差异¶
| 特性 | BWA-MEM | Bowtie2 |
|---|---|---|
| 索引 | BWT + FM-index | BWT + FM-index(mirror index) |
| 种子策略 | SMEM(超级最大精确匹配) | 从read提取子串做FM搜索 |
| 延伸 | Smith-Waterman对种子做局部延伸 | 动态规划延伸 |
| 特色 | 对100bp以上reads更优 | 支持local模式,内存占用更小 |
5. 长读比对算法:minimap2 的 Minimizer 策略¶
5.1 为什么需要新算法¶
三代测序(PacBio/Nanopore)的reads特点: - 长度:几千到几十万bp(vs 二代的100-300bp) - 错误率:Nanopore 5-15%,PacBio CLR ~10%,PacBio HiFi <1% - 错误类型:以插入/缺失为主(vs 二代以替换为主)
BWT 对 exact match 非常高效,但高错误率下精确匹配的种子太短、太碎,效率反而下降。
5.2 Minimizer 是什么¶
白话解释: 在一个滑动窗口里挑"最小的那个词"作为代表。就像每一段话挑一个"关键词"做书签。
概念:
- k-mer:长度为k的连续子串(如k=5:ATCGA)
- w-minimizer:在连续w个k-mer中,hash值最小的那个k-mer
示例(k=3, w=3):
序列:A T C G A C T
k-mers: ATC, TCG, CGA, GAC, ACT
窗口1 (ATC, TCG, CGA) → 选hash最小的
窗口2 (TCG, CGA, GAC) → 选hash最小的
窗口3 (CGA, GAC, ACT) → 选hash最小的
效果:只需存储和比较 ~2/(w+1) 的k-mer
大大减少了需要处理的种子数量
5.3 minimap2 的三步流程¶
1. 收集种子(Seeding)
- 对参考和query都提取minimizer
- 通过hash表找到共同的minimizer(锚点/anchor)
2. 链式连接(Chaining)
- 把距离合理的锚点串成链(chain)
- 用动态规划找最优链(考虑锚点间距和方向一致性)
- 时间复杂度:O(n log n),n是锚点数
3. 局部比对(Alignment)
- 只对链覆盖的区域做精确比对(带gap的SW)
- 大大减少了需要精确比对的区域
minimap2 的优势: - 速度:比 BWA-MEM 快 3-50 倍(取决于数据类型) - 通用:支持短读、长读、RNA-seq、基因组间比对 - 内存:人类基因组索引仅需 ~6.5 GB
6. 多序列比对(MSA)¶
6.1 什么是多序列比对¶
同时对齐 3 条以上序列,找出所有序列的共同保守区域。
用途: - 构建系统发育树 - 发现保守功能域 - 设计引物/探针 - 预测蛋白质结构
6.2 为什么不能用两两比对直接推¶
- 最优的两两比对组合不等于最优的多序列比对
- 精确多序列比对是 NP-hard 问题(序列越多计算量指数增长)
- 所以都用启发式方法
6.3 主流 MSA 算法¶
| 工具 | 策略 | 特点 |
|---|---|---|
| ClustalW/Omega | 渐进比对(Progressive) | 先建guide tree,按树的顺序逐步加入序列比对。经典但对早期错误敏感 |
| MUSCLE | 迭代精炼(Iterative Refinement) | 先快速渐进比对,再反复迭代改进。速度快精度高 |
| MAFFT | FFT加速 + 多种策略 | 用快速傅里叶变换加速配对距离计算,支持多种算法模式(最快L-INS-i到最准E-INS-i) |
| T-Coffee | 一致性打分 | 综合多种比对信息提高准确度,但较慢 |
白话理解渐进比对:
假设有4条序列A,B,C,D
1. 两两比对得到距离矩阵
2. 根据距离建引导树:((A,B),(C,D))
3. 先比对A和B → 得到 AB
4. 再比对C和D → 得到 CD
5. 最后比对 AB 和 CD → 得到 ABCD
问题:步骤3如果错了,后面全跟着错(error propagation)
7. Python 实操:用 Biopython 做序列比对¶
# ============ Python 序列比对实操 ============
# 环境:conda activate bioinfo
# 安装:pip install biopython
# --- 示例1:手动实现简化版 Needleman-Wunsch ---
import numpy as np # 数值计算库
def needleman_wunsch(seq1, seq2, match=1, mismatch=-1, gap=-2):
"""
简化版全局比对(Needleman-Wunsch算法)
seq1, seq2: 输入的两条序列(字符串)
match: 匹配得分
mismatch: 错配罚分
gap: 空位罚分
返回:最优得分和比对结果
"""
m, n = len(seq1), len(seq2) # 获取两条序列的长度
# 第一步:初始化得分矩阵(m+1行 × n+1列,多一行一列给gap)
score_matrix = np.zeros((m + 1, n + 1), dtype=int)
# 第一行和第一列用gap罚分递增填充
for i in range(1, m + 1):
score_matrix[i][0] = score_matrix[i-1][0] + gap # 第一列
for j in range(1, n + 1):
score_matrix[0][j] = score_matrix[0][j-1] + gap # 第一行
# 第二步:填表(动态规划核心)
for i in range(1, m + 1):
for j in range(1, n + 1):
# 判断当前位置是匹配还是错配
if seq1[i-1] == seq2[j-1]:
diag_score = score_matrix[i-1][j-1] + match # 对角线:匹配
else:
diag_score = score_matrix[i-1][j-1] + mismatch # 对角线:错配
up_score = score_matrix[i-1][j] + gap # 从上方来:seq2加gap
left_score = score_matrix[i][j-1] + gap # 从左方来:seq1加gap
# 取三个方向的最大值
score_matrix[i][j] = max(diag_score, up_score, left_score)
# 第三步:回溯(从右下角走到左上角)
align1, align2 = "", "" # 存储比对结果
i, j = m, n # 从右下角开始
while i > 0 or j > 0:
current = score_matrix[i][j]
if i > 0 and j > 0:
if seq1[i-1] == seq2[j-1]:
s = match
else:
s = mismatch
if i > 0 and j > 0 and current == score_matrix[i-1][j-1] + s:
align1 = seq1[i-1] + align1 # 对角线走:两序列都出一个字符
align2 = seq2[j-1] + align2
i -= 1
j -= 1
elif i > 0 and current == score_matrix[i-1][j] + gap:
align1 = seq1[i-1] + align1 # 向上走:seq2加gap
align2 = "-" + align2
i -= 1
else:
align1 = "-" + align1 # 向左走:seq1加gap
align2 = seq2[j-1] + align2
j -= 1
return score_matrix[m][n], align1, align2
# 测试
seq1 = "AGCTGA"
seq2 = "ACGA"
score, a1, a2 = needleman_wunsch(seq1, seq2)
print(f"得分: {score}") # 输出最优比对得分
print(f"序列1: {a1}") # 输出比对后的序列1
print(f"序列2: {a2}") # 输出比对后的序列2
# 预期输出:
# 得分: 0
# 序列1: AGCTGA
# 序列2: A-CG-A
# --- 示例2:用 Biopython 调用 pairwise2 模块做比对 ---
from Bio import pairwise2 # Biopython的两序列比对模块
from Bio.pairwise2 import format_alignment # 格式化输出比对结果
seq1 = "AGCTGATCG"
seq2 = "ACGATCG"
# globalxx:全局比对,只计匹配(+1)和错配(0),不罚gap
alignments = pairwise2.align.globalms(
seq1, seq2,
2, # match得分(匹配+2)
-1, # mismatch罚分(错配-1)
-3, # gap open罚分(开gap-3)
-1 # gap extend罚分(延伸gap-1)
)
# 打印最优比对(可能有多个并列最优)
print("=== Biopython 全局比对结果 ===")
for align in alignments[:3]: # 只看前3个结果
print(format_alignment(*align)) # 格式化打印
# --- 示例3:用 Biopython 做 BLAST 搜索(在线) ---
from Bio.Blast import NCBIWWW, NCBIXML # NCBI BLAST接口
# 一条示例16S rRNA序列片段
query_seq = "AGAGTTTGATCCTGGCTCAGGATGAACGCTGGCGGCGTGCCTAATACATGCAAGTCGAGCGG"
# 提交到NCBI BLAST服务器(blastn搜索核酸库)
# 注意:这是在线搜索,需要网络,可能需要几分钟
print("正在提交BLAST搜索...")
result_handle = NCBIWWW.qblast(
"blastn", # 程序名:核酸搜核酸
"nt", # 数据库:nt(核酸总库)
query_seq, # 查询序列
expect=0.01 # E-value阈值
)
# 解析结果
blast_record = NCBIXML.read(result_handle) # 解析XML格式结果
print(f"\n找到 {len(blast_record.alignments)} 条比对结果")
# 打印前3条结果
for i, alignment in enumerate(blast_record.alignments[:3]):
hsp = alignment.hsps[0] # 取第一个HSP
print(f"\n--- 结果 {i+1} ---")
print(f"目标: {alignment.title[:80]}...") # 目标序列名称
print(f"得分: {hsp.score}") # 比对得分
print(f"E-value: {hsp.expect}") # E值
print(f"一致性: {hsp.identities}/{hsp.align_length} "
f"({hsp.identities/hsp.align_length*100:.1f}%)") # 一致性百分比
8. 面试怎么答¶
Q1:请解释全局比对和局部比对的区别,分别在什么场景使用?¶
全局比对(Needleman-Wunsch)是把两条序列从头到尾强制对齐,适合比较两个同源基因的完整序列,比如不同物种的同一个基因。局部比对(Smith-Waterman)只找两条序列中最相似的片段,适合在一条长序列中搜索是否包含某个功能域,或者两条序列只有部分区域相关的情况。核心算法区别是:局部比对的动态规划矩阵中负分归零,回溯从全局最高分开始到遇零停止。两者时间复杂度都是 O(mn)。
Q2:BLAST 的原理是什么?为什么比 Smith-Waterman 快?¶
BLAST 是一个启发式算法,核心是"种子-延伸"策略。首先把查询序列切成短词(DNA默认11mer,蛋白质默认3mer),在数据库中快速查找这些短词的精确匹配或近似匹配(种子阶段),然后从命中位置向两侧延伸形成 HSP。它比 Smith-Waterman 快的原因是:SW需要填满整个 O(mn) 的矩阵,而 BLAST 只在有种子命中的区域做延伸计算,大部分区域直接跳过了。代价是可能遗漏一些没有种子匹配的弱相似区域。
Q3:E-value 是什么?如何判断一个 BLAST 结果是否显著?¶
E-value 是期望值,表示在同等大小的随机数据库中偶然出现得分≥当前比对的次数期望。E-value 越小越显著:1e-50 几乎确定是同源;1e-5 到 1e-10 比较可靠;大于 0.01 就要谨慎了。需要注意 E-value 和数据库大小有关——同一条比对在更大的库中搜索 E-value 会更大(偶然匹配更多),所以不能跨数据库比较 E-value。
Q4:BWA/Bowtie2 为什么用 BWT 而不用 BLAST 来比对短reads?¶
场景根本不同。BLAST 设计目标是"几条序列搜大库",适合探索性搜索。NGS 比对是"几亿条短reads对一个固定参考基因组"。BWT+FM-index 的优势是:建一次索引后,每条 read 的搜索时间只和 read 长度相关(O(m)),与参考基因组大小无关。处理3000万条reads时,BWT方法只需几十分钟,而BLAST可能需要几天。另外BWT索引占用内存小(人类基因组约4-8GB),支持多线程并行。
Q5:minimap2 和 BWA-MEM 有什么区别?什么时候用哪个?¶
minimap2 使用 minimizer 做种子而非 BWT。minimizer 是滑动窗口内 hash 值最小的 k-mer,只需存储约 1/(w+1) 的 k-mer 就能覆盖全序列。minimap2 的优势是能容忍高错误率(三代测序),速度更快。BWA-MEM 精度更高,是二代测序标准流程(GATK 推荐)。选择规则:短读(Illumina)→ BWA-MEM/Bowtie2;长读(PacBio/Nanopore)→ minimap2;如果是 HiFi reads 两者都可以。
Q6:什么是仿射 gap 罚分?为什么比线性罚分更好?¶
仿射罚分区分"开gap"和"延伸gap"两个参数,开口罚分重(如-10),延伸罚分轻(如-1)。生物学依据是:一次 indel 事件通常影响连续多个碱基,所以一个长 gap 更可能是一次事件而非多次独立事件。如果用线性罚分(每个位置扣相同分),会倾向于产生很多分散的短 gap,不符合生物现实。
Q7:BLOSUM62 中的 62 代表什么?和 PAM250 有什么区别?¶
BLOSUM62 表示构建矩阵时,将一致性≥62% 的序列聚为一类来统计氨基酸替换频率。BLOSUM 数字越大对近缘序列越敏感,越小对远缘序列越敏感。PAM250 是 PAM1(1%突变率下的替换概率)自乘250次模拟的远距离进化矩阵。两者构建思路相反但都用于打分:BLOSUM 从"保守区块"直接统计;PAM 从"极近缘序列"外推。实际使用中 BLOSUM62 是 BLAST 默认,效果通常更好。
9. 速查表¶
算法→适用场景→时间复杂度 对照表¶
| 算法/方法 | 类型 | 适用场景 | 时间复杂度 | 空间复杂度 | 是否保证最优 |
|---|---|---|---|---|---|
| Needleman-Wunsch | 全局比对 | 同源基因端到端比较 | O(mn) | O(mn) | 是 |
| Smith-Waterman | 局部比对 | 搜索功能域/motif | O(mn) | O(mn) | 是(局部最优) |
| BLAST | 启发式局部 | 数据库搜索 | ~O(m) 平均 | — | 否 |
| BWT + FM-index | 短读精确匹配 | NGS reads比对参考 | O(m) 查询 | O(n) 索引 | 精确匹配是 |
| BWA-MEM | 短读/中读 | Illumina 比对 | O(m) + SW延伸 | ~4-8 GB | 启发式 |
| Bowtie2 | 短读 | 去宿主/ChIP-seq | O(m) + DP延伸 | ~3.2 GB | 启发式 |
| minimap2 | 长读/通用 | PacBio/Nanopore | O(n log n) 链 | ~6.5 GB | 启发式 |
| ClustalW/Omega | 多序列渐进 | 建树/保守分析 | O(N²·L²) | — | 否 |
| MUSCLE | 多序列迭代 | 精确MSA | O(N²·L) | — | 否 |
| MAFFT | 多序列FFT | 大规模MSA | O(N²·L) ~ O(N·L·log L) | — | 否 |
注:m=查询长度, n=参考/数据库长度, N=序列条数, L=序列平均长度
常用打分方案速查¶
| 场景 | 推荐打分矩阵/方案 |
|---|---|
| DNA一般比对 | match=+1, mismatch=-1, gap=-2 |
| BLAST DNA默认 | match=+2, mismatch=-3, gap open=-5, gap ext=-2 |
| 蛋白质一般搜索 | BLOSUM62 + gap open=-11, gap ext=-1 |
| 近缘蛋白比较 | BLOSUM80 |
| 远缘蛋白搜索 | BLOSUM45 或 PAM250 |
工具选择决策树¶
测序数据是什么类型?
├── Illumina 短读(100-300bp)
│ ├── 比对到参考基因组 → BWA-MEM2 / Bowtie2
│ ├── RNA-seq → HISAT2 / STAR(剪接比对)
│ └── 去宿主 → Bowtie2(--un-conc 参数方便)
├── PacBio / Nanopore 长读(>1kb)
│ └── minimap2(-ax map-pb / map-ont)
├── 蛋白质/基因搜索数据库
│ └── BLAST(blastp/blastn/blastx)
└── 多条序列对齐
├── <200条 → MUSCLE / MAFFT
└── >200条 → MAFFT(速度优势)
10. 延伸资源¶
经典论文¶
- Needleman, S.B. & Wunsch, C.D. (1970). A general method applicable to the search for similarities in the amino acid sequence of two proteins. J Mol Biol, 48:443-453.
- Smith, T.F. & Waterman, M.S. (1981). Identification of common molecular subsequences. J Mol Biol, 147:195-197.
- Altschul, S.F. et al. (1990). Basic local alignment search tool. J Mol Biol, 215:403-410.
- Li, H. & Durbin, R. (2009). Fast and accurate short read alignment with Burrows-Wheeler transform. Bioinformatics, 25:1754-1760.
- Li, H. (2018). Minimap2: pairwise alignment for nucleotide sequences. Bioinformatics, 34:3094-3100.
- Ferragina, P. & Manzini, G. (2000). Opportunistic data structures with applications. FOCS 2000. (FM-index原始论文)
在线学习¶
- NCBI BLAST教程:https://blast.ncbi.nlm.nih.gov/doc/blast-help/
- Rosalind 生信编程练习:http://rosalind.info/problems/locations/(有全局/局部比对编程题)
- Ben Langmead BWT讲解视频(Johns Hopkins大学):搜索 "Ben Langmead BWT YouTube"
与本知识库其他文档的关系¶
- 14_比对与组装工具.md:讲工具的具体使用命令和参数(HOW),本文讲底层算法原理(WHY)
- 13_测序技术原理.md:理解不同测序平台产出的 reads 特征,有助于选择合适的比对算法
- 01_宏基因组全流程.md:比对是全流程中"去宿主"和"定量"步骤的核心技术