我有两个计算'cosine similarity'的公式,有什么区别?

I have two formulas for calculating 'cosine similarity', what's the difference?

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

但是我在网上查了一下,有些文章说分母是这样的: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)

并且通过使用 norm(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 维,您可以证明这是有效的,因为旋转欧氏 space 保留范数和内积,并且因为向量跨越的 2D 平面恰好只是 xy 平面的旋转。

一个好的健全性检查是,再次正交性产生余弦 0,并且余弦在 0 和 1 之间(这个 is the Cauchy Schwarz theorem

更新: 在您的评论中提到的示例中,您可以看到 运行ning

博客的结果
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。