余弦相似度优化实现

时间:2017-03-29 07:25:17

标签: python python-2.7 optimization mathematical-optimization

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

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)

如果评级=

           items           
     u  [
     s    [1,2,3]
     e    [4,5,6]
     r    [7,8,9] 
     s  ]

nomrs将等于= [1 ^ 2 + 5 ^ 2 + 9 ^ 2]

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

1 个答案:

答案 0 :(得分:4)

完成我们的代码:

first

这意味着,sim矩阵的对角线之一,我们得到每列乘法的结果。

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

second

您可以轻松检查此gram matrix(该矩阵产品的命名方式)是否具有此属性。

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

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

third

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

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

forth

请注意: fifth

所以我们的相似之处将是:

six

所以我们只需用我们的代码变量替换这些术语来获取:

seven

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

return sim / norms / norms.T

修改 由于我似乎并不清楚,每次我在这个答案中谈论矩阵乘法时,我都在考虑两个矩阵的DOT PRODUCT

  

这实际上意味着当它写成A * B时我们实际上正在开发和   解决为A.T * B