【问题标题】:How to compute cluster assignments from linkage/distance matrices in scipy in Python?如何从 Python 中的 scipy 中的链接/距离矩阵计算集群分配?
【发布时间】: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()的输入。
  • 您拥有的一个选项是在 Z 的距离(avg(Z[:,2] )列上取平均值。一旦您变得卑鄙,您就可以从那里削减。这不是通用方法,但你可以试试。

标签: python numpy scipy cluster-analysis


【解决方案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://stackoverflow.com/a/43170608/5728789

【讨论】:

    猜你喜欢
    • 2018-03-28
    • 2016-08-02
    • 1970-01-01
    • 2016-10-15
    • 2018-08-05
    • 1970-01-01
    • 2018-05-14
    • 2015-01-29
    相关资源
    最近更新 更多