我使用scipy.cluster.hierarchy对一组使用“余弦”相似性度量的点进行分层聚类。例如,我有:

import scipy.cluster.hierarchy as hac
import matplotlib.pyplot as plt

Points =
  np.array([[ 0.         , 0.23508573],
 [ 0.00754775 , 0.26717266],
 [ 0.00595464 , 0.27775905],
 [ 0.01220563 , 0.23622067],
 [ 0.00542628 , 0.14185873],
 [ 0.03078922 , 0.11273108],
 [ 0.06707743 ,-0.1061131 ],
 [ 0.04411757 ,-0.10775407],
 [ 0.01349434 , 0.00112159],
 [ 0.04066034 , 0.11639591],
 [ 0.         , 0.29046682],
 [ 0.07338036 , 0.00609912],
 [ 0.01864988 , 0.0316196 ],
 [ 0.         , 0.07270636],
 [ 0.         ,  0.        ]])


z = hac.linkage(Points, metric='cosine', method='complete')
labels = hac.fcluster(z, 0.1, criterion="distance")


plt.scatter(Points[:, 0], Points[:, 1], c=labels.astype(np.float))
plt.show()

由于我使用余弦度量,在某些情况下,两个向量的点积可以是负的,或者某些向量的范数可以是零。这意味着z输出将包含一些对fcluster无效的负元素或无限元素(如下所示):
z =
[[  0.00000000e+00   1.00000000e+01   0.00000000e+00   2.00000000e+00]
[  1.30000000e+01   1.50000000e+01   0.00000000e+00   3.00000000e+00]
[  8.00000000e+00   1.10000000e+01   4.26658708e-13   2.00000000e+00]
[  1.00000000e+00   2.00000000e+00   2.31748880e-05   2.00000000e+00]
[  3.00000000e+00   4.00000000e+00   8.96700489e-05   2.00000000e+00]
[  1.60000000e+01   1.80000000e+01   3.98805492e-04   5.00000000e+00]
[  1.90000000e+01   2.00000000e+01   1.33225099e-03   7.00000000e+00]
[  5.00000000e+00   9.00000000e+00   2.41120340e-03   2.00000000e+00]
[  6.00000000e+00   7.00000000e+00   1.52914684e-02   2.00000000e+00]
[  1.20000000e+01   2.20000000e+01   3.52441432e-02   3.00000000e+00]
[  2.10000000e+01   2.40000000e+01   1.38662986e-01   1.00000000e+01]
[  1.70000000e+01   2.30000000e+01   6.99056531e-01   4.00000000e+00]
[  2.50000000e+01   2.60000000e+01   1.92543748e+00   1.40000000e+01]
[ -1.00000000e+00   2.70000000e+01              inf   1.50000000e+01]]

为了解决这个问题,我检查了linkage()函数,在它里面我需要检查hierarchy.linkage()方法。我使用pycharm文本编辑器,当我要求“linkage”源代码时,它在目录中打开了一个python文件,即“_hierarchy.py”,如下所示:
.PyCharm40/system/python_stubs/-1247972723/scipy/cluster/_hierarchy.py

这个python文件没有任何包含函数的定义。
我想知道这个函数的正确来源是什么来修改它,还是有其他方法来解决这个问题。
我将感谢你的帮助和提示。

最佳答案

数据集中有一个零向量0 0。对于这样的数据,余弦距离是未定义的,所以您使用了一个不合适的距离函数!
这是一个定义上的鸿沟,不可能一蹴而就。inf0一样不正确。余弦到0 0的距离不能在没有矛盾的情况下定义。你不能在这些数据上使用余弦。
回到你的实际问题:_hierarchy是一个cython模块。它不是纯python,而是编译成本机代码的。您可以很容易地在github上看到源代码:
https://github.com/scipy/scipy/blob/master/scipy/cluster/_hierarchy.pyx

关于linux - fcluster程序包中具有余弦相似度度量的分层聚类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30488156/

10-13 03:36