重叠检测算法
重叠检测是长读长组装的核心步骤:从海量 reads 中高效识别可能拼接的 read 对。其核心挑战是将 O(n²) 的全对全比较降维到近线性复杂度。
- 全对全比对对于百万级 reads 计算不可行,必须采用降维策略
- Minimap 的 minimizer 采样通过选取代表性 k-mer 构建索引
- MHAP 的 MinHash 通过概率估计快速筛选候选
- 两类方法都基于"共享特征暗示重叠"的核心思想
问题引入:组合爆炸的困境
Section titled “问题引入:组合爆炸的困境”考虑一个简单的组装场景:
某细菌基因组大小 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)。
因此,我们可以通过以下步骤降维:
- 特征提取:从每条 read 中提取代表性特征(如 k-mers)
- 索引构建:建立特征到 reads 的倒排索引
- 候选生成:共享足够多特征的 read 对进入候选集
- 精确验证:仅对候选对进行详细比对确认
这种方法将复杂度从 O(n²) 降低到 O(n × f),其中 f 是特征提取和索引查询的代价。
设 reads 集合为 ,每条 read 是长度为 的字符串。
重叠定义:read 和 存在有效重叠,当满足:
- 重叠长度:(如 1 kb)
- 序列相似度:(如 85%)
- 方向:同向或反向互补
直接枚举所有 read 对的时间复杂度为 。对于人类基因组规模(~100万条 reads),这完全不可行。
现代算法的核心是将问题分解为:
其中候选生成阶段的目标是高敏感性(不漏掉真实重叠),精确验证阶段的目标是高特异性(过滤假阳性)。
Minimap:Minimizer 采样策略
Section titled “Minimap:Minimizer 采样策略”Minimap 的核心洞察是:不需要索引所有 k-mers,只需索引具有代表性的子集。
考虑一个序列窗口:如果我们知道窗口内”最小”(哈希值最小)的 k-mer,这个 k-mer 相对稳定——当序列发生小的突变时,最小 k-mer 改变的概率较低。
Minimizer 定义
Section titled “Minimizer 定义”给定序列 、窗口大小 和 k-mer 大小 ,minimizer 是窗口内哈希值最小的 k-mer:
关键性质:
- 相邻窗口往往共享相同的 minimizer,因此 minimizer 密度约为
- 窗口大小 控制采样密度:大 产生更少 minimizers
- 反向互补序列的 minimizers 一致,便于处理 DNA 双链
-
索引构建:
- 对每条 read 提取所有 minimizers
- 构建倒排索引:minimizer → [(read_id, position), …]
-
候选识别:
- 查询 read 的 minimizers
- 共享足够多 minimizers 的 read 对进入候选
-
共线性检查:
- 候选 read 对的 minimizer 位置应呈线性关系(斜率一致)
- 过滤随机共享的 minimizers
-
精确验证:
- 对通过检查的候选进行局部动态规划比对
- 确认重叠长度和相似度满足阈值
MHAP:MinHash 概率估计策略
Section titled “MHAP:MinHash 概率估计策略”MHAP 使用 MinHash 技术,通过概率估计快速比较集合相似度。
Jaccard 相似度
Section titled “Jaccard 相似度”对于两个 k-mer 集合 和 ,Jaccard 相似度定义为:
该指标度量集合的重叠程度: 表示完全相同, 表示无共享元素。
MinHash 原理
Section titled “MinHash 原理”直接计算 Jaccard 相似度需要知道完整的集合交集和并集,代价高昂。MinHash 提供了一种概率估计方法:
- 对集合中每个元素计算哈希值
- 选择最小的 个哈希值作为集合的签名
- 两个签名中共享的最小哈希值比例近似 Jaccard 相似度:
数学保证: 是 的无偏估计,方差随 增大而减小。
- 签名生成:每条 read 的所有 k-mers 计算哈希,保留最小的 个
- 候选筛选:签名相似度超过阈值的 read 对进入候选集
- 精确验证:对候选进行局部比对确认重叠
Minimap vs MHAP
Section titled “Minimap vs MHAP”| 维度 | Minimap | MHAP |
|---|---|---|
| 核心方法 | 空间采样(minimizer) | 概率估计(MinHash) |
| 索引大小 | 较小(~2N/w) | 中等(N×h) |
| 敏感性 | 高(保留局部结构) | 可调(通过 h 控制) |
| 速度 | 极快 | 快 |
| 适用场景 | 一般组装 | 极高错误率数据 |
Minimap
Section titled “Minimap”时间复杂度:
- Minimizer 提取:,N 为 read 数,L 为平均长度
- 索引构建:, 为窗口大小
- 候选识别:, 为 minimizer 数, 为平均倒排列表长度
- 精确验证:, 为候选对数
总时间复杂度:。在实际情况中,,因此接近线性。
空间复杂度:
- 存储 minimizers:
- 倒排索引:
总空间复杂度:,约为序列总大小的 。
时间复杂度:
- 签名生成:, 为 k-mer 大小
- 候选筛选:, 为签名大小
- 精确验证:
总时间复杂度:
空间复杂度:
- 存储签名:
总空间复杂度:
Minimap 示例
Section titled “Minimap 示例”考虑两条 reads:
- r₁ =
ACGTACGTACGT(长度 12) - r₂ =
CGTACGTACGTA(长度 12)
参数:k = 3, w = 5
步骤 1:提取 minimizers
Section titled “步骤 1:提取 minimizers”对于 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)]
步骤 2:共享 minimizer 检测
Section titled “步骤 2:共享 minimizer 检测”r₁ 和 r₂ 共享 minimizer CGT,因此是候选对。
步骤 3:共线性检查
Section titled “步骤 3:共线性检查”共享 minimizer 位置:
- r₁: [1, 4, 5, 6, 7]
- r₂: [0, 3, 4, 5, 6]
计算斜率:位置差大致为 1,呈线性关系,通过检查。
步骤 4:精确比对
Section titled “步骤 4:精确比对”进行局部比对:
r₁: ACGTACGTACGTr₂: CGTACGTACGTA比对结果:
- 重叠长度:11
- 匹配数:10
- 相似度:10/11 ≈ 90.9%
如果 L_min = 10, S_min = 90%,则保留该重叠。
与真实工具或流程的连接
Section titled “与真实工具或流程的连接”Minimap2
Section titled “Minimap2”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.