首页 > 解决方案 > 余弦相似度输出不同的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 范数似乎没有区别

标签: pythonscikit-learncosine-similarity

解决方案


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

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

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

$余弦(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 范数。

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

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


推荐阅读