Python 余弦相似性输出不同的scipy与sklearn

Python 余弦相似性输出不同的scipy与sklearn,python,scikit-learn,cosine-similarity,Python,Scikit Learn,Cosine Similarity,我确信我忽略了一些东西,但是为什么这些输出不同呢 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

我确信我忽略了一些东西,但是为什么这些输出不同呢

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\u相似度的文档字符串表示:

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

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

scipy.space.distance.cosine
表示:

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

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

其中$$是介于$X$和$Y$之间的点积,$| | X | |是L2规范

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


基本上,您有
1-cosine\u sklearn=cosine\u scipy

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

sklearn.metrics.pairwise.cosine\u相似度的文档字符串表示:

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

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

scipy.space.distance.cosine
表示:

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

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

其中$$是介于$X$和$Y$之间的点积,$| | X | |是L2规范

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


基本上,你有
1-cosine\u sklearn=cosine\u scipy

如果你能修正数学公式,效果会更好。回答得好!你是说不来吗?我修复了这个问题(我想降价处理器会将它识别为HTML标记,所以它不会显示?)。不过,我不能让$X$在这个网站上看起来像LaTeX。它说你可以使用第三方服务插入图像:这是否意味着sklearn是一种相似性的度量,而scipy是一种不同性的度量?我真的没有想到这一点,但是的,名字告诉你他们在做什么:在
sklearn
中,你有余弦相似性,但在scipy中有余弦距离。因此,如果$X=Y$,那么相似度是1,但距离是0。如果你能修正数学公式,可能会更好。回答得好!你是说不来吗?我修复了这个问题(我想降价处理器会将它识别为HTML标记,所以它不会显示?)。不过,我不能让$X$在这个网站上看起来像LaTeX。它说你可以使用第三方服务插入图像:这是否意味着sklearn是一种相似性的度量,而scipy是一种不同性的度量?我真的没有想到这一点,但是的,名字告诉你他们在做什么:在
sklearn
中,你有余弦相似性,但在scipy中有余弦距离。因此,如果$X=Y$,那么相似度为1,但距离为0。