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

machine-learning - 我有两个公式计算“余弦相似度”,有什么区别?-LMLPHP

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

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

最佳答案

图像上的一个是正确的。在二维中,它是从Law of cosines派生的
它将三角形的一侧的长度与另一侧的长度以及与c相反的角度theta关联起来:

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)

通过使用规范(A-B)^ 2是定义(A-B)*(A-B)并展开
我们得到

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之间(此is the Cauchy Schwarz theorem

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

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.792为1)。之所以进行此变换,是因为在谈论距离时,您希望点到自身的距离为0。

关于machine-learning - 我有两个公式计算“余弦相似度”,有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56604737/

10-11 02:55