无法理解余弦相似度的 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
- 代码中范数计算背后的数学原理是什么
- 等式
中的(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
)。该矩阵根据定义是对称的,其 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 计算结果作为矩阵。为此,它:
- 计算
sim
(上面的矩阵s
)为ratings.dot(ratings.T)
- 得到其对角线的平方根(上面的向量
f
)为np.sqrt(np.diagonal(sim))
- 以有效的方式对
s
进行 row/column 缩放,然后将其表示为二维数组 norms = np.array([np.sqrt(np.diagonal(sim))])
(注意缺少的 []
你的 post)
- 最后,矩阵
s_{uu'}/f{u}/f{u'}
被计算为sim / norms / norms.T
。这里,由于 norms
的形状为 (1, num_of_users)
,第一个除法进行列缩放,而 norms.T
的除法则对行进行缩放。
我正在通过 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
- 代码中范数计算背后的数学原理是什么
- 等式 中的
(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
)。该矩阵根据定义是对称的,其 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 计算结果作为矩阵。为此,它:
- 计算
sim
(上面的矩阵s
)为ratings.dot(ratings.T)
- 得到其对角线的平方根(上面的向量
f
)为np.sqrt(np.diagonal(sim))
- 以有效的方式对
s
进行 row/column 缩放,然后将其表示为二维数组norms = np.array([np.sqrt(np.diagonal(sim))])
(注意缺少的[]
你的 post) - 最后,矩阵
s_{uu'}/f{u}/f{u'}
被计算为sim / norms / norms.T
。这里,由于norms
的形状为(1, num_of_users)
,第一个除法进行列缩放,而norms.T
的除法则对行进行缩放。