0

我正在做一个关于电影数据集余弦相似度的项目,我对计算余弦相似度的公式感到困惑。

在此处输入图像描述

但是我在网上搜索,有些文章显示分母是这样的: sqrt(A1^2+B1^2) * sqrt(A2^2+B2^2) * ... * sqrt(Ai^2+Bi^2 )

我很困惑,有什么区别?哪一个是正确的,或者两者都是正确的?

4

1 回答 1

1

你图片上的那个是对的。在二维中,它源自余弦定律,该定律 将三角形一侧的长度与其他两侧的长度以及与 c 的相对角θ 相关联:

c^2==a^2+b^2-2*b*c(cos(theta))

您可以通过多种方式证明这一点,一个好的验证是知道当cos(gamma)==0(a 和 b 边正交)时,您得到勾股定理。要获得图像上的公式,您必须将其转换为解析几何(向量)

norm(A-B)^2==norm(A)^2+norm(B)^2−2*norm(A)*norm(B)*cos(theta)

并且通过使用该 norm(AB)^2 定义为 (AB)*(AB) 并扩展我们得到

norm(A-B)^2 ==norm(A)^2+norm(B)^2-2*A*B

因此,将两个表达式等同并进行取消,会产生

norm(A)*norm(B)*cos(theta) = A*B

这是您的定义(和)的(重新排列的)公式norm(v) = sqrt(v*v)。对于 n 维,您可以证明这是有效的,因为旋转欧几里得空间保留了范数和内积,并且因为向量跨越的 2D 平面恰好只是 xy 平面的旋转。

一个好的完整性检查是,正交性产生的余弦为 0,并且余弦在 0 和 1 之间(这是柯西施瓦茨定理

更新: 在您评论中提到的示例中,您可以通过运行查看博客中的结果

import sklearn.metrics.pairwise as pw
print(pw.cosine_similarity([[4,3]],[[5,5]]))
print(pw.cosine_similarity([[4,3,5]],[[5,5,1]]))

请注意,如果您运行:

from sklearn.metrics.pairwise import pairwise_distances
print(pairwise_distances([[4,3,5]],[[5,5,1]],metric='cosine')) 

你得到 0.208 而不是 0.792,这是因为使用余弦度量的 pairwise_distance 给出为1-cos(theta)(见0.208 + 0.7921)。您进行此转换是因为当您谈论距离时,您希望从一个点到它自身的距离为 0。

于 2019-06-15T00:30:21.987 回答