从四分体到系统发育树:方法与算法解析
在生物进化研究中,构建准确的系统发育树对于理解物种间的进化关系至关重要。基于四分体的系统发育树重建方法是其中一种重要的途径,下面将详细介绍该方法的相关概念、问题描述、复杂度分析以及具体算法。
1. 四分体与系统发育树基础概念
四分体可以看作是将四个分类单元划分为两对分类单元的一种方式,例如将分类单元集合 ${a, b, c, d}$ 划分为 ${a, b}$ 和 ${c, d}$,这样的划分表示为 $ab|cd$。在确定了四分体列表后,基于四分体的重建目标是找到一棵系统发育树,使得“满足的四分体”数量最大化。从组合学角度来看,如果所有的 $\binom{n}{4}$ 个四分体都具有正确的拓扑结构,那么底层的树是唯一确定的,并且可以高效构建。但在实际情况中,由于存在误差,可能不存在与所有给定四分体都一致的树。
2. 问题描述与复杂度
2.1 问题定义
问题定义在一组编号为 $1, \cdots, n$ 的 $n$ 个分类单元上,输入包含一组 $k$ 个四分体,第 $j$ 个四分体的相关分类单元和划分表示为 $a_j|b_j|c_j|d_j$,且任意两个四分体不共享相同的四个分类单元。每个输入四分体都伴有一个正权重 $C_j$,表示对该四分体拓扑结构的置信度。
置信度值的计算通常使用自助法(Bootstrap)。具体步骤如下:
1. 独立且有放回地选择原始序列的随机位置,生成与原始长度相等的序列。
2. 对于每次重采样,计算一棵系统发育树。
3. 自助法值等于这些重建结果中产生原始四分体拓扑结构的比例(该值可能低于 $1/3$)。
2.2 规格说明
基于四分体的重建问题的输出是一棵具有 $n$ 个叶子的无根树,叶子由输入的分类单元标记。给定一棵树 $T$ 和一个四元组 ${a, b, c, d}$,可以通过以下步骤计算 $T$ 诱导的四分体拓扑结构:
1. 从树中删除除 $a, b, c$ 和 $d$ 之外的所有叶子。
2. 移除与这些删除叶子相邻的边。
3. 收缩并删除度数为 2 的内部节点,使它们的两个相邻节点相连。
4. 重复此过程,直到没有度数为 2 的内部节点为止。
四元组有四种可能的诱导拓扑结构:三个四分体和星型拓扑(仅由多叉树诱导)。如果树在四个分类单元上诱导出星型拓扑,则称该四分体未解决;否则,四分体要么被满足(如果树诱导的拓扑结构等于四分体的拓扑结构),要么被违反。
树的得分定义为:
[score_Q(T) = \sum_{s \in S} C_s + \frac{1}{3} \sum_{u \in U} C_u]
其中,$S$ 是被树 $T$ 满足的四分体子集,$U$ 是未解决的四分体子集。基于此,基于四分体的重建问题定义为:给定一组四分体 $Q$ 及其相关的置信度得分,找到一棵树 $T$,使得 $score_Q(T)$ 最大化。
2.3 复杂度分析
如果给定 $n$ 个分类单元的所有 $\binom{n}{4}$ 个四分体的完整列表,很容易检查是否存在满足所有四分体的二叉树,并在存在时构建这棵唯一的树。但当给定 $k \leq \binom{n}{4}$ 个四分体时,“是否存在满足所有四分体的树”这一决策问题是 NP 完全的。对于加权四分体列表,最大化树的得分是 NP 难的,甚至是 MAX SNP 完全的。这意味着存在一个绝对常数 $\epsilon > 0$,使得找到得分至少为最大得分的 $1 - \epsilon$ 的树是 NP 难的。
NP 完全性和困难性结果表明,找到多项式时间算法的希望渺茫。但这些结果是渐近的,适用于“最坏情况”的输入实例。在实际的系统发育树重建中,较小的 $n$ 值(如 $15$ 到 $24$)仍然具有生物学意义,此时“温和”的指数时间算法可能具有实际价值。此外,由于可用序列数据中的误差具有随机性,高效的启发式算法可能在接近最优解方面有效。
简单的穷举搜索方法即使对于中等大小的 $n$ 值(如 $n = 15$)也不可行。具有 $n$ 个叶子的无根二叉树的数量为 $\frac{(2n - 5)!}{2^{n - 3}(n - 3)!}$,当 $n = 15$ 时,此类树的数量接近 $8 \times 10^{12}$,而完整列表的四分体数量约为 $1300$。因此,对每棵树遍历所有四分体的算法将需要超过 $10^{16}$ 步,这在当代合理的机器上是不可行的任务。
2.4 树的生根
系统发育重建的目标是构建一棵最能代表进化过程的树,为了理解事件发生的先后顺序,树应该生根。但基于四分体的重建输入是无根的四分体列表,因此需要一些辅助信息来生根树。这个辅助信息是 $n$ 个分类单元中的外群标识。外群是一个不属于其他分类单元同一类别的外部分类单元。如果外群的识别正确,那么该分类单元是最早从其余分类单元中分化出来的。首先根据优化标准生成一棵无根树,然后通过强制外群成为根的直接后代来生根树。
3. 算法介绍
已发表的四分体方法包括 Buneman 树、短四分体方法、邻接法变体和四分体拼图法等。下面详细介绍三种方法:四分体拼图法、几何启发式方法和精确算法。
3.1 四分体拼图法
四分体拼图法采用一种简单的贪心过程(称为“拼图步骤”)将四分体组合成二叉树。为避免陷入局部陷阱,该拼图步骤会多次重复,每次重复时随机排列分类单元的顺序。最后,通过“多数共识”将多个结果树组合成一棵树(可能是多叉树)。
贪心过程的具体步骤如下:
1. 假设分类单元的随机顺序为 $a, b, c, d, e, f, \cdots$,$a, b, c, d$ 的四分体拓扑结构作为树的“锚点”。
2. 为锚点的五条边分别关联一个计数器,并将所有计数器初始化为 0。
3. 检查下一个分类单元 $e$,它应通过从现有边分支的方式添加到当前树中。
4. 假设 $i|j|k|e$ 是输入中的一个四分体,且 $i, j$ 和 $k$ 在随机顺序中先于 $e$,则这三个分类单元已作为叶子出现在当前树中。考虑树中 $i - j$、$i - k$ 和 $j - k$ 三条路径相交的内部节点 $O$,删除 $O$ 会将树分成三个不相交的子树。为不违反 $i|j|k|e$ 四分体,$e$ 应从包含 $k$ 的子树中的某条边分支。从“$i$ 子树”或“$j$ 子树”的边分支会违反该四分体,此时将这两个子树中每条边的计数器加 1。
5. 对涉及 $e$ 的其他此类四分体重复上述过程。
6. 当前步骤结束时,当前树中每条边的计数器包含一个非负整数,表示如果 $e$ 从该边分支将违反的涉及 $e$ 的四分体数量。选择计数器值最小的边(如果有多个这样的边,则随机选择一个)。
7. 将 $e$ 添加到树中后,$e$ 相对于先前分类单元的位置不再改变。然后将所有计数器归零,检查下一个分类单元 $f$。
8. 重复此贪心过程,直到所有 $n$ 个分类单元都被检查并放置。
拼图步骤和多数共识都非常高效,因此四分体拼图法是一种快速的启发式方法,有良好的报告结果。原始的四分体拼图算法需要所有 $\binom{n}{4}$ 个四分体的非加权输入,但如果通过违反四分体的权重更新违反边的计数器,也可以处理加权输入。
3.2 几何启发式方法
几何启发式方法是一种“全局”方法,将每个分类单元分配到 $\mathbb{R}^n$ 中单位球边界上的一个点。嵌入过程利用输入集的“提示”构建,例如,如果列表中有四分体 $ab|cd$,则尝试将 $a$ 和 $b$ 放置得彼此靠近,而 $a$ 和 $d$ 放置得较远。一旦点嵌入到 $\mathbb{R}^n$ 中,使用聚类启发式方法将嵌入转换为树。
-
半定规划(SDP) :SDP 在组合优化和许多近似算法中起着重要作用。可以使用 SDP 高效地解决(具有任意所需精度)以下形式的优化问题:
[
\begin{align }
&\text{Find } n \text{ vectors } v_1, \cdots, v_n \in \mathbb{R}^n \text{ so as to maximize the quantity } \sum_{i,j} c_{ij} \langle v_i, v_j \rangle\
&\text{subject to the constraints } \sum_{i,j} a_{ij}^{(k)} \langle v_i, v_j \rangle \leq b^{(k)}
\end{align }
]
其中 $c_{ij}, a_{ij}^{(k)}, b^{(k)}$ 是实数。将使用这种 SDP 形式来找到表示 $n$ 个分类单元的 $n$ 个点的嵌入。 -
分类单元的几何嵌入 :给定 $k$ 个四分体 $a_j|b_j|c_j|d_j$ 和置信度值 $C_j$($j = 1, \cdots, k$),求解以下半定规划问题:
[
\begin{align }
&\text{maximize: } \sum_{1 \leq j \leq k} C_j (\langle a_j, b_j \rangle + \langle c_j, d_j \rangle) - 0.5 \sum_{1 \leq j \leq k} C_j (\langle a_j, c_j \rangle + \langle a_j, d_j \rangle + \langle b_j, c_j \rangle + \langle b_j, d_j \rangle)\
&\text{subject to } \langle v_i, v_i \rangle = 1 \quad (1 \leq i \leq n)
\end{align }
]
$n$ 个约束条件将点 $v_i$ 强制到单位球的边界上。四分体的输入被纳入目标函数,该函数将许多局部要求合并为一个表达式。通过实验发现,忽略目标函数中置信度较低的四分体以及施加额外约束可以改善最终结果。 -
几何聚类 :解决 SDP 问题后,使用简单的聚类启发式方法找到反映几何数据的树。具体步骤如下:
1. 初始化程序,将 $n$ 个点分别作为 $n$ 个簇。
2. 算法保持每个簇都关联一个 $\mathbb{R}^n$ 中的点。
3. 在算法的每一步,通过移除两个“旧”簇并添加一个新簇来减少簇的数量。新添加的节点表示输出树中两个删除节点的父节点。
4. 通过计算与簇关联的点之间的成对距离,选择欧几里得距离最短的一对簇进行合并。
5. 新簇关联的点是移除簇的点的质心(点的“质量”为其代表的分类单元数量)。
6. 当簇的数量达到 1 时,树构建完成。
得到的树是有根的,但由于输入本质上是无根的,因此忽略生根。使用外群分类单元的标识来生根树。这种聚类启发式方法是一般邻接法的一个特例。
下面是四分体拼图法和几何启发式方法的流程对比表格:
| 方法 | 核心步骤 | 特点 |
| ---- | ---- | ---- |
| 四分体拼图法 | 贪心组合四分体,多次重复并随机排列顺序,多数共识合并结果树 | 快速启发式,可处理加权输入 |
| 几何启发式方法 | 半定规划嵌入点,几何聚类构建树 | 全局方法,可处理加权输入 |
以下是四分体拼图法的 mermaid 流程图:
graph LR
A[初始化分类单元顺序] --> B[确定锚点四分体]
B --> C[初始化边计数器]
C --> D[检查下一个分类单元]
D --> E{是否有相关四分体}
E -- 是 --> F[计算违反情况并更新计数器]
E -- 否 --> D
F --> G[选择计数器最小的边添加分类单元]
G --> H[归零计数器]
H --> I{所有分类单元检查完?}
I -- 否 --> D
I -- 是 --> J[多数共识合并结果树]
3.3 精确算法
由于底层问题是 NP 难的,无法期望用多项式时间算法来最优地解决它。不过,可以使用动态规划算法,以“温和”的指数运行时间找到最优的系统发育树,该方法适用于规模适中的实例(例如 $n \leq 21$)。
-
相关定义
- 对于有根二叉树中的节点 $v$,其左右子节点分别记为 $v_l$ 和 $v_r$。以节点 $v$ 为根的子树记为 $T(v)$,树 $T$ 的叶子集合记为 $L(T)$。对于一对节点 $u$ 和 $v$,它们的最近共同祖先 $lca(u, v)$ 定义为既是 $u$ 又是 $v$ 的祖先,且在 $T(p)$ 中除 $p$ 外没有其他节点是 $u$ 和 $v$ 的共同祖先的节点 $p$。
-
给定四分体 $q = ab|cd$ 和树 $T$,四分体 $q$ 的最近共同祖先 $qlca(q)$ 定义为满足以下条件的节点 $p$:
- 定义 2:$p$ 是 ${a, b, c, d}$ 中两对或更多对元素的 $lca$,且在 $T(p)$ 中除 $p$ 外没有其他节点是 ${a, b, c, d}$ 中两对或更多对元素的 $lca$。
- 定义 3:满足 $|L(T(p)) \cap {a, b, c, d}| \geq 3$,且对于 $p$ 的任何子节点 $s$,$|L(T(s)) \cap {a, b, c, d}| \leq 2$。
可以证明每个四分体 $q$ 都有唯一的 $qlca(q)$。并且,以 $qlca(q)$ 为根的子树决定了四分体 $q$ 在树 $T$ 中是否被满足。
-
算法原理
- 设 $Q$ 是固定的输入四分体集合。对于有根树 $T$ 和其中的节点 $v$,$SAT_Q(T(v))$ 表示 $Q$ 中被 $T$ 满足且 $qlca(q)$ 是 $T(v)$ 中节点的四分体集合,$TOP_Q(T(v))$ 是 $Q$ 中以 $v$ 为 $qlca$ 且被 $T$ 满足的四分体集合。有等式 $SAT_Q(T(v)) = TOP_Q(T(v)) \cup SAT_Q(T(v_l)) \cup SAT_Q(T(v_r))$。
- 对于四分体集合 $A \subseteq Q$,$sum(A) = \sum_{q \in A} C_q$ 表示其权重之和。子树 $T(v)$ 的得分定义为 $score_Q(T(v)) = sum(SAT_Q(T(v)))$,则有 $score_Q(T(v)) = sum(TOP_Q(T(v))) + score_Q(T(v_l)) + score_Q(T(v_r))$。
- 设 $S$ 是三个或更多分类单元的集合,$opt\ score_Q(S)$ 表示所有以 $S$ 为叶子集合的树中相对于 $Q$ 的最大得分,$opt\ tree_Q(S)$ 是达到最大得分的树。对于 $S$ 的每个真划分 $S_1$ 和 $S_2$,$T(S_1, S_2)$ 表示一棵以 $S_1$ 和 $S_2$ 为子树的树。
-
算法步骤
- 对于大小为 1 或 2 的集合 $S$,定义 $opt\ score_Q(S) = 0$。
- 对于所有可能的分类单元集合 $S$ 及其划分 $S_1$ 和 $S_2$,计算 $score_Q(T(S_1, S_2))$。
- 对于每个集合 $S$,选择得分最大的划分 $S_1$ 和 $S_2$,更新 $opt\ score_Q(S)$ 和 $opt\ tree_Q(S)$。
以下是精确算法的 mermaid 流程图:
graph LR
A[初始化集合得分] --> B[遍历所有集合 S]
B --> C[遍历 S 的所有划分 S1 和 S2]
C --> D[计算 score_Q(T(S1, S2))]
D --> E{是否为最大得分?}
E -- 是 --> F[更新 opt_score_Q(S) 和 opt_tree_Q(S)]
E -- 否 --> C
C --> G{所有划分遍历完?}
G -- 否 --> C
G -- 是 --> B
B --> H{所有集合遍历完?}
H -- 否 --> B
H -- 是 --> I[输出最优树]
总结
综上所述,基于四分体的系统发育树重建方法在生物进化研究中具有重要意义。不同的算法有各自的特点和适用场景:
- 四分体拼图法:简单快速,通过贪心策略和多次重复避免局部陷阱,可处理加权输入,适用于大规模数据的初步分析。
- 几何启发式方法:全局方法,利用半定规划和几何聚类,能有效处理加权四分体,对数据的整体结构把握较好。
- 精确算法:虽然是指数时间算法,但对于规模适中的问题能找到最优解,适用于对结果精度要求较高的情况。
在实际应用中,需要根据数据规模、精度要求和计算资源等因素选择合适的算法。同时,随着生物数据的不断积累和计算技术的发展,未来可能会有更高效、更准确的算法出现。
下面是三种算法的特点总结表格:
| 算法 | 复杂度 | 特点 | 适用场景 |
| ---- | ---- | ---- | ---- |
| 四分体拼图法 | 相对较低 | 贪心组合,多次重复,可处理加权输入 | 大规模数据初步分析 |
| 几何启发式方法 | 适中 | 全局方法,半定规划和几何聚类 | 数据整体结构分析 |
| 精确算法 | 指数级 | 动态规划找最优解 | 小规模高精度问题 |
希望通过本文的介绍,能帮助读者更好地理解基于四分体的系统发育树重建方法及其相关算法。在实际研究中,不断探索和尝试不同的算法,以获得更准确的系统发育树,为生物进化研究提供有力支持。
603

被折叠的 条评论
为什么被折叠?



