欢迎光临散文网 会员登陆 & 注册

推荐系统中的矩阵补全算法

2022-11-20 00:47 作者:021usc  | 我要投稿

数据来源

电影数据

在推荐系统中,评分预测问题是最基本的问题。以用户电影评分为例,也就是这个用户-电影矩阵。

Fig1. 推荐系统评分预测问题

图1中是用户对电影的评分,但评分有缺失,因为用户不可能对所有电影作出评价。那么推荐问题就是给用户合理推荐一个没看过的电影,合理是指,预测用户应该对这部电影评分较高.然后这个问题就变成了矩阵补全,也就是填充表中的问号。  

图像数据

图像修复:简单来说就是通过矩阵填补模型将“打码”的图片修复成原来的图片,如下图所示:

Fig2.  图像修复

图2中,图像包含了很多的噪声,可以通过一些方法,如RPCA将图像进行恢复,或者将一些缺失的地方进行填充。



低秩矩阵分解

矩阵的补全有无数种可能,所以如果不对用户-电影矩阵(记为Y)的性质作出一定假设,那这个恢复问题就不可能完成。所以首先作出的假设是Y是低秩的,如果Y是低秩的,那么Y就能够由两个较小的矩阵线性组合而来。

Y%20%3D%20P%C3%97Q%5ET

假设Y矩阵维度,即有n_m%C3%97n_u部电影和n_u个用户,P的维度是n_m%C3%97k ,Q的维度是n_u%C3%97k,k是特征的维度,也就是Y的秩,上式如果画出来就是这样。

Fig3. 矩阵分解

这表示了一个电影对应一个k维特征,一个用户对应了k个参数,反映出有用户对电影的K维特征的喜好程度。然后每个评分都可以看做是用户参数和电影特征的点积。试想如果我们得到了P和Q两个矩阵,我们就能对Y矩阵中的缺失值进行预测。以上问题可以用梯度下降来求解,因此我们可以构造误差函数,并能计算偏导。

E%3D%5Csum_%7Bl%2C%20j%3A%20r(i%2C%20j)%3D1%7D%20e_%7Bi%2C%20j%7D%3D%5Csum_%7Bi%2C%20j%3A%20r(i%2C%20j)%3D1%7D%20y%5E%7B(i%2C%20j)%7D-%5Csum_%7Bk%3D1%7D%5E%7BK%7D%20p_%7Bi%20k%7D%20q_%7Bk%20j%7D%2B%5Cfrac%7B%5Clambda%7D%7B2%7D%20%5Csum_%7Bi%2C%20j%3A%20r(i%2C%20j)%3D1%7D%20%5Csum_%7Bk%3D1%7D%5E%7BK%7D%5Cleft(%5C%7CP%5C%7C%5E%7B2%7D%2B%5C%7CQ%5C%7C%5E%7B2%7D%5Cright)

这个误差函数的意义是对于Y矩阵中存在的值,用P和Q乘积计算出预测值,让它们之间误差最小.当然,还加入了针对P和Q的L2正则项.这个误差函数对P和Q中每一项的偏导如下:

%5Cbegin%7Barray%7D%7Bl%7D%0A%0Ap_%7Bi%20k%7D%3Dp_%7Bi%20k%7D%2B%5Calpha%5Cleft(2%20e_%7Bi%20j%7D%20q_%7Bk%20j%7D-%5Clambda%20p_%7Bi%20k%7D%5Cright)%20%5C%5C%0A%0Aq_%7Bi%20k%7D%3Dq_%7Bi%20k%7D%2B%5Calpha%5Cleft(2%20e_%7Bi%20j%7D%20p_%7Bi%20k%7D-%5Clambda%20q_%7Bk%20j%7D%5Cright)%0A%0A%5Cend%7Barray%7D

然后迭代求解即可。

协同过滤  

这个算法本质上和低秩矩阵分解一样,但它里面的K维特征具有现实意义。一个电影的K维特征,就是它对应于K种电影风格的分量,比如只有两种风格的时候:

