使用发布的代码,我创建了一个很好的分层集群:
比如说左边的树木图是通过做

Y = sch.linkage(D, method='average') # D is a distance matrix
cutoff = 0.5*max(Y[:,2])
Z = sch.dendrogram(Y, orientation='right', color_threshold=cutoff)

现在,如何获得每个有色集群成员的索引?为了简化这种情况,忽略顶部的集群,只关注矩阵左侧的树形图。
此信息应存储在树形图的“存储变量”中。有一个函数应该按照我想要的方式来执行(请参见文档)。但是,我看不出哪里可以给fcluster提供与创建树形图中指定的相同的Z。似乎fclustercutoff中的阈值变量必须以各种模糊测量(fclustertinconsistentdistance)为基础。有什么想法吗?

最佳答案

我觉得你走对了。让我们试试这个:

import scipy
import scipy.cluster.hierarchy as sch
X = scipy.randn(100, 2)     # 100 2-dimensional observations
d = sch.distance.pdist(X)   # vector of (100 choose 2) pairwise distances
L = sch.linkage(d, method='complete')
ind = sch.fcluster(L, 0.5*d.max(), 'distance')

ind将为100个输入观测值中的每一个提供集群索引。ind取决于您在method中使用的内容。尝试linkagemethod=singlecomplete。然后注意average的区别。
例子:
In [59]: L = sch.linkage(d, method='complete')

In [60]: sch.fcluster(L, 0.5*d.max(), 'distance')
Out[60]:
array([5, 4, 2, 2, 5, 5, 1, 5, 5, 2, 5, 2, 5, 5, 1, 1, 5, 5, 4, 2, 5, 2, 5,
       2, 5, 3, 5, 3, 5, 5, 5, 5, 5, 5, 5, 2, 2, 5, 5, 4, 1, 4, 5, 2, 1, 4,
       2, 4, 2, 2, 5, 5, 5, 2, 5, 5, 3, 5, 5, 4, 5, 4, 5, 3, 5, 3, 5, 5, 5,
       2, 3, 5, 5, 4, 5, 5, 2, 2, 5, 2, 2, 4, 1, 2, 1, 5, 2, 5, 5, 5, 1, 5,
       4, 2, 4, 5, 2, 4, 4, 2])

In [61]: L = sch.linkage(d, method='single')

In [62]: sch.fcluster(L, 0.5*d.max(), 'distance')
Out[62]:
array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1])

indSure令人困惑。在你的链接中,我甚至不认识我自己的代码!

关于python - 如何在scipy创建的树形图中获得与颜色簇相对应的平面聚类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7664826/

10-09 03:05