理解DynamicTreeCut算法以切割树状图

10

树状图是一种与层次聚类算法一起使用的数据结构,将不同“高度”的群集分组到树的不同分支中 - 高度对应于群集之间的距离度量。

在从某个输入数据集创建树状图之后,通常需要进一步解决如何“切割”树状图的问题,即选择一个高度,使得只有低于该高度的群集被认为是有意义的。

并不总是清楚在什么高度上切割树状图,但是存在一些算法,例如DynamicTreeCut算法,尝试从树状图中编程选择有意义的群集。

参见:

https://stats.stackexchange.com/questions/3685/where-to-cut-a-dendrogram

Cutting dendrogram at highest level of purity

因此,我一直在阅读DynamicTreeCut算法,以及该算法的Java实现。我理解该算法的工作原理和它在做什么方面,也就是每一步正在发生的事情的逐步说明。但是,我无法理解该算法如何做出任何有意义的事情。我认为我在这里缺少一些关键概念。

通常,该算法从树状图中的“高度序列”迭代。我不确定,“高度序列”是否只是指树状图上沿Y轴的值,即聚类合并发生的各种高度。如果是这样的话,我们可以假设“高度序列”按升序排列。

然后,算法要求选取一个“参考高度”l,并将其从输入的“高度序列”中的每个高度中减去。这将给出一个差分向量(D),用来表示高度序列中每个高度h[i]与参考高度l之间的差异。

接下来,算法尝试找到“转换点”,这些点是差分向量中满足条件D[i] > 0D[i+1] < 0的点。换句话说,它是在差异向量中,在差异值从正数转变为负数的位置上。

在这里,我完全迷失了。我不明白这些转换点如何有意义。首先,我理解输入的高度序列H只是树状图上Y轴上的值。因此,高度序列H应该按升序排列。因此,差分向量中如何存在从正数到负数的转换点呢?

例如:

假设我们的输入高度序列H为{1, 1.5, 2, 2.5, 3, 7, 9},参考值l为平均高度(即3.7)。如果我们通过将每个高度从l中减去来创建一个差异向量D,则会得到{-2.7, -2.2, -1.7, -1.2, -0.7, 3.3, 5.3}。显然,这里没有过渡点,也永远不可能有过渡点,因为差异向量中没有任何一点满足 D [i] > 0D [i + 1] <0 ,因为高度序列H 是按升序排列的
所以很明显,我完全误解了该算法中的某些基本概念。也许我没有理解“高度序列”的含义。我认为它只是树状图上的Y轴值,但显然这与算法实际执行的内容毫无关系。不幸的是,作者并没有真正解释“树状图高度序列”的含义,而且在数据科学社区中似乎也没有这种标准术语。
那么,有人能解释一下DynamicTreeCut算法在这里试图实现什么,并指出我的理解错在哪里吗?

2
你的困惑是正确的。唯一有意义的解释是,“树形图高度序列”具有作者从未提及的非传统含义。在实现注释中可能有一个线索,它说它是“从根节点到节点的不相似度量之和”。http://www.bioinformatics.org/cgi-bin/viewvc.cgi/catch/branches/catch-engine/splitter/splitter.c?r1=482&r2=483&view=patch - Gene
1个回答

4

我完全同意你对论文和算法的理解,我得出了与你相同的结论。

我的观点是一种推测,但我对此感到非常有信心。

  • 论文指出断点为簇之间的限制。两个连续的断点定义了一个簇

直接的结论是,你不能把H作为排序后高度的有序列表。相反,它应该是可视化时重新排列点后的高度,即“使结果图中的线条不交叉”。

Example of dendrogram

在这个例子中,H会变成(0.70, 0.35, 0.90, 0.45, 0.77, 0.40, 0.30, 0.55, 0.05)。需要澄清的是,第一个条目0.70是第1个和第2个点(这里称为3和7)之间合并线的高度。请注意,可视化不是唯一的,但最终算法的结果将是确定的。
断点和转换被定义为在0线以上的一组连续点。
结论:因为在群集内合并高度较低,并且群集具有其H-l值为正,所以您希望大量低合并高度(即:群集)站在0线上方。因此,不要使用合并高度,而要使用负数。
在这个例子中,H会变成(-0.70,-0.35,-0.90,...)。
让我们尝试我的假设,令l = -0.75
H-l变为(0.05, 0.40, -0.15, 0.30, -0.02, 0.35, 0.45, 0.20, 0.70)
你有两个转换来定义3个簇:(3-7-6),(1-4)和(9-5-8-10-2)。有关参考,请参见图片。这感觉非常合理。
我还可以得出的结论是,这是一种非常迂回的方式来表明它是固定高度的分支切割。请注意,这仅是TreeCutCore,因此所有动态部分都留待完成。当您意识到他们只是对越来越小的簇使用不同高度进行递归调用时,它并不那么复杂。
此外,另一个保险措施是,当您有几个负值相继出现时,这意味着它对应于单例离群值,这正是您链接的论文的图5的节点54。几个连续的负值本身并不形成簇,它们是非常不同的单例。只有以上0的连续组形成簇。

你在这里建议的高度顺序(重新排序以进行可视化)似乎与经典的中序遍历树相同(如果忽略底部单例的访问)。 - Siler
我不确定术语是否正确,但我同意它非常类似于深度优先搜索遍历,其中忽略叶子节点。 - B. Decoster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接