使用发布的代码 here ,我创建了一个很好的层次聚类:
假设左边的树状图是通过执行类似的操作创建的
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)
现在我如何获得每个彩色簇的成员的索引?为了简化这种情况,忽略顶部的簇,只关注左侧的树状图矩阵。
此信息应存储在树状图 Z
存储变量中。有一个函数可以做我想做的事情,叫做 fcluster
(参见文档 here )。但是,我看不到在哪里可以为 fcluster 提供与创建树状图时指定的相同的 cutoff
。似乎 fcluster
、t
中的阈值变量必须根据各种模糊测量(inconsistent
、distance
、maxclust
、monocrit
)。有任何想法吗?
最佳答案
我认为你在正确的轨道上。让我们试试这个:
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
取决于您在 linkage
中使用的 method
。尝试 method=single
、complete
和 average
。然后注意 ind
的不同之处。
例子:
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])
scipy.cluster.hierarchy
确实令人困惑。在您的链接中,我什至不认识自己的代码!
关于python - 如何在 scipy 创建的树状图中获得与颜色簇相对应的平面聚类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7664826/