余弦相似度输出不同的scipy vs sklearn

问题描述 投票:0回答:1

我确定我忽略了一些东西,但为什么这些输出会有所不同?

scikit学习

from sklearn.metrics.pairwise import cosine_similarity
cosine_similarity([[3,5,1]],[[1,2,3]])

### output `array([[0.72280632]])`

SciPy的

from scipy.spatial.distance import cosine
cosine([3,5,1],[1,2,3])

### output 0.27719367767579906

为什么这些不一样?根据我的计算,似乎不是在分母中使用L1或L2范数之间的区别

python scikit-learn cosine-similarity
1个回答
2
投票

他们使用的余弦距离的定义是不同的。

sklearn.metrics.pairwise.cosine_similarity的文档字符串说:

计算X和Y中样本之间的余弦相似度。余弦相似度或余弦核计算相似度作为X和Y的归一化点积:

$ cosine(X,Y)= <X,Y> /(|| X || * || Y ||)$

虽然scipy.spatial.distance.cosine说:

X和Y之间的余弦距离定义为

$ cosine(X,Y)= 1 - <X,Y> /(|| X || * || Y ||)$。

其中$ <X,Y> $是$ X $和$ Y $之间的点积,$ || X || $是L2规范。

(我更改了doc字符串,使用相同的变量名和数学约定,以便于比较。)

基本上,你有1 - cosine_sklearn = cosine_scipy

© www.soinside.com 2019 - 2024. All rights reserved.