我试图了解这个优化的代码,以找出用户矩阵之间的余弦相似性。
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来计算余弦相似度? 任何帮助表示赞赏。
答案 0 :(得分:4)
完成我们的代码:
这意味着,sim
矩阵的对角线之一,我们得到每列乘法的结果。
如果您想使用简单的矩阵,可以尝试一下:
您可以轻松检查此gram matrix(该矩阵产品的命名方式)是否具有此属性。
现在代码定义了norms
,它只是一个采用gram matrix
对角线的数组,并在每个元素上应用一个sqrt。
这将为我们提供一个包含每列的标准值的数组:
基本上norms
向量包含result
矩阵的每列的范数值。
一旦我们获得了所有这些数据,我们就可以评估这些用户之间的余弦相似度,因此我们知道余弦相似度的评估如下:
请注意:
所以我们的相似之处将是:
所以我们只需用我们的代码变量替换这些术语来获取:
这解释了为什么你有这行代码:
return sim / norms / norms.T
修改强>
由于我似乎并不清楚,每次我在这个答案中谈论矩阵乘法时,我都在考虑两个矩阵的DOT PRODUCT
。
这实际上意味着当它写成A * B时我们实际上正在开发和 解决为A.T * B