BLAST 基础:算法原理与核心参数详解

做生信的人,几乎每天都和 BLAST 打交道。但说句实话,很多人只是把序列丢进去,点一下运行,拿结果走人。

这套流程我也走了好几年。直到有一次,我在做细菌基因组注释时,发现 BLAST 出来的最佳 hit 跟实验验证完全对不上……嗯,从那以后我才老老实实把 BLAST 的原理和参数啃了一遍。

这一章,我带你从算法本质到关键参数,把 BLAST 拆开看明白。

BLAST 的核心思想:找一个好种子,再慢慢长大

BLAST 的全称是 Basic Local Alignment Search Tool。名字里有两个关键词:Local(局部)和 Search(搜索)。

它不关心两条序列从头到尾整整齐齐地对齐,它只找那些局部相似的片段——也就是所谓的 high-scoring segment pairs (HSPs)。

那么 BLAST 是怎么找的?说白了就是三步:

  1. 把查询序列切成小片段(种子)——比如每 3 个氨基酸或 11 个碱基切一段。
  2. 用这些小片段去数据库里“撞”——找到完全匹配或高度相似的片段。
  3. 把匹配上的片段往两边延伸——直到分数不再增加为止。

这个策略叫 seed-and-extend。你想想看,如果每次都把整条序列跟数据库里的每条序列做动态规划对齐,那计算量大到不可接受。BLAST 的精妙之处就在于先用小种子快速过滤掉大量不相关的序列,只有种子匹配上的区域才去精细比对。

一句话总结 BLAST 算法的本质:

用短序列种子做索引,牺牲一点点灵敏度,换取数量级的速度提升。

BLAST seed-and-extend 核心流程 Query Sequence Decompose into Seeds Seed in Database Extend Alignment Final Alignment / HSP Filter:快速排除不相关序列 Score:只在种子匹配区域精细打分

核心参数详解:你每天都在调,但你真的懂吗?

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,可以省去很多后处理的时间。