我试图理解这种优化的代码,以找到用户矩阵之间的余弦相似度。
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/