使用 SciPy 的层次聚类:首先合并距离最大的点

Hierarchical clustering with SciPy: merge the points with greatest distance first

我在使用 SciPy 中的层次结构包时遇到问题。这是我的距离矩阵的示例:

[[  0.,  40.,  33.,  28.],
 [ 40.,   0.,  35.,  28.],
 [ 33.,  35.,   0.,  28.],
 [ 28.,  28.,  28.,   0.]]

我将矩阵转换为向量,我想要一个合并矩阵中最高值的层次结构,因此它应该按顺序合并 ((0-1)-2)-3)。为此,我使用 'complete' 参数,正如文档中所写的那样,它用于取最大值,但它实际上产生:((0-3)-2)-1)

这是计算链接矩阵的代码:

Z = linkage(distArray, 'complete')

有什么建议吗?

你误解了'complete'方法的意思。这仅意味着两个点簇之间的距离,例如 {A, B} 和 {C, D},被认为是成对距离 AC、AD、BC、BD 中的最大值。这并没有改变层次聚类结合 nearby 集群的事实,这些集群彼此之间的距离最小。 "combine points if they are very far apart" 没有聚类方法。

如果您希望距离矩阵(称为 D)中的大条目表示 "these are similar",那么您必须转换 D 以反转距离之间的顺序关系。换句话说,您拥有的矩阵衡量对象的相似性,您需要衡量 dissimilarity.

最简单的就是改签; linkage 实际上并不要求距离为正。

from scipy.cluster.hierarchy import linkage
from scipy.spatial.distance import squareform

linkage(-squareform(D), 'complete')

returns

array([[  0.,   1., -40.,   2.],
       [  2.,   4., -33.,   3.],
       [  3.,   5., -28.,   4.]])

表示联动((0-1)-2)-3.

如果负值是一个问题,还有其他不产生负数的转换:

linkage(D.max() - squareform(D), 'complete')

linkage(squareform(D)**(-1), 'complete')

只要'complete'是方法,所有这些都会return相同的层次结构'。

当然,既然你知道'complete'不一定是你需要的东西,你可能还想考虑其他方法,然后对D施加的变换效果可能会改变结果。考虑到 D 实际代表什么,做在您的上下文中有意义的事情。