您的位置:首页 > 其它

怎么理解spark机器学习中的推荐算法ALS?

2016-11-21 21:01 363 查看
ALS号称是spark机器学习中的大杀器,能做推荐系统。



但是亲们,我在网上找了一堆,要不是spark的源码,要不是纯数学公司。。。。



苦闷,还有有万能的知乎



ALS交替最小二乘法的协同过滤算法,其原理是什么,算法的思想是怎样的?找了好久的资料都是一大堆专业名词和公式看着比较费力,有没有大大能用比较通俗的语言描述一下ALS算法

整理一下自己的理解。

对于一个users-products-rating的评分数据集,ALS会建立一个user*product的m*n的矩阵

其中,m为users的数量,n为products的数量

但是在这个数据集中,并不是每个用户都对每个产品进行过评分,所以这个矩阵往往是稀疏的,用户i对产品j的评分往往是空的

ALS所做的事情就是将这个稀疏矩阵通过一定的规律填满,这样就可以从矩阵中得到任意一个user对任意一个product的评分,ALS填充的评分项也称为用户i对产品j的预测得分

所以说,ALS算法的核心就是通过什么样子的规律来填满(预测)这个稀疏矩阵

它是这么做的:

假设m*n的评分矩阵R,可以被近似分解成U*(V)T

U为m*d的用户特征向量矩阵

V为n*d的产品特征向量矩阵((V)T代表V的转置,原谅我不会打转置这个符号。。)

d为user/product的特征值的数量

关于d这个值的理解,大概可以是这样的

对于每个产品,可以从d个角度进行评价,以电影为例,可以从主演,导演,特效,剧情4个角度来评价一部电影,那么d就等于4

可以认为,每部电影在这4个角度上都有一个固定的基准评分值

例如《末日崩塌》这部电影是一个产品,它的特征向量是由d个特征值组成的

d=4,有4个特征值,分别是主演,导演,特效,剧情

每个特征值的基准评分值分别为(满分为1.0):

主演:0.9(大光头还是那么霸气)

导演:0.7

特效:0.8

剧情:0.6

矩阵V由n个product*d个特征值组成

对于矩阵U,假设对于任意的用户A,该用户对一部电影的综合评分和电影的特征值存在一定的线性关系,即电影的综合评分=(a1*d1+a2*d2+a3*d3+a4*d4)

其中a1-4为用户A的特征值,d1-4为之前所说的电影的特征值

参考:
协同过滤中的矩阵分解算法研究

那么对于之前ALS算法的这个假设

m*n的评分矩阵R,可以被近似分解成U*(V)T

就是成立的,某个用户对某个产品的评分可以通过矩阵U某行和矩阵V(转置)的某列相乘得到

那么现在的问题是,如何确定用户和产品的特征值?(之前仅仅是举例子,实际中这两个都是未知的变量)

采用的是交替的最小二乘法
<img src="https://pic3.zhimg.com/c37aee560cb64e53a4719206db11de16_b.jpg" data-rawwidth="109" data-rawheight="51" class="content_image" width="109">在上面的公式中,a表示评分数据集中用户i对产品j的真实评分,另外一部分表示用户i的特征向量(转置)*产品j的特征向量(这里可以得到预测的i对j的评分)

在上面的公式中,a表示评分数据集中用户i对产品j的真实评分,另外一部分表示用户i的特征向量(转置)*产品j的特征向量(这里可以得到预测的i对j的评分)

用真实评分减去预测评分然后求平方,对下一个用户,下一个产品进行相同的计算,将所有结果累加起来(其中,数据集构成的矩阵是存在大量的空打分,并没有实际的评分,解决的方法是就只看对已知打分的项)

参考:
ALS 在 Spark MLlib 中的实现

但是这里之前问题还是存在,就是用户和产品的特征向量都是未知的,这个式子存在两个未知变量

解决的办法是交替的最小二乘法

首先对于上面的公式,以下面的形式显示:
<img src="https://pic1.zhimg.com/b0ed19d8265d45c963ecef7bed74a6a0_b.jpg" data-rawwidth="341" data-rawheight="27" class="content_image" width="341">为了防止过度拟合,加上正则化参数

为了防止过度拟合,加上正则化参数
<img src="https://pic1.zhimg.com/0272993b5d91e9b2da9579b0f17a9144_b.jpg" data-rawwidth="351" data-rawheight="29" class="content_image" width="351">

<img
src="https://pic1.zhimg.com/7db6353488eac92890c7802640012cb8_b.jpg" data-rawwidth="365" data-rawheight="252" class="content_image" width="365">首先用一个小于1的随机数初始化V

首先用一个小于1的随机数初始化V

根据公式(4)求U

此时就可以得到初始的UV矩阵了,计算上面说过的差平方和

根据计算得到的U和公式(5),重新计算并覆盖V,计算差平方和

反复进行以上两步的计算,直到差平方和小于一个预设的数,或者迭代次数满足要求则停止

取得最新的UV矩阵

则原本的稀疏矩阵R就可以用R=U(V)T来表示了

以上公式内容截图来自:
基于矩阵分解的协同过滤算法

总结一下:

ALS算法的核心就是将稀疏评分矩阵分解为用户特征向量矩阵和产品特征向量矩阵的乘积

交替使用最小二乘法逐步计算用户/产品特征向量,使得差平方和最小

通过用户/产品特征向量的矩阵来预测某个用户对某个产品的评分

不知道是不是理解正确了

有几个问题想请教一下~

(1)在第一个公式中加入正则化参数是啥意思?为什么是那种形态的?

(2)固定一个矩阵U,求偏导数之后可以得到求解V的公式,为什么?





作者:小黑

链接:https://www.zhihu.com/question/31509438/answer/52268608

来源:知乎

著作权归作者所有,转载请联系作者获得授权。



作者:小黑

链接:https://www.zhihu.com/question/31509438/answer/52268608

来源:知乎

著作权归作者所有,转载请联系作者获得授权。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息