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

Cosine similarity output different scipy vs sklearn

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

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范数的区别

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

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

Compute cosine similarity between samples in X and Y. Cosine similarity, or the cosine kernel, computes similarity as the normalized dot product of X and Y:

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

虽然 scipy.spatial.distance.cosine 说:

The Cosine distance between X and Y, is defined as

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

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

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

基本上,你有 1 - cosine_sklearn = cosine_scipy.