基于Spark mllib的矩阵分解(ALS)推荐算法

来源:互联网 发布:用友软件公司简介 编辑:程序博客网 时间:2024/04/25 22:27

推荐引擎背后的想法是:预测人们可能喜好的物品并通过探寻物品之间的联系来辅助这个过程。
推荐引擎很适合如下两类常见场景(两者可兼有)。
- 可选项众多:可选的物品越多,用户就越难找到想要的物品。如果用户知道他们想要什么,那搜索能有所帮助。然而最适合的物品往往并不为用户所事先知道。这时,通过向用户推荐相关物品,其中某些可能用户事先不知道,将能帮助他们发现新物品。
- 偏个人喜好:当人们主要根据个人喜好来选择物品时,推荐引擎能利用集体智慧,根据其他有类似喜好用户的信息来帮助他们发现所需物品。

推荐模型的分类

基于内容的分类

协同过滤

矩阵分解

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×VTUm×d的用户特征向量矩阵;Vn×d的产品特征向量矩阵。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×VT,就是成立的,某个用户对某个产品的评分可以通过矩阵U某行和矩阵VT的某列相乘得到,那么现在的问题是,如何确定用户和产品的特征值?(之前仅仅是举例子,实际中这两个都是未知的变量)。采用的是

交替的最小二乘法
$$\sum_{i,j\in\mathbb R} (a_ij-)^2 = \frac{(n^2+n)(2n+1)}{6}$$
在上面的公式中,a表示评分数据集中用户i对产品j的真实评分,另外一部分表示用户i的特征向量(转置)×产品j的特征向量(这里可以得到预测的i对j的评分)
用真实评分减去预测评分然后求平方,对下一个用户,下一个产品进行相同的计算,将所有结果累加起来(其中,数据集构成的矩阵是存在大量的空打分,并没有实际的评分,解决的方法是就只看对已知打分的项)
参考:
ALS 在 Spark MLlib 中的实现

但是这里之前问题还是存在,就是用户和产品的特征向量都是未知的,这个式子存在两个未知变量,解决的办法是交替的最小二乘法:这里写图片描述
首先对于上面的公式,为了防止过度拟合,加上正则化参数
这里写图片描述
这里写图片描述
首先用一个小于1的随机数初始化V,根据公式(4)求U,此时就可以得到初始的UV矩阵了,计算上面说过的差平方和根据计算得到的U和公式(5),重新计算并覆盖V,计算差平方和反复进行以上两步的计算,直到差平方和小于一个预设的数,或者迭代次数满足要求则停止取得最新的UV矩阵则原本的稀疏矩阵R就可以用R=U×VT来表示。


总结:
ALS算法的核心就是将稀疏评分矩阵分解为用户特征向量矩阵和产品特征向量矩阵的乘积交替使用最小二乘法逐步计算用户/产品特征向量,使得差平方和最小通过用户/产品特征向量的矩阵来预测某个用户对某个产品的评分。

0 0