余弦相似度优化实现

Man*_*mar 5 python optimization mathematical-optimization python-2.7

我试图理解这个优化的代码,以找到用户矩阵之间的余弦相似性.

def fast_similarity(ratings,epsilon=1e-9):
    # epsilon -> small number for handling dived-by-zero errors
    sim = ratings.T.dot(ratings) + epsilon
    norms = np.array([np.sqrt(np.diagonal(sim))])
    return (sim / norms / norms.T)
Run Code Online (Sandbox Code Playgroud)

如果评级=

           items           
     u  [
     s    [1,2,3]
     e    [4,5,6]
     r    [7,8,9] 
     s  ]
Run Code Online (Sandbox Code Playgroud)

提名者将等于= [1 ^ 2 + 5 ^ 2 + 9 ^ 2]

但为什么我们要编写sim/norms/norms.T来计算余弦相似度?任何帮助表示赞赏.

rak*_*aht 4

通过代码我们可以得到:

第一的

这意味着,在sim矩阵的对角线上,我们得到了每一列相乘的结果。

如果您想使用简单的矩阵,您可以尝试一下:

第二

您可以轻松检查该克矩阵(这就是该矩阵乘积的命名方式)是否具有此属性。

现在代码定义了norms一个数组,它采用我们的对角线gram matrix并对它的每个元素应用 sqrt。

这将为我们提供一个包含每列范数的数组:

第三

所以基本上norms向量包含矩阵每一列的范数值result

一旦我们拥有了所有这些数据,我们就可以评估这些用户之间的余弦相似度,所以我们知道余弦相似度的评估如下:

向前

注意 : 第五

所以我们的相似点是:

六

因此,我们只需用代码变量替换这些术语即可得到:

七

这解释了为什么你有这行代码:

return sim / norms / norms.T
Run Code Online (Sandbox Code Playgroud)

编辑: 因为我似乎不清楚,所以每次我在这个答案中谈论矩阵乘法时,我都会提到DOT PRODUCT两个矩阵的乘法。

这实际上意味着当它写成 A*B 时,我们实际上开发并解决为 AT * B