【问题标题】:Cosine similarity output different scipy vs sklearn余弦相似度输出不同的scipy vs sklearn
【发布时间】:2019-09-01 13:36:48
【问题描述】:

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

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】:

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

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

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

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

    虽然scipy.spatial.distance.cosine 说:

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

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

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

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

    基本上,你有1 - cosine_sklearn = cosine_scipy

    【讨论】:

    • 如果能修正数学公式就更好了。不错的答案!
    • 您的意思是 没有出现吗?我解决了这个问题(我想降价处理器将它识别为 HTML 标签,所以它没有显示?)。不过,我不能让 $X$ 在这个网站上看起来像 LaTeX。
    • 它说您可以使用第三方服务插入图像:meta.stackexchange.com/questions/76902/…
    • 这是否意味着 sklearn 是一种相似性度量,而 scipy 是一种相异性度量?
    • 我并没有真正考虑过这一点,但是,是的,这些名字告诉你他们在做什么:在 sklearn 你有余弦 相似度 但在 scipy 中有余弦距离。所以如果 $X = Y$ 则相似度为 1 但距离为 0。
    猜你喜欢
    • 2020-08-12
    • 2016-08-28
    • 2012-11-20
    • 1970-01-01
    • 1970-01-01
    • 2011-01-01
    • 2011-03-08
    • 2017-12-12
    相关资源
    最近更新 更多