我在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')
有什么建议吗?
答案 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实际代表什么,在你的背景下做有意义的事情。