无法理解余弦相似度的 python 函数

Not able to understand python function of cosine similarity

我正在通过 blog 中的示例来了解推荐中使用的协同过滤方法 system.I 遇到表示为

的余弦相似度

在 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 )

Questions

  1. 代码中范数计算背后的数学原理是什么
  2. 等式
  3. 中的(sim / norms / norms.T )如何等于sim(u,u`)

提前感谢您抽出宝贵时间 - 如果我漏掉了任何内容,过分强调或低估了某个特定点,请在评论中告诉我。

评分存储在 numpy 矩阵 ratings 中,其中行对应于用户(索引 u),而列对应于项目(索引 i)。由于要计算sim(u, u'),即用户之间的相似度,下面假设kind = 'user'

现在,让我们先看看没有平方根比例因子的 r_{ui}r_{u'i}。该表达式在 i 上求和,可以解释为 rr 的转置的矩阵乘法,即:

\sum_i r_{ui}r_{u'i} = \sum_i r_{ui}(r^T)_{iu'} =: s_{uu'}

正如上面所做的那样,让我们​​将结果矩阵表示为 s(代码中的变量 sim)。该矩阵根据定义是对称的,其 rows/columns 标有 "user" 索引 u/u'.

现在,缩放"factor" f_{u} := \sqrt\sum_i r^2_{ui}实际上是一个用u索引的向量(其中的每一项都是矩阵相应行的欧几里德范数r).然而,构造了 s_{uu'},我们可以看到 f_{u} 就是 \sqrt s_{uu}.

最后,感兴趣的相似度是s_{uu'}/f{u}/f{u'}。 posted 代码为所有索引 u/u' 和 returns 计算结果作为矩阵。为此,它:

  1. 计算sim(上面的矩阵s)为ratings.dot(ratings.T)
  2. 得到其对角线的平方根(上面的向量f)为np.sqrt(np.diagonal(sim))
  3. 以有效的方式对 s 进行 row/column 缩放,然后将其表示为二维数组 norms = np.array([np.sqrt(np.diagonal(sim))])(注意缺少的 []你的 post)
  4. 最后,矩阵s_{uu'}/f{u}/f{u'}被计算为sim / norms / norms.T。这里,由于 norms 的形状为 (1, num_of_users),第一个除法进行列缩放,而 norms.T 的除法则对行进行缩放。