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

问题描述 投票:6回答:3

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

我看到所有这些功能都有公差,但是我不明白如何从公差转换为簇数。我可以通过一个简单的数据集来手动构建群集,方法是通过链接(Z)并逐步将群集拼接在一起,但这不适用于大型数据集。

scipy hierarchical-clustering
3个回答
13
投票

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

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

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


0
投票

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

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

唯一的问题是有平局,但是如果您能检测到已发生平局,那么实际上这不是问题。


0
投票

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

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)
© www.soinside.com 2019 - 2024. All rights reserved.