矩阵分解
Question
下面有几部电影以及不同的用户给他们的评分
A | B | C | D | |
---|---|---|---|---|
U1 | 5 | 3 | 0 | 1 |
U2 | 4 | 0 | 0 | 1 |
U2 | 1 | 1 | 0 | 5 |
U4 | 1 | 0 | 0 | 4 |
U5 | 0 | 1 | 5 | 4 |
A,B,C,D代表不同的电影。U代表用户,在这里电影的评分最高为5分,0代表该位用户没有看过这部电影,我们的目的就是通过矩阵分解预测该位用户对该电影的评分。
Talk about
我们如何用矩阵分解来解决问题呢,简单来说就是:我们把原始矩阵分解成两个矩阵,然后这两个矩阵的乘积的结果为我们所预测的结果,那么我们用什么来进行呢,在这里用梯度下降来解决,我们都知道要进行梯度下降,肯定要对其求导,然后再不断迭代,所以我们首先需要构造损失函数。
Loss Function
构造损失函数
以上面的评分为例来说明:使用原有的评分矩阵Rm×n与重新构建的评分矩阵R^m×n进行相减求的误差的平方作为损失函数,即为
$$
e_{ij}^2=(r_{ij}-r_{ij}*)^2=(r_{ij}-\sum_{i=1}^np_{ik}q_{kj})^2
$$
对损失函数求导
$$
\frac{\partial}{p_{ik}}e^2_{ij}=2(r_{ij}-\sum_{i=1}^np_{ik}q_{kj})(-q_{kj})=-2e_{ij}q_{kj}
$$
$$
\frac{\partial}{q_{kj}}e^2_{ij}=2(r_{ij}-\sum_{i=1}^np_{ik}q_{kj})(-p_{ik})=-2e_{ij}p_{ik}
$$
根据负梯度的方向更新变量
$$
p_{ik}=p_{ik}-\alpha\frac{\partial}{p_{ik}}e^2_{ij}=p_{ik}+2\alpha e_{ij}q_{kj}
$$
$$
q_{kj}=q_{kj}-\alpha\frac{\partial}{q_{kj}}e^2_{ij}=q_{kj}+2\alpha e_{ij}p_{ik}
$$
通过不断迭代,不断更新值,可以通过迭代次数和阈值作为限制条件,下面是对上面例子的代码
代码
1 | from math import * |
代码结果
1 | 输出原矩阵: |
在结果中,从0到现在的评分,而现在的评分便是根据矩阵分解来预测的值,每次运行的结果都不会一样,大家可以自己在电脑上跑一遍。
Assignment
Question
音乐A | 音乐B | 音乐C | 音乐D | |
---|---|---|---|---|
张三 | 2 | 1 | 0 | 0 |
李四 | 0 | 1 | 1 | 0 |
王五 | 0 | 0 | 1 | 1 |
用矩阵分解来解决问题,并且预测评分为0的该为用户的评分
Code
代码:
1 | import random |
运行结果:
1 | 输出原矩阵: |