不同库的余弦相似度输出不同
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.9
是a
和b
之间夹角的余弦值。
【参考方案1】:
不同之处在于,一次计算余弦距离(spatial.distance.pdist
,metrics.pairwise_distances
),而另一次计算余弦相似度(@987654324 @)。
所以cosine_distance = 1 - cosine_similarity
,这就解释了为什么您的示例中两个数据点之间的distance
是0.1
,而两者之间的similarity
是0.9
。
scipy
一般是计算距离的,如果你看docs,余弦距离实际上定义为1 - cosine_similarity
那里。
【讨论】:
这很有意义。至少对于这个例子。但是在 pdist 和成对距离的情况下,我得到的输出大于 1.0。这让我更加困惑。我真的应该举一个不同的例子。 你能提供那个例子吗?在任何情况下,cosine similarity
仅在您的特征向量不包含负值的情况下定义在[0, 1]
范围内(因此对于只有正值的特征向量,角度不会大于 90º)。
我的特征向量确实包含负值。我刚检查过。 pdist 结果为 1.07250622457,而 cosine_similarity 的输出为 -0.0725063。所以我发现这两个函数的定义范围是不同的。他们在做同样的事情。谢谢。以上是关于不同库的余弦相似度输出不同的主要内容,如果未能解决你的问题,请参考以下文章