跳转到内容

重叠检测算法

快速概览

重叠检测是长读长组装的核心步骤:从海量 reads 中高效识别可能拼接的 read 对。其核心挑战是将 O(n²) 的全对全比较降维到近线性复杂度。

  • 全对全比对对于百万级 reads 计算不可行,必须采用降维策略
  • Minimap 的 minimizer 采样通过选取代表性 k-mer 构建索引
  • MHAP 的 MinHash 通过概率估计快速筛选候选
  • 两类方法都基于"共享特征暗示重叠"的核心思想
所属板块 分析方向与案例

把基础对象与算法方法重新放回真实分析任务与工作流。

阅读目标 帮助建立阅读上下文

先判断这页与你当前问题的关系,再决定是否深入展开。

建议前置 先建立相关基础对象与方法直觉

建议先建立相关基础对象与方法直觉,再进入本页。

考虑一个简单的组装场景:

某细菌基因组大小 5 Mb,测序深度 50×,平均读长 10 kb。 需要的 reads 数量:N = (5M × 50) / 10k = 25,000 条

如果进行全对全比对以寻找重叠:

  • 比较次数:N × (N-1) / 2 ≈ 3.12 亿次
  • 每次比对(Smith-Waterman):O(L²),L = 10 kb

这在计算上是不可行的。因此,我们需要一种方法,在不进行显式比对的情况下,快速识别可能重叠的 read 对

核心思想:从特征共享到候选筛选

Section titled “核心思想:从特征共享到候选筛选”

重叠检测算法基于一个关键观察:

如果两条 reads 存在显著重叠,它们必然共享大量相同的短序列片段(k-mers)。

因此,我们可以通过以下步骤降维:

  1. 特征提取:从每条 read 中提取代表性特征(如 k-mers)
  2. 索引构建:建立特征到 reads 的倒排索引
  3. 候选生成:共享足够多特征的 read 对进入候选集
  4. 精确验证:仅对候选对进行详细比对确认

这种方法将复杂度从 O(n²) 降低到 O(n × f),其中 f 是特征提取和索引查询的代价。

设 reads 集合为 R={r1,r2,,rn}R = \{r_1, r_2, \ldots, r_n\},每条 read rir_i 是长度为 LiL_i 的字符串。

重叠定义:read rir_irjr_j 存在有效重叠,当满足:

  1. 重叠长度overlap(ri,rj)Lmin|overlap(r_i, r_j)| \geq L_{\min}(如 1 kb)
  2. 序列相似度sim(ri,rj)Sminsim(r_i, r_j) \geq S_{\min}(如 85%)
  3. 方向:同向或反向互补

直接枚举所有 read 对的时间复杂度为 O(n2L2)O(n^2 \cdot L^2)。对于人类基因组规模(~100万条 reads),这完全不可行。

现代算法的核心是将问题分解为:

重叠检测=候选生成(粗筛)+精确验证(精筛)\text{重叠检测} = \text{候选生成(粗筛)} + \text{精确验证(精筛)}

其中候选生成阶段的目标是高敏感性(不漏掉真实重叠),精确验证阶段的目标是高特异性(过滤假阳性)。

Minimap 的核心洞察是:不需要索引所有 k-mers,只需索引具有代表性的子集

考虑一个序列窗口:如果我们知道窗口内”最小”(哈希值最小)的 k-mer,这个 k-mer 相对稳定——当序列发生小的突变时,最小 k-mer 改变的概率较低。

给定序列 SS、窗口大小 ww 和 k-mer 大小 kkminimizer 是窗口内哈希值最小的 k-mer:

minimizer(S[i:i+w])=argminj[i,i+wk+1]hash(S[j:j+k])\text{minimizer}(S[i:i+w]) = \arg\min_{j \in [i, i+w-k+1]} \text{hash}(S[j:j+k])

