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