44

我有一个距离矩阵 n*n M,其中和M_ij之间的距离。正如预期的那样,它采用以下形式:object_iobject_j

   /  0     M_01    M_02    ...    M_0n\
   | M_10    0      M_12    ...    M_1n |
   | M_20   M_21     0      ...    M2_n |
   |                ...                 |
   \ M_n0   M_n2    M_n2    ...      0 / 

现在我希望用层次聚类对这 n 个对象进行聚类。Python 有一个名为scipy.cluster.hierarchy.linkage(y, method='single', metric='euclidean').

它的文档说:

y 必须是一个 {n \choose 2} 大小的向量,其中 n 是在距离矩阵中配对的原始观测值的数量。

y : 数组

一个压缩的或冗余的距离矩阵。压缩距离矩阵是包含距离矩阵的上三角形的平面阵列。这是 pdist 返回的形式。或者,可以将 n 维中的 m 个观察向量的集合作为 m × n 数组传递。

我对这个描述感到困惑y我可以直接输入我M的输入y吗?


更新

@hongbo-zhu-cn在 GitHub 上提出了这个问题。这正是我所关心的。但是,作为 GitHub 的新手,我不知道它是如何工作的,因此不知道如何处理这个问题。

4

2 回答 2

47

看起来我们确实不能直接传递冗余方阵,尽管文档声称我们可以这样做。

为了让将来遇到同样问题的人受益,我在这里写下我的解决方案作为附加答案。所以复制粘贴的人可以继续进行聚类。

使用以下代码段来压缩矩阵并愉快地继续。

import scipy.spatial.distance as ssd
# convert the redundant n*n square matrix form into a condensed nC2 array
    distArray = ssd.squareform(distMatrix) # distArray[{n choose 2}-{n-i choose 2} + (j-i-1)] is the distance between points i and j

如果我错了,请纠正我。

于 2013-09-23T08:40:23.850 回答
11

现在你应该传入“压缩距离矩阵”,即距离矩阵的上三角向量形式:

y = M[np.triu_indices(n,1)]

@hongbo-zhu-cn 的拉取请求的讨论看来,解决方案似乎是向linkage函数添加一个额外的关键字参数,允许用户明确指定他们传递的是nxn距离矩阵而不是mxn观察矩阵。

于 2013-09-23T08:31:11.183 回答