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

标签 machine-learning data-analysis cosine-similarity recommendation-engine

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

enter image description here

但是我上网查了一下,有些文章显示分母是这样的: 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 边正交)时,您就得到了毕达哥拉斯定理。 要获得图像上的公式,您必须将其转换为解析几何(向量)

范数(A-B)^2==范数(A)^2+范数(B)^2−2*范数(A)*范数(B)*cos(θ)

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

范数(A-B)^2 ==范数(A)^2+范数(B)^2-2*A*B

因此,使两个表达式相等并进行取消,得到

范数(A)*范数(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 - 我有两个计算 'cosine similarity' 的公式,有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56604737/

相关文章:

python - 从 GPU 核心/线程的角度理解 Theano 示例

python - TensorFlow 神经网络输出线性函数

python - 如何根据pandas数据框中其他列的应用条件提取列值

python - 当条形分组时显示条形的值

JavaScript JSON 组合和数据 Anylish

python - 如何将 Pandas 数据框中的字符串值替换为整数?

python - 如何查找两行数据之间的相似性

machine-learning - 根据给定事件的持续时间,如何将人员聚集/分组在一起?

python - 如何显示一个句子中下一个单词的多个预测?

python - 与 numpy 的大型稀疏矩阵的余弦相似度