【问题标题】:Hierarchical Clustering with cosine similarity metric in fcluster packagefcluster 包中具有余弦相似度度量的层次聚类
【发布时间】:2015-08-09 21:00:03
【问题描述】:

我使用 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]] 

为了解决这个问题,我检查了 links() 函数,并且在其中我需要检查 _hierarchy.linkage() 方法。我使用 pycharm 文本编辑器,当我询问“链接”源代码时,它在目录中打开了一个名为“_hierarchy.py”的 python 文件,如下所示:

.PyCharm40/system/python_stubs/-1247972723/scipy/cluster/_hierarchy.py  

这个 python 文件没有对所有包含的函数进行任何定义。
我想知道这个函数的正确来源是什么来修改它,或者是否有另一种方法来解决这个问题。 我将不胜感激您的帮助和提示。

【问题讨论】:

    标签: linux python-2.7 cluster-analysis hierarchical-clustering cosine-similarity


    【解决方案1】:

    您的数据集中有一个零向量0 0。对于此类数据,余弦距离未定义,因此您使用了不合适的距离函数! 这是一个无法轻易弥补的定义差距。 inf0 一样不正确。到0 0 的距离用余弦不能在没有矛盾的情况下定义。您不得对此类数据使用余弦。

    回到你的实际问题:_hierarchy 是一个 Cython 模块。 不是纯python,而是编译成原生代码。您可以在 Github 上轻松查看源代码:

    https://github.com/scipy/scipy/blob/master/scipy/cluster/_hierarchy.pyx

    【讨论】:

    • 谢谢@Anony-Mousse。我在我的数据集中没有看到 0 0 向量!我应该更正我的代码的其他部分。也谢谢你的链接。你帮了我很多。
    • 你认为余弦距离为什么合适?
    • 我使用余弦距离对我的数据集进行层次聚类。之后我将对每个集群的所有元素进行总和。事实上,我正在寻找每个集群中的近似最大向量。然后,我认为余弦相似度度量可能是一个很好的度量。如下图所示:figure。您是否为我的案例建议其他指标?
    • 您可能误解了那张照片!一条线上的所有东西都被余弦认为是相同的(相同的角度!)
    猜你喜欢
    • 2012-06-24
    • 2015-07-17
    • 2011-08-16
    • 2020-08-12
    • 2011-01-01
    • 2019-08-06
    • 2018-10-17
    • 2013-05-24
    相关资源
    最近更新 更多