我正在通过 blog 中的示例来理解推荐系统中使用的协同过滤方法。我遇到了表示为的余弦相似度
在 python 中使用 numpy 将其写为
def similarity(ratings, kind='user', epslion=1e-9):
if kind == 'user' :
sim = ratings.dot(ratings.T)
elif (kind=='item'):
sim = ratings.T.dot(ratings) + epslion
norms = np.array([np.sqrt(np.diagonal(sim))])
return (sim / norms / norms.T )
(sim / norms / norms.T )
如何等于 sim(u,u`)
提前感谢您的时间——如果我遗漏了任何东西,过分强调或过分强调某个特定点,请在评论中告诉我。
最佳答案
评分存储在 numpy 矩阵 ratings
中,其中行对应于用户(索引 u
),而列对应于项目(索引 i
)。由于您要计算 sim(u, u')
,即用户之间的相似性,让我们在下面假设 kind = 'user'
。
现在,让我们先看看没有平方根缩放因子的 r_{ui}r_{u'i}
。该表达式在 i
上求和,可以解释为 r
的矩阵乘法与 r
的转置,即:
\sum_i r_{ui}r_{u'i} = \sum_i r_{ui}(r^T)_{iu'} =: s_{uu'}
如上所述,让我们将结果矩阵表示为
s
(代码中的变量 sim
)。根据定义,该矩阵是对称的,其行/列标有“用户”索引 u/u'
。现在,缩放“因子”
f_{u} := \sqrt\sum_i r^2_{ui}
实际上是一个用 u
索引的向量(其中的每一项都是矩阵 r
对应行的欧几里德范数)。然而,在构造了 s_{uu'}
之后,我们可以看到 f_{u}
只不过是 \sqrt s_{uu}
。最后,感兴趣的相似因子是
s_{uu'}/f{u}/f{u'}
。发布的代码为所有索引 u/u'
计算此值,并将结果作为矩阵返回。为此,它:sim
(上面的矩阵 s
)计算为 ratings.dot(ratings.T)
f
)作为 np.sqrt(np.diagonal(sim))
s
进行行/列缩放,然后将其表示为二维数组 norms = np.array([np.sqrt(np.diagonal(sim))])
(注意您帖子中缺少的 []
) s_{uu'}/f{u}/f{u'}
计算为 sim / norms / norms.T
。在这里,由于 norms
的形状为 (1, num_of_users)
,因此第一个除法进行列缩放,而使用 norms.T
的除法缩放行。 关于python - 无法理解余弦相似度的python函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50038277/