使用SciPy进行分层聚类:首先合并具有最大距离的点

时间:2017-12-07 09:49:59

标签: python scipy hierarchical-clustering

我在SciPy中使用层次结构包时遇到问题。这里有一个我的距离矩阵的例子:

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

我将矩阵转换为矢量,我想要一个合并矩阵中最高值的层次结构,因此它应按顺序合并((0-1)-2)-3)。要做到这一点,我使用'完整'参数,因为它在文档中写入,这用于获取最大值,但它实际上产生:((0-3)-2)-1)

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

Z = linkage(distArray, 'complete')

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

你误解了'完整'方法的含义。它仅意味着两个点之间的距离,例如{A,B}和{C,D},被认为是成对距离AC,AD,BC,BD的最大值。这并没有改变层次聚类结合附近聚类的事实,这些聚类是彼此距离最小的聚类。没有聚类方法用于“如果它们相距很远则组合点”。

如果你想在距离矩阵中使用大的条目(称之为D)来表示“这些是相似的”,那么你必须转换D来反转距离之间的顺序关系。换句话说,你用矩阵测量对象的相似性,你需要衡量 dis 的相似性。

最简单的方法是改变标志; linkage实际上并不要求距离为正。

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

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

返回

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'是方法'。

,所有这些都将返回相同的层次结构

当然,既然你知道'完整'并不一定是你需要的东西,你可能也想考虑其他方法,然后强加给D的转换效果可能会改变结果。考虑到D实际代表什么,在你的背景下做有意义的事情。