我正在通过 blog 中的示例来理解推荐系统中使用的协同过滤方法。我遇到了表示为的余弦相似度

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

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

    10-12 01:13