BLAST 基础:算法原理与核心参数详解
做生信的人,几乎每天都和 BLAST 打交道。但说句实话,很多人只是把序列丢进去,点一下运行,拿结果走人。
这套流程我也走了好几年。直到有一次,我在做细菌基因组注释时,发现 BLAST 出来的最佳 hit 跟实验验证完全对不上……嗯,从那以后我才老老实实把 BLAST 的原理和参数啃了一遍。
这一章,我带你从算法本质到关键参数,把 BLAST 拆开看明白。
BLAST 的核心思想:找一个好种子,再慢慢长大
BLAST 的全称是 Basic Local Alignment Search Tool。名字里有两个关键词:Local(局部)和 Search(搜索)。
它不关心两条序列从头到尾整整齐齐地对齐,它只找那些局部相似的片段——也就是所谓的 high-scoring segment pairs (HSPs)。
那么 BLAST 是怎么找的?说白了就是三步:
- 把查询序列切成小片段(种子)——比如每 3 个氨基酸或 11 个碱基切一段。
- 用这些小片段去数据库里“撞”——找到完全匹配或高度相似的片段。
- 把匹配上的片段往两边延伸——直到分数不再增加为止。
这个策略叫 seed-and-extend。你想想看,如果每次都把整条序列跟数据库里的每条序列做动态规划对齐,那计算量大到不可接受。BLAST 的精妙之处就在于先用小种子快速过滤掉大量不相关的序列,只有种子匹配上的区域才去精细比对。
一句话总结 BLAST 算法的本质:
用短序列种子做索引,牺牲一点点灵敏度,换取数量级的速度提升。
核心参数详解:你每天都在调,但你真的懂吗?
BLAST 的命令行参数有几十个,但真正影响结果的,其实没几个。我习惯把它们分成三类:灵敏度相关、打分相关、输出控制相关。
1. 灵敏度相关参数
| 参数 | 作用 | 我的建议 |
|---|---|---|
| -word_size | 种子长度。值越小,越敏感,但越慢 | 默认 11 (nucl) / 3 (prot);我常用 -word_size 7 做高灵敏度搜索 |
| -evalue | 期望阈值。越小越严格 | 默认 10;我一般设 1e-5,转录组上看蛋白用 1e-10 |
| -max_target_seqs | 最多返回多少条结果 | 默认 500;但实际分析时设 100 就够了,多了噪声太大 |
我曾经犯过的错:把 -word_size 设成 5 做 DNA 比对,跑了两天没跑完……后来才意识到,word_size 越小,种子数量指数级增长,运算量翻好几倍。
2. 打分相关参数
| 参数 | 含义 | 典型值 |
|---|---|---|
| -matrix | 替代矩阵(蛋白质用 BLOSUM/PAM) | BLOSUM62(默认) |
| -gapopen | 空位开放罚分 | 11 (nucl) / 11 (prot) |
| -gapextend | 空位延伸罚分 | 1 (nucl) / 1 (prot) |
这里有个坑。BLOSUM62 矩阵适用于 62% 以上相似度的序列比对。如果你在做远源同源搜索(比如跨物种找直系同源),用 BLOSUM45 或 BLOSUM30 会更灵敏。
我记得有一次做真菌和植物的同源比对,默认 BLOSUM62 一个 hit 都没找到。换成 BLOSUM45 后,出来三十多个。
小技巧:在做蛋白 blastp 时,如果预期序列相似度低于 30%,试试 -matrix BLOSUM45 -gapopen 14 -gapextend 2。这套组合我在多个项目中验证过,灵敏度提升很明显。
3. 输出控制参数
BLAST 支持多种输出格式。现在最常用的是表格格式(-outfmt 6)和 XML 格式(-outfmt 5)。
# 常用输出格式示例
blastn -query myseq.fa -db nt -outfmt 6 -out result.txt
blastp -query query.faa -db swissprot -outfmt "6 qseqid sseqid pident length mismatch gapopen qstart qend sstart send evalue bitscore" -out custom_result.txt
我习惯用自定义列的输出格式,把 e-value 和 bitscore 排在前面,这样查看结果时可以快速筛掉低质量比对。
e-value 和 bitscore:两个最容易被误解的指标
我刚学生信的时候,一度以为 e-value 越小越好,bitscore 越大越好——这个理解没错,但不够深入。
- e-value:在随机数据库中,预期出现的匹配数。e-value 1e-5 的意思是:如果数据库是随机的,每 10 万次搜索才会出现一次这样的匹配。
- bitscore:基于打分矩阵的对数变换分数,与数据库大小无关。所以 bitscore 更适合在不同数据库间横向比较。
举个栗子:你在两个不同规模的数据库里搜同一条序列。e-value 会因为数据库大小而不同,但 bitscore 是稳定的。所以,如果要在不同数据库之间做比对结果的一致性检查,请用 bitscore,别用 e-value。
一致性检查中的实用原则:
当我们说“两组 BLAST 结果一致”时,比较的是 bitscore 的变化幅度,而不是 e-value 的数量级。
关于 BLAST 版本的冷知识
现在大多数人使用的是 NCBI BLAST+(发布在 2009 年之后)。老版本的 legacy BLAST 已被淘汰。如果你还在用 blastall 命令,我建议你趁早迁移:
# 旧版(legacy BLAST)
blastall -p blastp -i query.faa -d nr -o old_result.txt
# 新版(BLAST+)
blastp -query query.faa -db nr -out new_result.txt
新版不仅速度快,参数命名也更规范,而且 -outfmt 支持更多灵活性。
小结:这一章的核心你要记住
- BLAST 的原理是 seed-and-extend,用短种子快速过滤,再局部精细比对。
- word_size 控制灵敏度,e-value 控制严格度,bitscore 是跨数据库的可比指标。
- 矩阵和空位罚分会影响远源同源的检出率,遇到相似度低的比对别死用默认值。
- 输出格式灵活用好 -outfmt 6,可以省去很多后处理的时间。