如何在Scipy中访问簇/质心/中位数聚类?

3
当使用scipy.spatial.distance.pdist创建压缩距离矩阵并将其传递给ward时,我遇到了这个错误:
Valid methods when the raw observations are omitted are 'single', 'complete', 'weighted', and 'average' error. 

虽然文档中指出linkage()函数需要一个压缩的距离矩阵,但我该如何解决这个问题?

foo = np.random.randint(3, size=(10,10))
scipy.spatial.distance.pdist(foo)
scipy.cluster.hierarchy.linkage(foo)
bar = scipy.spatial.distance.pdist(foo)
scipy.cluster.hierarchy.linkage(bar, method='ward')

提供:

 Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/usr/lib/python2.7/dist-packages/scipy /cluster/hierarchy.py", line 627, in linkage
raise ValueError("Valid methods when the raw observations are "
 ValueError: Valid methods when the raw observations are omitted are 'single', 'complete', 'weighted', and 'average'. 

我搜索了一下,找到了这个链接,表明还有其他人遇到了这个问题,但是我无法找到解决方法来提供数据以使scipy接受。

2个回答

2

从文档字符串中可以看出:

y : ndarray

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

将您的原始的 观测值 x 维度 数组 foo 传入似乎是有效的:

scipy.cluster.hierarchy.linkage(foo, method='ward')

提供:

array([[  1.        ,   2.        ,   2.23606798,   2.        ],
       [  5.        ,   8.        ,   2.23606798,   2.        ],
       [  3.        ,   7.        ,   2.64575131,   2.        ],
       [  9.        ,  11.        ,   2.64575131,   3.        ],
       [  0.        ,  10.        ,   3.31662479,   3.        ],
       [ 12.        ,  13.        ,   3.71483512,   5.        ],
       [  6.        ,  14.        ,   4.12310563,   4.        ],
       [  4.        ,  16.        ,   4.17133072,   5.        ],
       [ 15.        ,  17.        ,   5.5136195 ,  10.        ]])

我认为 linkage() 的文档至少需要改进。


谢谢,我在文档中没有看到这个。但是我尝试直接输入我的矩阵(不是这个玩具数据,而是一个64x64x53160的矩阵),但它没有起作用。例如,从链接中得出的树状图无法绘制。 - user1603472
您的矩阵需要是二维的(即观测值 x 维度)。 - ali_m
没错。实际上,这不是问题所在,它已经被调整为正确的格式,但我犯了另一个非常愚蠢的编程错误,导致它出现了问题(使用相同的变量名表示两个不同的事物(!))。谢谢。 - user1603472

1

scipy.cluster.hierarchy.linkage(y, method)函数在y为距离矩阵或数据矩阵时,对于single、complete、average和weighted方法均返回正确结果。但是对于centroid、median和ward方法,y必须为数据矩阵,如果y为距离矩阵则会出现错误。我同意文档不够清晰。

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

inp = np.loadtxt('iris.txt',delimiter=",", usecols=(0,1,2,3))
x = np.asarray(inp)
Y = pdist(x,'euclidean')
res_linkage = linkage(x,"weighted")`

您可以通过将数据矩阵x或欧几里得距离矩阵Y输入到linkage()函数中来测试上述代码。
我还发现,与R中等效的实现"hclust"包相比,scipy.cluster.hierarchy.linkage对于质心、中位数和ward方法返回了不同的结果。看起来,当使用现有聚类更新新合并聚类的距离时,scipy.cluster.hierarchy.linkage存在一些错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接