如何从 Python 中的 scipy 中的链接/距离矩阵计算集群分配?
Posted
技术标签:
【中文标题】如何从 Python 中的 scipy 中的链接/距离矩阵计算集群分配?【英文标题】:How to compute cluster assignments from linkage/distance matrices in scipy in Python? 【发布时间】:2013-04-03 19:42:14 【问题描述】:如果你在 Python 的 scipy 中有这个层次聚类调用:
from scipy.cluster.hierarchy import linkage
# dist_matrix is long form distance matrix
linkage_matrix = linkage(squareform(dist_matrix), linkage_method)
那么从这个到集群分配单个点的有效方法是什么?即长度为N
的向量,其中N
是点数,其中每个条目i
是点i
的聚类数,给定由给定阈值thresh
在结果聚类上生成的聚类数?
澄清一下:集群编号将是它在对树应用阈值后所在的集群。在这种情况下,您将为所在集群的每个叶节点获得一个唯一的集群。在每个点属于一个“最具体的集群”的意义上,这是由您切割树状图的阈值定义的。
我知道scipy.cluster.hierarchy.fclusterdata
给你这个集群分配作为它的返回值,但我是从定制的距离矩阵和距离度量开始的,所以我不能使用fclusterdata
。问题归结为:我如何计算 fclusterdata
正在计算的内容——集群分配?
【问题讨论】:
如果将 squareform(dist_matrix) 赋给 links(),则矩阵被视为观测值,聚类结果可能不正确。您可以将距离矩阵的压缩向量直接作为linkage()的输入。 更多详情见:github.com/scipy/scipy/issues/2614 您拥有的一个选项是在 Z 的距离(avg(Z[:,2] )列上取平均值。一旦您变得卑鄙,您就可以从那里削减。这不是通用方法,但你可以试试。 【参考方案1】:如果我没听错的话,fcluster 就是这样做的:
scipy.cluster.hierarchy.fcluster(Z, t, criterion='inconsistent', depth=2, R=None, monocrit=None)
从由链接矩阵 Z 定义的层次聚类形成平面聚类。
...
返回:一个长度为 n 的数组。 T[i] 是原始观测值 i 所属的平面簇数。
所以只需致电fcluster(linkage_matrix, t)
,其中t
是您的门槛。
【讨论】:
没错。这将输出集群标签。【参考方案2】:如果您想查看每个集群级别的成员以及它们的聚集顺序,请参阅https://***.com/a/43170608/5728789
【讨论】:
以上是关于如何从 Python 中的 scipy 中的链接/距离矩阵计算集群分配?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用scipy 1.0.0计算python 3.6中的VIF?
Python Scipy 中的两个样本 Kolmogorov-Smirnov 测试
如何使用 Scipy.io.loadmat 将 Matlab mat 文件中的字符串单元格数组加载到 Python 列表或元组中