了解用于剪切树形图的DynamicTreeCut算法

时间:2016-09-03 15:48:28

标签: algorithm cluster-analysis hierarchical-clustering dendrogram unsupervised-learning

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

在从某些输入数据集创建树形图之后,确定在哪里切割""树形图,意味着选择一个高度,使得只有那个高度以下的簇被认为是有意义的。

在剪切树形图的高度上并不总是很清楚,但是存在一些算法,例如 DynamicTreeCut 算法,它试图以编程方式从中选择有意义的聚类。树状图。

请参阅:

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

Cutting dendrogram at highest level of purity

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

通常,算法迭代高度序列"来自树状图。我不确定,但我认为这是一个高度序列"仅表示树状图沿Y轴的值,即聚类连接发生的各种高度。如果是这种情况,我们可以假设一个"高度序列"按升序排序。

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

然后算法尝试找到转换点&#34; - 差异向量中的点D[i] > 0D[i+1] < 0。换句话说,差异向量中的点,其中差值从正变为负值。

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

例如:

假设我们的输入高度序列H为{1, 1.5, 2, 2.5, 3, 7, 9},我们的参考值l是平均高度(3.7)。因此,如果我们通过从D中的每个高度减去l来创建差异向量H,我们就会获得{-2.7, -2.2, -1.7, -1.2, -0.7, 3.3, 5.3}。很明显,这里没有转换点,也没有转换点,因为差异向量中没有D[i] > 0D[i+1] < 0的点,因为高度序列H位于升序

很明显,我完全误解了这个算法的基本原理。也许我不理解&#34;身高序列&#34;的含义。我假设它只是来自树形图的Y轴上的值,但显然对于算法实际上做的事情没有任何意义。不幸的是,作者并没有真正解释树状图高度序列的含义,也不是数据科学界正在使用的某种标准术语。

那么可以解释一下DynamicTreeCut算法在这里尝试实现的内容,以及我理解错误的地方吗?

1 个答案:

答案 0 :(得分:2)

我完全同意你对论文和算法的理解。我和你做了同样的结论。

我提供的是猜测。但我对此非常有信心。

  • 该文件指出断点为您提供了群集之间的限制。两个连续断点定义了一个簇

直接的结论是,你不能将H作为有序的高度列表。相反,它应该是重新排序可视化点的高度,即&#34;这样得到的图中的线不会交叉&#34;

Example of dendrogram

在该示例中,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-1变为(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进行递归调用时,它并不复杂。

另外,作为另一种保险,当你一个接一个地有几个负值时,我并不完全错误,这意味着它对应于异常值的单例,这正是Node 54(你链接的文件的图5) )是。几个连续的负值本身并不构成一个集群,它们实际上是彼此不同的单体。只有0以上的连续组才能形成集群