您的位置:首页 > 其它

实战智能推荐系统(2)-- Funk-SVD 矩阵分解及其正则化

2018-03-14 15:36 323 查看

SVD矩阵分解简介

矩阵 A(U*I) 假设如下所示
1 2 4 ? 7 1 ....
2 4 ? 7 3 4 ....
...
...
假设这个矩阵是一个U*I 的矩阵,U表示用户,I 表示产品,里面的数字表示 用户U 对产品 I 的评分,问号表示评分未知。那么我们怎么样才能根据这个已知的评分预测未知的评分呢?其中之一的可行方案就是 SVD矩阵分解。

矩阵分解的理论就是任意一个矩阵都有它的满秩分解。



A表示上述矩阵,X和Y则代表分解矩阵,假设用 P 代表X中的元素,用 Q代表 Y中的元素,则矩阵A的元素的值为:




表示 X 矩阵u行的列矩阵的转置,Qi 表示第i列的矩阵

如果我们可以得到这样的矩阵 X 和 Y,使得对于已知的评分误差最小,那么我们就可以用 X 和 Y 矩阵来预测未知的评分值。误差可以表示成公式:



其中

表示已知的评分值,而

则是前面矩阵计算值。
 


我们可以用SSE 来代表 X,Y分解越接近 A 的程度,SSE越小则越接近,于是算法的分解过程就是 优化SSE 值的一个过程。

梯度下降算法优化误差值

关于如何降低SSE,通常采用梯度下降算法,如图



关于梯度下降算法可以这么解释,函数在参数上的导数我们称之为梯度,要减少函数值,必须往负梯度方向进行探索,但是往往可能掉入局部最优解而不是全局最优解,这跟参数的初始化位置有很大的关系。
现在我们回到SVD的误差公式 SSE,SSE很明显有 U*K + K*I 个参数,我们先对 X 矩阵中的点进行梯度求解




就是 X 矩阵上的参数点,将 

 代入,则



所以得到





现在得到目标函数在 X 矩阵和 Y矩阵上参数的梯度了,假设学习率为 

,则我们可以得到更新后Puk 和 Qki 的值为





这就是梯度下降算法中参数更新的步骤。以上是基本的SVD算法,但是现在可能会造成一个问题,那就是过拟合问题。

正则化防止过拟合

所谓过拟合,就是过分的拟合了样本数据,造成引入了大量的噪音,无法呈现原本的规律。而我们又无法针对特殊的样本数据进行剔除,所以干脆对所有的参数加入随机因子,即正则项。正则化是降低过拟合问题的常见手段,关于过拟合说明如图



图一是欠拟合,对样品的拟合程度过于简单,图二是刚好理想的拟合情况,图三就是过拟合,过度的拟合了噪音,导致无法很好的表示出整体规律。
为了防止过拟合现象,对SVD 的误差函数 SSE 加入正则化,则



按偏导求取各个参数的梯度后得出





同理,我们可以按负梯度方向更新得到 Puk 和 Qki 参数的值为





明显可以看出加入正则化后参数的更新速度减慢,而是倾向于消减参数的值的大小。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Funk-SVD 矩阵分解