8

所以我使用 fastcluster 和 SciPy 来进行凝聚聚类。我可以做得到dendrogram聚类的树状图。我可以fcluster(Z, sqrt(D.max()), 'distance')为我的数据获得一个很好的聚类。如果我想手动检查树状图中说 k=3(集群)的区域,然后我想检查 k=6(集群)怎么办?如何在树状图的特定级别获得聚类?

我看到所有这些函数都有公差,但我不明白如何从公差转换为集群数。我可以通过链接 (Z) 并逐步将集群拼凑在一起,使用简单的数据集手动构建集群,但这对于大型数据集并不实用。

4

3 回答 3

14

如果要在特定级别切割树,请使用:

fl = fcluster(cl,numclust,criterion='maxclust')

wherecl是您的链接方法的输出,并且numclust是您想要获得的集群数。

于 2013-07-12T19:39:53.203 回答
3

层次聚类允许您放大和缩小以获得聚类的细粒度或粗粒度视图。因此,事先可能不清楚要切割哪个级别的树状图。一个简单的解决方案是获取每个级别的集群成员资格。也可以选择所需的簇数。

import numpy as np
from scipy import cluster
np.random.seed(23)
X = np.random.randn(20, 4)
Z = cluster.hierarchy.ward(X)
cutree_all = cluster.hierarchy.cut_tree(Z)
cutree1 = cluster.hierarchy.cut_tree(Z, n_clusters=[5, 10])
print("membership at all levels \n", cutree_all) 
print("membership for 5 and 10 clusters \n", cutree1)
于 2020-02-05T21:52:19.760 回答
0

好的,让我提出一种方法。我不认为这是正确或最好的方式,但至少这是一个开始。

  1. 选择我们感兴趣的k
  2. 请注意,链接 Z 有 N-1 个列表,其中 N 是数据点的数量。第 m 个列表条目将产生 Nm 个簇。因此,在 Z 中获取索引为 k = Nm-1 的列表。
  3. 获取该列表第三列的距离值
  4. fcluster以该特定距离作为容差(或者可能是距离加上一些非常小的增量)调用。

唯一的问题是存在平局,但如果您可以检测到平局发生,这实际上不是问题。

于 2013-07-12T14:55:46.710 回答