关键性质

  • 相邻窗口往往共享相同的 minimizer,因此 minimizer 密度约为 2/(w+1)2/(w+1)
  • 窗口大小 ww 控制采样密度:大 ww 产生更少 minimizers
  • 反向互补序列的 minimizers 一致,便于处理 DNA 双链
  1. 索引构建

    • 对每条 read 提取所有 minimizers
    • 构建倒排索引:minimizer → [(read_id, position), …]
  2. 候选识别

    • 查询 read 的 minimizers
    • 共享足够多 minimizers 的 read 对进入候选
  3. 共线性检查

    • 候选 read 对的 minimizer 位置应呈线性关系(斜率一致)
    • 过滤随机共享的 minimizers
  4. 精确验证

    • 对通过检查的候选进行局部动态规划比对
    • 确认重叠长度和相似度满足阈值

MHAP 使用 MinHash 技术,通过概率估计快速比较集合相似度。

对于两个 k-mer 集合 AABBJaccard 相似度定义为:

J(A,B)=ABABJ(A, B) = \frac{|A \cap B|}{|A \cup B|}

该指标度量集合的重叠程度:J=1J = 1 表示完全相同,J=0J = 0 表示无共享元素。

直接计算 Jaccard 相似度需要知道完整的集合交集和并集,代价高昂。MinHash 提供了一种概率估计方法:

  1. 对集合中每个元素计算哈希值
  2. 选择最小的 hh 个哈希值作为集合的签名
  3. 两个签名中共享的最小哈希值比例近似 Jaccard 相似度:
J^(A,B)signature(A)signature(B)h\hat{J}(A, B) \approx \frac{|\text{signature}(A) \cap \text{signature}(B)|}{h}

数学保证J^\hat{J}JJ 的无偏估计,方差随 hh 增大而减小。

  1. 签名生成:每条 read 的所有 k-mers 计算哈希,保留最小的 hh
  2. 候选筛选:签名相似度超过阈值的 read 对进入候选集
  3. 精确验证:对候选进行局部比对确认重叠
维度 Minimap MHAP
核心方法 空间采样(minimizer) 概率估计(MinHash)
索引大小 较小(~2N/w) 中等(N×h)
敏感性 高(保留局部结构) 可调(通过 h 控制)
速度 极快
适用场景 一般组装 极高错误率数据

时间复杂度

  • Minimizer 提取:O(NL)O(N \cdot L),N 为 read 数,L 为平均长度
  • 索引构建:O(NL/w)O(N \cdot L/w)ww 为窗口大小
  • 候选识别:O(Md)O(M \cdot d)MM 为 minimizer 数,dd 为平均倒排列表长度
  • 精确验证:O(CL)O(C \cdot L)CC 为候选对数

总时间复杂度:O(NL+CL)O(N \cdot L + C \cdot L)。在实际情况中,CN2C \ll N^2,因此接近线性。

空间复杂度

  • 存储 minimizers:O(NL/w)O(N \cdot L/w)
  • 倒排索引:O(NL/w)O(N \cdot L/w)

总空间复杂度:O(NL/w)O(N \cdot L/w),约为序列总大小的 1/w1/w

时间复杂度

  • 签名生成:O(NLk)O(N \cdot L \cdot k)kk 为 k-mer 大小
  • 候选筛选:O(NhlogN)O(N \cdot h \cdot \log N)hh 为签名大小
  • 精确验证:O(CL)O(C \cdot L)

总时间复杂度:O(NLk+CL)O(N \cdot L \cdot k + C \cdot L)

空间复杂度

  • 存储签名:O(Nh)O(N \cdot h)

总空间复杂度:O(Nh)O(N \cdot h)

考虑两条 reads:

  • r₁ = ACGTACGTACGT(长度 12)
  • r₂ = CGTACGTACGTA(长度 12)

参数:k = 3, w = 5

对于 r₁:

