了解用于切割树状图的 DynamicTreeCut 算法

Posted

技术标签:

【中文标题】了解用于切割树状图的 DynamicTreeCut 算法【英文标题】:Understanding DynamicTreeCut algorithm for cutting a dendrogram 【发布时间】:2017-01-11 12:46:03 【问题描述】:

树状图是一种与层次聚类算法一起使用的数据结构,它在树的不同“高度”处对聚类进行分组 - 其中高度对应于聚类之间的距离度量。

从某些输入数据集创建树状图后,通常更难确定在哪里“切割”树状图,这意味着选择一个高度,使得只有低于该高度的聚类才被认为是有意义的。

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

见:

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

Cutting dendrogram at highest level of purity

所以我一直在阅读 DynamicTreeCut 算法,以及该算法的 Java implementation。我了解算法是如何工作的以及它在做什么,就逐步分解正在发生的事情而言。但是,我无法理解 这个算法是如何做任何有意义的事情的。我想我在这里遗漏了一些关键概念。

一般来说,该算法从树状图中迭代“高度序列”。我不确定,但我假设“高度序列”仅表示树状图 Y 轴上的值,即集群连接发生的各种高度。如果是这种情况,我们可以假设“身高序列”按升序排序。

然后该算法要求获取“参考高度”l,并从输入“高度序列”中的每个高度中减去它。这为您提供了高度序列中每个高度 h[i] 与参考高度 l 之间的差异向量 (D)。

然后算法会尝试找到“过渡点”——它们是差异向量中D[i] > 0D[i+1] < 0 的点。换句话说,差值向量中的点,差值从正变为负。

而就在这里,我完全迷失了。我不明白这些过渡点如何有意义。首先,据我了解,输入高度序列H 只是树状图 Y 轴上的值。因此,高度序列H 应该是升序。因此,我们从 positive 过渡到 negative 的差异向量中怎么会有一个点?

例如:

假设我们的输入高度序列 H 是1, 1.5, 2, 2.5, 3, 7, 9,我们的参考值l 是平均高度(即3.7)。因此,如果我们通过从H 中的每个高度减去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 算法在这里试图实现什么,以及我的理解哪里出了问题?

【问题讨论】:

你的困惑是对的。唯一有意义的解释是“树状图高度序列”具有作者从未设法提及的非常规含义。实现注释中有一条可能的线索,它说它是“从根到节点的相异度量之和”bioinformatics.org/cgi-bin/viewvc.cgi/catch/branches/… 【参考方案1】:

我完全同意您对论文和算法的理解。我得出了和你一样的结论。

我提供的是推测。但我对此很有信心。

论文指出断点会限制集群之间的距离。两个连续的断点定义一个集群

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

在示例中,H 将变为 (0.70, 0.35, 0.90, 0.45, 0.77, 0.40, 0.30, 0.55, 0.05)。为了澄清,第一个条目 0.70 是第一个点和第二个点之间的合并线的高度(这里称为 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,因此所有动态部分都需要完成。老实说,当您意识到它们只是在越来越小的集群上对具有不同高度的 TreeCutCore 进行递归调用时,这并没有那么复杂。

另外,作为另一种保险,当您一个接一个地有多个负值时,我并没有完全错,这意味着它对应于异常值的单例,这正是节点 54(您链接的论文的图 5) ) 是。几个连续的负值本身不会形成一个集群,它们是彼此真正不同的单例。只有大于 0 的连续组才形成一个簇

【讨论】:

您在此处建议的高度顺序(为可视化重新排序的高度)似乎与经典的有序树遍历相同(如果您忽略对底部单例的访问)。 我不确定术语,但我同意它与您忽略叶子的深度优先搜索遍历非常相似。

以上是关于了解用于切割树状图的 DynamicTreeCut 算法的主要内容,如果未能解决你的问题,请参考以下文章

在距离高度从 SciPy 切割树状图/聚类树

图像切割—基于图的图像切割(Graph-Based Image Segmentation)

如何调整树状图的y轴大小

pstree---树状图的方式展现进程

USACO5.3 IDDFS_强连通_二维树状数组_斐蜀定理_矩形切割

从树中的聚类对象逐步绘制树状图的算法