因此,我在SciPy中使用fastcluster进行聚集聚类。我可以执行dendrogram
以获得聚类的树状图。我可以执行fcluster(Z, sqrt(D.max()), 'distance')
为我的数据获得一个很好的聚类。如果我想手动检查树状图中k = 3(群集)的区域,然后再检查k = 6(群集)怎么办?如何在树状图的特定级别获得聚类?
我看到所有这些功能都有公差,但是我不明白如何从公差转换为簇数。我可以通过一个简单的数据集来手动构建群集,方法是通过链接(Z)并逐步将群集拼接在一起,但这不适用于大型数据集。
如果要在特定级别切割树,请使用:
fl = fcluster(cl,numclust,criterion='maxclust')
其中cl
是您的链接方法的输出,numclust
是您想要获得的群集数。
好,让我提出一种方法。我认为这不是正确或最佳方法,但至少这是一个开始。
fcluster
。唯一的问题是有平局,但是如果您能检测到已发生平局,那么实际上这不是问题。
分层聚类允许您放大和缩小以获得聚类的细粒度或粗粒度视图。因此,可能尚不清楚要削减哪个级别的树状图。一个简单的解决方案是获取每个级别的集群成员资格。也可以选择所需的簇数。
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)