【问题标题】:Calculate ordering of dendrogram leaves计算树状图叶子的排序
【发布时间】:2012-09-16 08:23:51
【问题描述】:

我有五个点,我需要从这些点创建树状图。函数“树状图”可用于查找这些点的顺序,如下所示。但是,我不想使用树状图,因为它很慢并且会导致大量点出错(我在这里问了这个问题Python alternate way to find dendrogram)。有人可以指出我如何将“链接”输出(Z)转换为“树状图(Z)['ivl']”值。

>>> from hcluster import pdist, linkage, dendrogram
>>> import numpy
>>> from numpy.random import rand
>>> x = rand(5,3)
>>> Y = pdist(x)
>>> Z = linkage(Y)
>>> Z
array([[ 1.        ,  3.        ,  0.11443378,  2.        ],
       [ 0.        ,  4.        ,  0.47941843,  2.        ],
       [ 5.        ,  6.        ,  0.67596472,  4.        ],
       [ 2.        ,  7.        ,  0.79993986,  5.        ]])
>>> 



>>> dendrogram(Z)['ivl']
['2', '1', '3', '0', '4']
>>> 

【问题讨论】:

标签: python data-mining cluster-analysis dendrogram


【解决方案1】:

scipy 中有一个专门用于计算线性化叶序的函数。这里是。 scipy.cluster.hierarchy.leaves_list.

【讨论】:

  • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
  • @Dijkgraaf 在这里描述整个聚类/排序算法是没有意义的。这根本不是问题。这是软件包的重要组成部分,专门为此目的实施,因此不太可能发生重大变化。
  • 您可以添加一个示例,说明如何使用该函数、需要哪些参数或类似内容。就目前而言,您的答案只是 borderline 链接,因此如果您不对其进行编辑以添加更多详细信息,则可能会被删除。
【解决方案2】:

为什么慢?当然,计算链接集群的简单方法是O(n^3),但对于n=5,这很便宜......

关于 scipy 链接矩阵的格式,请看这个问题: scipy linkage format

请注意,您可能仍需要对数据进行最佳排序。上面的链接矩阵编码给出了

  • 元素 1 和簇 3 在高度 0.1144 处连接(成为 2 元素簇,#5)
  • 元素 0 和簇 4 在高度 0.7999 处连接(成为 2 元素簇,#6)
  • 集群 5 和集群 6 在高度 0.6759 处连接(成为 4 元素集群,#7)
  • 元素 2 和簇 7 在高度 0.7999 处连接(成为 5 元素簇,#8)

但它可能通过链接距离进行排序,而不是在一维排序中进行可视化(因为不是每个使用链接聚类的人都希望在之后运行树状图可视化)。但无论如何,如果您确实需要排序,计算树状图的顺序应该是O(n log n),与实际聚类相比相当便宜。

按照这些思路应该可以解决问题:

n = len(Z) + 1
cache = dict()
for k in range(len(Z)):
  c1, c2 = int(Z[k][0]), int(Z[k][1])
  c1 = [c1] if c1 < n else cache.pop(c1)
  c2 = [c2] if c2 < n else cache.pop(c2)
  cache[n+k] = c1 + c2
print cache[2*len(Z)]

这可能看起来是线性的,但数组的预期大小是log n,因此根据您的列表类型,它可能仍然是O(n log n),而对于链表,它确实应该在O(n) 中可行。

但最后,您可能希望避免层次聚类。它是聚类分析的一个流行的介绍性示例,因为它在概念上非常容易理解。有一些非常棘手的算法 (SLINK) 可以将其降低到 O(n^2) 复杂度。但是有更现代和更强大的聚类算法具有更低的复杂性。实际上,OPTICS (Wikipedia) 计算的结果非常相似(当您设置 minPts=2 时),并且当您拥有良好的索引结构时,它将在 O(n log n) 中运行。另外,您可以增加 minPts 以获得更有意义的集群。 (但不要在 Weka 中使用 OPTICS,或者使用浮动的 Python 版本 - 因为它们都不完整或有问题!)

【讨论】:

  • 我也想知道,排序是如何创建的 没有 scipy dendrogram 功能。对此没有给出答案,无论是这里还是两个相关的问题。有一篇论文,引起了我的兴趣。那时甚至应该可以通过 OPTICS 创建树状图,不是吗?
  • 是的,有一些论文讨论了 OPTICS 图与常规树状图的关系。
  • 我的意思是this。但是,原理是什么,叶子在树状图中是按顺序排列的?是通过某种方式遍历共生矩阵来完成的吗?
  • 树状图和 OPTICS 簇顺序本质上都是序列化的最小生成树(与点对点距离的度量不同)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-10
  • 1970-01-01
  • 1970-01-01
  • 2016-01-17
  • 2012-03-27
  • 1970-01-01
  • 2013-06-18
相关资源
最近更新 更多