窗口和对应的 k-mers:

  • 窗口 [0:5] = ACGTA:k-mers 为 ACG, CGT, GTA, TAC

    • hash(ACG) = 100, hash(CGT) = 50, hash(GTA) = 80, hash(TAC) = 120
    • minimizer = CGT(hash=50),位置 1
  • 窗口 [1:6] = CGTAC:k-mers 为 CGT, GTA, TAC, ACG

    • hash(CGT) = 50, hash(GTA) = 80, hash(TAC) = 120, hash(ACG) = 100
    • minimizer = CGT(hash=50),位置 1
  • 窗口 [2:7] = GTACG:k-mers 为 GTA, TAC, ACG, CGT

    • hash(GTA) = 80, hash(TAC) = 120, hash(ACG) = 100, hash(CGT) = 50
    • minimizer = CGT(hash=50),位置 4
  • 窗口 [3:8] = TACGT:k-mers 为 TAC, ACG, CGT, GTA

    • hash(TAC) = 120, hash(ACG) = 100, hash(CGT) = 50, hash(GTA) = 80
    • minimizer = CGT(hash=50),位置 5
  • 窗口 [4:9] = ACGTA:同窗口 0

    • minimizer = CGT(hash=50),位置 5
  • 窗口 [5:10] = CGTAC:同窗口 1

    • minimizer = CGT(hash=50),位置 6
  • 窗口 [6:11] = GTACG:同窗口 2

    • minimizer = CGT(hash=50),位置 7

r₁ 的 minimizers(去重后):[(CGT, 1), (CGT, 4), (CGT, 5), (CGT, 6), (CGT, 7)]

对于 r₂(类似分析): r₂ 的 minimizers:[(CGT, 0), (CGT, 3), (CGT, 4), (CGT, 5), (CGT, 6)]

r₁ 和 r₂ 共享 minimizer CGT,因此是候选对。

共享 minimizer 位置:

  • r₁: [1, 4, 5, 6, 7]
  • r₂: [0, 3, 4, 5, 6]

计算斜率:位置差大致为 1,呈线性关系,通过检查。

进行局部比对:

r₁: ACGTACGTACGT
r₂: CGTACGTACGTA

比对结果:

  • 重叠长度:11
  • 匹配数:10
  • 相似度:10/11 ≈ 90.9%

如果 L_min = 10, S_min = 90%,则保留该重叠。

Minimap2 是当前最流行的长读长比对工具,它扩展了原始 Minimap:

  • 多种模式:mapping、overlap、assembly
  • 种子策略:支持 minimizer 和其他索引
  • 链式比对:高效的 seed-chain-align 流程
  • 适配性:自动调整参数适应不同数据类型
  • Canu 组装器:使用 Minimap 进行重叠检测
  • Flye 组装器:使用 Minimap 进行 read 比对
  • 纠错工具:Racon、Medaka 等依赖 Minimap 的重叠信息
  • SV 检测:Sniffles2 等使用 Minimap2 进行 read 比对
  • 分布式索引:将 reads 分片,并行构建索引
  • GPU 加速:利用 GPU 并行计算 minimizer 哈希
  • 多线程验证:并行进行候选对的精确比对
  • 压缩索引:使用压缩编码存储 minimizer
  • 分批处理:将大数据集分批处理
  • 磁盘溢出:当内存不足时使用磁盘存储部分索引
  • 自适应窗口:根据 GC 含量调整窗口大小
  • 质量过滤:先过滤低质量 reads 减少计算量
  • 层级筛选:多级阈值逐步筛选候选
  • Li, H. (2018). Minimap2: pairwise alignment for nucleotide sequences. Bioinformatics, 34(18), 3094-3100.
  • Berlin, K., et al. (2015). Assembling large genomes with single-molecule sequencing and locality-sensitive hashing. Nature biotechnology, 33(6), 623-630.
  • Roberts, M., et al. (2004). Reducing storage requirements for biological sequence comparison. Bioinformatics, 20(18), 3363-3369.