所以我使用快速集群与SciPy进行凝聚聚类。我可以dendrogram
来获取聚类的树形图。我可以fcluster(Z, sqrt(D.max()), 'distance')
为我的数据获得一个非常好的聚类。如果我想手动检查树形图中的区域,例如k = 3(簇),然后我想检查k = 6(簇),该怎么办?如何在树形图的特定级别获得聚类?
我看到所有这些函数都有公差,但我不明白如何从容差转换为集群数。我可以通过链接(Z)手动构建聚类,并逐步拼凑聚类,但这对大型数据集来说并不实用。
答案 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)
好的,让我提出一个方法。我不认为这是正确的或最好的方式,但至少它是一个开始。
fcluster
作为容差(或者距离加上一些非常小的增量)。唯一的问题是存在联系,但如果你能发现领带已经发生,那真的不是问题。