使用 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 实际代表什么,做在您的上下文中有意义的事情。
我在使用 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 实际代表什么,做在您的上下文中有意义的事情。