矩阵分解模型(1):ALS学习算法
2018-01-29 14:53
316 查看
一、矩阵分解模型。
用户对物品的打分行为可以表示成一个评分矩阵A(m*n),表示m个用户对n各物品的打分情况。如下图所示:
![](https://img-blog.csdn.net/20151114165449626?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
其中,A(i,j)表示用户user i对物品item j的打分。但是,用户不会对所以物品打分,图中?表示用户没有打分的情况,所以这个矩阵A很多元素都是空的,我们称其为“缺失值(missing
value)”。在推荐系统中,我们希望得到用户对所有物品的打分情况,如果用户没有对一个物品打分,那么就需要预测用户是否会对该物品打分,以及会打多少分。这就是所谓的“矩阵补全(填空)”。
ALS 的核心就是下面这个假设:打分矩阵A是近似低秩的。换句话说,一个
![](http://img.ptcms.csdn.net/article/201505/07/554b676f7c31e.jpg)
的打分矩阵
A 可以用
两个小矩阵
![](http://img.ptcms.csdn.net/article/201505/07/554b67af72a95.jpg)
和
![](http://img.ptcms.csdn.net/article/201505/07/554b67bb147a1.jpg)
的乘积来近似:
![](http://img.ptcms.csdn.net/article/201505/07/554b67d9d73fc.jpg)
。
这样我们就把整个系统的自由度从
![](http://img.ptcms.csdn.net/article/201505/07/554b67fff1afd.jpg)
一下降到了
![](http://img.ptcms.csdn.net/article/201505/07/554b6812d4a89.jpg)
。我们接下来就聊聊为什么
ALS 的低秩假设是合理的。
世上万千事物,人们的喜好各不相同。但描述一个人的喜好经常是在一个抽象的低维空间上进行的,并不需要把其喜欢的事物一一列出。
举个例子,我喜欢看略带黑色幽默的警匪电影,那么大家根据这个描述就知道我大概会喜欢昆汀的《低俗小说》、《落水狗》和
韦家辉的《一个字头的诞生》。这些电影都符合我对自己喜好的描述,也就是说他们在这个抽象的低维空间的投影和我的喜好相似。
再抽象一些,把人们的喜好和电影的特征都投到这个低维空间,一个人的喜好映射到了一个低维向量
![](http://img.ptcms.csdn.net/article/201505/07/554b68c18acaf.jpg)
,
一个电影的特征变成了纬度相同的向量
![](http://img.ptcms.csdn.net/article/201505/07/554b68ee9ea19.jpg)
,那么这个人和这个电影的相似度就可以表述成这两个向量之间的内积
![](http://img.ptcms.csdn.net/article/201505/07/554b6918bd2c7.jpg)
。
我们把打分理解成相似度,那么“打分矩阵A(m*n)”就可以由“用户喜好特征矩阵U(m*k)”和“产品特征矩阵V(n*k)”的乘积
![](http://img.ptcms.csdn.net/article/201505/07/554b693d3246a.jpg)
来近似了。
矩阵U、矩阵V如下图所示:
![](https://img-blog.csdn.net/20151114171626349?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](https://img-blog.csdn.net/20151114172644304?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
U
V
矩阵分解模型的损失函数为:
![](https://img-blog.csdn.net/20151114175540236?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
有了损失函数之后,下面就开始谈优化方法了,通常的优化方法分为两种:交叉最小二乘法(alternative
least squares)
和随机梯度下降法(stochastic
gradient descent)。本文使用交叉最小二乘法(ALS)来最优化损失函数。
算法的思想就是:我们先随机生成
![](http://img.ptcms.csdn.net/article/201505/07/554b6ac97a0be.jpg)
然后固定它求解
![](http://img.ptcms.csdn.net/article/201505/07/554b6aeb5b406.jpg)
,再固定
![](http://img.ptcms.csdn.net/article/201505/07/554b6b007da66.jpg)
求解
![](http://img.ptcms.csdn.net/article/201505/07/554b6b2734f68.jpg)
,
这样交替进行下去,直到取得最优解min(C)。因为每步迭代都会降低误差,并且误差是有下界的,所以
ALS 一定会收敛。
但由于问题是非凸的,ALS
并不保证会收敛到全局最优解。但在实际应用中,ALS 对初始点不是很敏感,是不是全局最优解造成的影响并不大。
算法的执行步骤:
1、先随机生成一个
![](http://img.ptcms.csdn.net/article/201505/07/554b6ac97a0be.jpg)
。一般可以取0值或者全局均值。
2、固定
![](http://img.ptcms.csdn.net/article/201505/07/554b6ac97a0be.jpg)
(即:认为
![](http://img.ptcms.csdn.net/article/201505/07/554b6ac97a0be.jpg)
是已知的常量),来求解
![](http://img.ptcms.csdn.net/article/201505/07/554b6aeb5b406.jpg)
。
此时,损失函数为:
![](https://img-blog.csdn.net/20151115105303582?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
由于C中只有Vj一个未知变量,因此C的最优化问题转化为最小二乘问题,用最小二乘法求解Vj的最优解:
固定j(j=1,2,......,n),则:C的导数
![](https://img-blog.csdn.net/20151115114157916?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
令
![](https://img-blog.csdn.net/20151115114606537?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
,得到:
![](https://img-blog.csdn.net/20151115115019128?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
即:
![](https://img-blog.csdn.net/20151115115505694?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
令
![](https://img-blog.csdn.net/20151115115556523?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
,
![](https://img-blog.csdn.net/20151115115630876?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
,则:
![](https://img-blog.csdn.net/20151115115800474?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
按照上式依次计算v1,v2,......,vn,从而得到
![](http://img.ptcms.csdn.net/article/201505/07/554b6aeb5b406.jpg)
。
3、固定
![](http://img.ptcms.csdn.net/article/201505/07/554b6aeb5b406.jpg)
(即:认为
![](http://img.ptcms.csdn.net/article/201505/07/554b6aeb5b406.jpg)
是已知的量),来求解
![](http://img.ptcms.csdn.net/article/201505/07/554b6b2734f68.jpg)
。
此时,损失函数为:
![](https://img-blog.csdn.net/20151115225708580?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
同理,用步骤2中类似的方法,可以计算ui的值:
![](https://img-blog.csdn.net/20151115230638968?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
令
![](https://img-blog.csdn.net/20151115230700055?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
,得到:
![](https://img-blog.csdn.net/20151115231314425?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
即:
![](https://img-blog.csdn.net/20151115231358748?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
令
![](https://img-blog.csdn.net/20151115231530045?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
,
![](https://img-blog.csdn.net/20151115231555716?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
,则:
![](https://img-blog.csdn.net/20151115231705556?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
依照上式依次计算u1,u2,......,um,从而得到
![](http://img.ptcms.csdn.net/article/201505/07/554b6b2734f68.jpg)
。
4、循环执行步骤2、3,直到损失函数C的值收敛(或者设置一个迭代次数N,迭代执行步骤2、3
N次后停止)。这样,
就得到了C最优解对应的矩阵U、V。
用户对物品的打分行为可以表示成一个评分矩阵A(m*n),表示m个用户对n各物品的打分情况。如下图所示:
其中,A(i,j)表示用户user i对物品item j的打分。但是,用户不会对所以物品打分,图中?表示用户没有打分的情况,所以这个矩阵A很多元素都是空的,我们称其为“缺失值(missing
value)”。在推荐系统中,我们希望得到用户对所有物品的打分情况,如果用户没有对一个物品打分,那么就需要预测用户是否会对该物品打分,以及会打多少分。这就是所谓的“矩阵补全(填空)”。
ALS 的核心就是下面这个假设:打分矩阵A是近似低秩的。换句话说,一个
![](http://img.ptcms.csdn.net/article/201505/07/554b676f7c31e.jpg)
的打分矩阵
A 可以用
两个小矩阵
![](http://img.ptcms.csdn.net/article/201505/07/554b67af72a95.jpg)
和
![](http://img.ptcms.csdn.net/article/201505/07/554b67bb147a1.jpg)
的乘积来近似:
![](http://img.ptcms.csdn.net/article/201505/07/554b67d9d73fc.jpg)
。
这样我们就把整个系统的自由度从
![](http://img.ptcms.csdn.net/article/201505/07/554b67fff1afd.jpg)
一下降到了
![](http://img.ptcms.csdn.net/article/201505/07/554b6812d4a89.jpg)
。我们接下来就聊聊为什么
ALS 的低秩假设是合理的。
世上万千事物,人们的喜好各不相同。但描述一个人的喜好经常是在一个抽象的低维空间上进行的,并不需要把其喜欢的事物一一列出。
举个例子,我喜欢看略带黑色幽默的警匪电影,那么大家根据这个描述就知道我大概会喜欢昆汀的《低俗小说》、《落水狗》和
韦家辉的《一个字头的诞生》。这些电影都符合我对自己喜好的描述,也就是说他们在这个抽象的低维空间的投影和我的喜好相似。
再抽象一些,把人们的喜好和电影的特征都投到这个低维空间,一个人的喜好映射到了一个低维向量
![](http://img.ptcms.csdn.net/article/201505/07/554b68c18acaf.jpg)
,
一个电影的特征变成了纬度相同的向量
![](http://img.ptcms.csdn.net/article/201505/07/554b68ee9ea19.jpg)
,那么这个人和这个电影的相似度就可以表述成这两个向量之间的内积
![](http://img.ptcms.csdn.net/article/201505/07/554b6918bd2c7.jpg)
。
我们把打分理解成相似度,那么“打分矩阵A(m*n)”就可以由“用户喜好特征矩阵U(m*k)”和“产品特征矩阵V(n*k)”的乘积
![](http://img.ptcms.csdn.net/article/201505/07/554b693d3246a.jpg)
来近似了。
矩阵U、矩阵V如下图所示:
U
V
二、交替最小二乘法(ALS)。
矩阵分解模型的损失函数为:有了损失函数之后,下面就开始谈优化方法了,通常的优化方法分为两种:交叉最小二乘法(alternative
least squares)
和随机梯度下降法(stochastic
gradient descent)。本文使用交叉最小二乘法(ALS)来最优化损失函数。
算法的思想就是:我们先随机生成
![](http://img.ptcms.csdn.net/article/201505/07/554b6ac97a0be.jpg)
然后固定它求解
![](http://img.ptcms.csdn.net/article/201505/07/554b6aeb5b406.jpg)
,再固定
![](http://img.ptcms.csdn.net/article/201505/07/554b6b007da66.jpg)
求解
![](http://img.ptcms.csdn.net/article/201505/07/554b6b2734f68.jpg)
,
这样交替进行下去,直到取得最优解min(C)。因为每步迭代都会降低误差,并且误差是有下界的,所以
ALS 一定会收敛。
但由于问题是非凸的,ALS
并不保证会收敛到全局最优解。但在实际应用中,ALS 对初始点不是很敏感,是不是全局最优解造成的影响并不大。
算法的执行步骤:
1、先随机生成一个
![](http://img.ptcms.csdn.net/article/201505/07/554b6ac97a0be.jpg)
。一般可以取0值或者全局均值。
2、固定
![](http://img.ptcms.csdn.net/article/201505/07/554b6ac97a0be.jpg)
(即:认为
![](http://img.ptcms.csdn.net/article/201505/07/554b6ac97a0be.jpg)
是已知的常量),来求解
![](http://img.ptcms.csdn.net/article/201505/07/554b6aeb5b406.jpg)
。
此时,损失函数为:
由于C中只有Vj一个未知变量,因此C的最优化问题转化为最小二乘问题,用最小二乘法求解Vj的最优解:
固定j(j=1,2,......,n),则:C的导数
令
,得到:
即:
令
,
,则:
按照上式依次计算v1,v2,......,vn,从而得到
![](http://img.ptcms.csdn.net/article/201505/07/554b6aeb5b406.jpg)
。
3、固定
![](http://img.ptcms.csdn.net/article/201505/07/554b6aeb5b406.jpg)
(即:认为
![](http://img.ptcms.csdn.net/article/201505/07/554b6aeb5b406.jpg)
是已知的量),来求解
![](http://img.ptcms.csdn.net/article/201505/07/554b6b2734f68.jpg)
。
此时,损失函数为:
同理,用步骤2中类似的方法,可以计算ui的值:
令
,得到:
即:
令
,
,则:
依照上式依次计算u1,u2,......,um,从而得到
![](http://img.ptcms.csdn.net/article/201505/07/554b6b2734f68.jpg)
。
4、循环执行步骤2、3,直到损失函数C的值收敛(或者设置一个迭代次数N,迭代执行步骤2、3
N次后停止)。这样,
就得到了C最优解对应的矩阵U、V。
相关文章推荐
- 矩阵分解模型(1):ALS学习算法
- 矩阵分解模型(1):ALS学习算法
- 径向基函数神经网络模型与学习算法
- BP神经网络模型与学习算法
- 使用深度学习检测DGA(域名生成算法)——LSTM的输入数据本质上还是词袋模型
- 分词算法模型学习笔记(一)——HMM
- BP神经网络模型与学习算法
- 机器学习第四篇(stanford大学公开课学习笔记) —生成型学习算法之高斯判别分析模型和朴素贝叶斯方法
- 如何调整深度学习算法模型的参数以及模型融合
- 统计学习三要素:模型、策略、算法
- BP神经网络模型与学习算法
- BP神经网络模型与学习算法
- BP神经网络模型与学习算法
- 1.5 KNN算法学习——KNN算法分类模型的实现与分类准确度评估
- 自组织神经网络模型与学习算法
- 三剑客学习之路——数据结构(一)计算模型与算法分析(1)
- 1.2 KNN算法学习——使用scikit-learn中的KNN模型实现
- 2.8 线性回归算法学习——sklearn的回归模型学习
- 【数据结构与算法学习笔记】PART1:算法分析(计算,计算模型,大O记号,算法分析,迭代与递归,动态控制)
- BP神经网络模型与学习算法