我试图理解这个优化的代码以找到用户矩阵之间的余弦相似度。
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 来计算余弦相似度?
任何帮助表示赞赏。
最佳答案
通过代码,我们有:
这意味着,sim
的对角线之一矩阵我们有每列相乘的结果。
如果你想使用一个简单的矩阵,你可以试一试:
您可以轻松检查此 gram matrix (这就是矩阵产品的命名方式)具有此属性。
现在代码定义了 norms
这只不过是一个数组,取我们 gram matrix
的对角线并在它的每个元素上应用一个 sqrt。
这将为我们提供一个包含每列的范数值的数组:
所以基本上是norms
向量包含 result
每一列的范数值矩阵。
一旦我们拥有所有这些数据,我们就可以评估这些用户之间的余弦相似度,因此我们知道余弦相似度的评估方式如下:
注意 :
所以我们有我们的相似性将是:
所以我们只需要用我们的代码变量替换这些术语就可以得到:
这解释了为什么你有这行代码:
return sim / norms / norms.T
编辑:
由于似乎我不清楚,所以每次我在这个答案中谈论矩阵乘法时,我都指的是
DOT PRODUCT
两个矩阵。This actually means that when it's written A*B we actually develop and solve as A.T * B
关于python - 余弦相似度优化实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43087011/