设一个电影的k维特征向量为x%3D%5Bx_1%2Cx_2%2C%E2%80%A6%2Cx_k%5D,那么就应该存在一个用户参数向量%CE%B8%3D%5B%CE%B8_1%2C%CE%B8_2%2C%E2%80%A6%2C%CE%B8_k%5D。这实际上和矩阵分解里的P和Q意义相同。

但实际情况是,这个电影特征无法得到,还是要通过迭代算出来。针对电影特征和用户参数,对应了两个代价函数。


%5Coperatorname%7Bcost%7D_%7B%5Ctheta%7D%3D%5Cfrac%7B1%7D%7B2%7D%20%5Csum_%7Bj%3D1%7D%5E%7Bn_%7Bu%7D%7D%20%5Csum_%7Bi%3A%20r(i%2C%20j)%3D1%7D%5Cleft(%5Cleft(%5Ctheta%5E%7B(j)%7D%5Cright)%5E%7BT%7D%20x%5E%7B(i)%7D-y%5E%7B(i%2C%20j)%7D%5Cright)%5E%7B2%7D%2B%5Cfrac%7B%5Clambda%7D%7B2%7D%20%5Csum_%7Bj%3D1%7D%5E%7Bn_%7Bu%7D%7D%20%5Csum_%7Bk%3D1%7D%5E%7Bn%7D%5Cleft(%5Ctheta_%7Bk%7D%5E%7B(j)%7D%5Cright)%5E%7B2%7D

%5Coperatorname%7Bcost%7D_%7Bx%7D%3D%5Cfrac%7B1%7D%7B2%7D%20%5Csum_%7Bi%3D1%7D%5E%7Bn_%7Bm%7D%7D%20%5Csum_%7Bj%3A%20r(i%2C%20j)%3D1%7D%5Cleft(%5Cleft(%5Ctheta%5E%7B(j)%7D%5Cright)%5E%7BT%7D%20x%5E%7B(i)%7D-y%5E%7B(i%2C%20j)%7D%5Cright)%5E%7B2%7D%2B%5Cfrac%7B%5Clambda%7D%7B2%7D%20%5Csum_%7Bi%3D1%7D%5E%7Bn_%7Bm%7D%7D%20%5Csum_%7Bk%3D1%7D%5E%7Bn%7D%5Cleft(x_%7Bk%7D%5E%7B(i)%7D%5Cright)%5E%7B2%7D

再分别求导,用梯度下降迭代至收敛即可。

核范数矩阵补全

图像恢复里经常有这种问题,比如图像被随机采样,试图从随机采样的图像恢复出原图。首先它将问题定义为,认为用户-电影矩阵是由一个完全矩阵A下采样而来,而且还加上了噪音L就是那个下采样变换。

Fig4. RPCA求秩最小

然后问题的解就是要求秩最小,如下:

%5Cmin%20_%7BA%7D%20%5Coperatorname%7Brank%7D(A)%20%5Ctext%20%7B%20subject%20to%20%7D%20L(A)%3DD

%5Cmin%20_%7BA%2C%20E%7D%20%5Coperatorname%7Brank%7D(A)%2B%5Clambda%5C%7CE%5C%7C_%7B0%7D%20%5Cquad%20%5Ctext%20%7B%20s.t.%20%7D%20A%2BE%3DD

但直接去优化秩太困难了,这是一个NP难问题,但可以通过核范数近似求解,核范数就是矩阵的奇异值之和。

%5Cmin%20_%7BX%7D%5C%7CX%5C%7C%20%5Ctext%20%7B.%20subject%20to%20%7D%20L(X)%3DY

%5Cmin%20_%7BA%2C%20E%7D%5C%7CA%5C%7C_%7B*%7D%2B%5Clambda%5C%7CE%5C%7C_%7B1%7D%20%5Cquad%20%5Ctext%20%7B%20s.t.%20%7D%20%5Cquad%20A%2BE%3DD

代码

代码生成低秩数据

通过一些参数可以生成相应的低秩数据集,并通过算法将该数据恢复。


参考

[机器学习矩阵分解解析Recommender.Matrix.Factorization - 简书 (jianshu.com)](https://www.jianshu.com/p/2fc8850e4a1c)


推荐系统中的矩阵补全算法的评论 (共 条)

分享到微博请遵守国家法律