不同库的余弦相似度输出不同

Posted

技术标签:

【中文标题】不同库的余弦相似度输出不同【英文标题】:Cosine similarity output different for different libraries 【发布时间】:2016-08-28 03:44:51 【问题描述】:

我试图找到两个 n 维向量之间的余弦距离。我通过使用 scipy 和 sklearn 来做到这一点。不知何故,这两个库的输出是不同的。我无法理解为什么。

import numpy as np
from scipy import spatial
from sklearn import metrics
a=np.array([1,2,3,4])
b=np.array([2,3,1,4])
X=np.array([a,b])
print spatial.distance.pdist(X,'cosine')[0]
print metrics.pairwise.cosine_similarity(a,b)[0][0]
print metrics.pairwise_distances(np.reshape(a,(1,4)),np.reshape(b,(1,4)),metric = 'cosine')[0][0]

这段代码的输出如下:

0.1

0.9

0.1

【问题讨论】:

我相信0.9ab之间夹角的余弦值。 【参考方案1】:

不同之处在于,一次计算余弦距离spatial.distance.pdistmetrics.pairwise_distances),而另一次计算余弦相似度(@987654324 @)。

所以cosine_distance = 1 - cosine_similarity,这就解释了为什么您的示例中两个数据点之间的distance0.1,而两者之间的similarity0.9

scipy一般是计算距离的,如果你看docs,余弦距离实际上定义为1 - cosine_similarity那里。

【讨论】:

这很有意义。至少对于这个例子。但是在 pdist 和成对距离的情况下,我得到的输出大于 1.0。这让我更加困惑。我真的应该举一个不同的例子。 你能提供那个例子吗?在任何情况下,cosine similarity 仅在您的特征向量不包含负值的情况下定义在[0, 1] 范围内(因此对于只有正值的特征向量,角度不会大于 90º)。 我的特征向量确实包含负值。我刚检查过。 pdist 结果为 1.07250622457,而 cosine_similarity 的输出为 -0.0725063。所以我发现这两个函数的定义范围是不同的。他们在做同样的事情。谢谢。

以上是关于不同库的余弦相似度输出不同的主要内容,如果未能解决你的问题,请参考以下文章

不同长度向量的余弦相似度?

scikit learn中两种不同矢量化技术的余弦相似度得分相同

为啥 word2Vec 使用余弦相似度?

R中的余弦相似度矩阵

使用余弦相似度对文档进行分类

TF-IDF 和余弦相似度的替代方案(比较不同格式的文档)