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

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  ]

标称值等于= [1 ^ 2 + 5 ^ 2 + 9 ^ 2]

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

最佳答案

通过代码,我们得到:

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

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

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

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

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

因此,基本上norms向量包含result矩阵的每一列的范数。

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

注意 :

因此,我们的相似性将是:

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

这说明了为什么要有以下代码行:

return sim / norms / norms.T

编辑:
由于似乎我不清楚,因此每次在此答案中谈论矩阵乘法时,我都会引用两个矩阵的DOT PRODUCT

关于python - 余弦相似度优化实现,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43087011/

10-13 08:09