使用SciPy如何获得k =的聚类?进行分层聚类

时间:2013-07-12 14:13:50

标签: scipy hierarchical-clustering

所以我使用快速集群与SciPy进行凝聚聚类。我可以dendrogram来获取聚类的树形图。我可以fcluster(Z, sqrt(D.max()), 'distance')为我的数据获得一个非常好的聚类。如果我想手动检查树形图中的区域,例如k = 3(簇),然后我想检查k = 6(簇),该怎么办?如何在树形图的特定级别获得聚类?

我看到所有这些函数都有公差,但我不明白如何从容差转换为集群数。我可以通过链接(Z)手动构建聚类,并逐步拼凑聚类,但这对大型数据集来说并不实用。

3 个答案:

答案 0 :(得分:13)

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

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

其中cl是您的链接方法的输出,numclust是您想要获得的群集数。

答案 1 :(得分:2)

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

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)

答案 2 :(得分:0)

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

  1. 选择我们感兴趣的k
  2. 请注意,链接Z具有N-1个列表,其中N是数据点的数量。第m个列表条目将产生N-m个簇。因此,抓住Z中的索引,其中索引为k = N-m-1。
  3. 抓住距离值,该列表是该列表的第3列
  4. 使用该特定距离调用fcluster作为容差(或者距离加上一些非常小的增量)。
  5. 唯一的问题是存在联系,但如果你能发现领带已经发生,那真的不是问题。