不同库的余弦相似度输出不同
Cosine similarity output different for different libraries
我正在尝试求两个 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
区别在于,一次计算余弦距离(spatial.distance.pdist
,metrics.pairwise_distances
),而另一次计算余弦相似度 (metrics.pairwise.cosine_similarity
).
所以cosine_distance = 1 - cosine_similarity
,这就解释了为什么你的例子中两个数据点之间的distance
是0.1
,而两者之间的similarity
是0.9
.
scipy
一般是计算距离,如果你看docs,余弦距离实际上定义为1 - cosine_similarity
我正在尝试求两个 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
区别在于,一次计算余弦距离(spatial.distance.pdist
,metrics.pairwise_distances
),而另一次计算余弦相似度 (metrics.pairwise.cosine_similarity
).
所以cosine_distance = 1 - cosine_similarity
,这就解释了为什么你的例子中两个数据点之间的distance
是0.1
,而两者之间的similarity
是0.9
.
scipy
一般是计算距离,如果你看docs,余弦距离实际上定义为1 - cosine_similarity