如何在Python中从scipy中的链接/距离矩阵计算集群分配?

如何在Python中从scipy中的链接/距离矩阵计算集群分配?,python,numpy,scipy,cluster-analysis,Python,Numpy,Scipy,Cluster Analysis,如果在Python中的scipy中有此分层集群调用: from scipy.cluster.hierarchy import linkage # dist_matrix is long form distance matrix linkage_matrix = linkage(squareform(dist_matrix), linkage_method) 那么,从这一点到单个点的群集分配,有什么有效的方法?i、 e.长度为N的向量,其中N是点数,其中每个条目i是点数i的聚类数,给定给定阈值t

如果在Python中的scipy中有此分层集群调用:

from scipy.cluster.hierarchy import linkage
# dist_matrix is long form distance matrix
linkage_matrix = linkage(squareform(dist_matrix), linkage_method)
那么,从这一点到单个点的群集分配,有什么有效的方法?i、 e.长度为
N
的向量,其中
N
是点数,其中每个条目
i
是点数
i
的聚类数,给定给定阈值
thresh
对结果聚类产生的聚类数

澄清一下:集群编号将是在对树应用阈值后它所在的集群。在这种情况下,您将为其所在集群的每个叶节点获得一个唯一的集群。独特之处在于,每个点都属于一个“最特定的簇”,该簇由切割树状图的阈值定义


我知道
scipy.cluster.hierarchy.fclusterdata
将此集群分配作为其返回值,但我从自定义的距离矩阵和距离度量开始,因此我无法使用
fclusterdata
。问题归结为:我如何计算什么是
fclusterdata
计算的——集群分配?

如果我理解正确,那就是:

scipy.cluster.hierarchy.fcluster(Z,t,条件='unconstance',深度=2,R=None,monocrit=None)

从链接矩阵Z定义的层次聚类形成平面聚类

返回:长度为n的数组。T[i]是原始观测值i所属的平坦簇数


因此,只需调用
fcluster(linkage\u matrix,t)
,其中
t
是您的阈值。

如果您想查看每个集群级别的成员以及它们的聚集顺序,请参见如果您将squareform(dist\u matrix)赋予linkage(),则该矩阵被视为观察值,聚类结果可能不正确。您可以直接将距离矩阵的压缩向量作为linkage()的输入。更多详细信息请参见:您可以选择的一个选项是取Z的平均距离(avg(Z[:,2])列。一旦获得平均值,您就可以从该列中剪切。这不是一个通用方法,但您可以尝试。确切地说,这将输出集群标签。