推荐系统中矩阵分解算法-funkSVD和ALS

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了推荐系统中矩阵分解算法-funkSVD和ALS相关的知识,希望对你有一定的参考价值。

参考技术A 矩阵分解funkSVD:该矩阵分解不像是线代中的,他属于伪分解。其主要思想是,用两个m*k和k*n的矩阵代替m*n的矩阵。

因为在推荐系统中,矩阵十分稀疏,分解后的矩阵一般是密集的,且可以通过行列相乘来得到空缺的值。

(其预测的是第u个用户对第i个商品的评分)

其通过机器学习最小化损失函数来得到矩阵,

其学习方式有两种,一种是随机梯度下降,一种是交替最小二乘。

第一种不说,随处可见。第二种是通过

该式子实现的。

我们先随机化一个Q,因为R是那个稀疏矩阵已知,所以能得到P,我们再反过来用PR求Q。直到模型的误差低于一个阈值。

上面的svd是对于评分的算法,还有svd++等对用户,物品做了偏移项。

隐式矩阵分解(最常见)ALS

我们一般的推荐问题不是通过评分推荐,因为评分的产生十分的困难,一般用户没有这个习惯。我们与其预测评分,不如去预测用户行为。如果我们给用户一个页面有十个商品,我们预测到用户会点击哪一个,这不就说明用户喜欢这个。而且基于用户的信息很多。

我们的矩阵由1,0和空缺组成,1表示该用户点击过该商品(即表示用户对它有想法),0表示用户对它没有想法(怎么是没想法呢,我们定义用户知道他却不想了解他。即我们在所有没有点击该商品的用户中抽样,该商品越火热抽取的人越多。因为热门的东西大家应该都知道,而你却没点击他,说明他不感兴趣)

我们要将该矩阵分解。

我们的损失函数是

Cui是置信度,比如我点击10次当时比只点击一次的喜欢置信度高。

对于学习方法,我们使用加权交替最小二乘法

初始化Y,我们计算出x,再通过

计算出y。再反复交替,直到小于阈值。

该算法目前在spark上有实现。且sparkml将其作为唯一的推荐系统算法。

推荐系统中的矩阵分解演变方式

推荐算法主要分为基于内容的算法和协同过滤. 协同过滤的两种基本方法是基于邻居的方法(基于内容/物品的协同过滤)和隐语义模型. 矩阵分解乃是实现隐语义模型的基石.

矩阵分解依据用户对物品的评分, 判断出用户和物品的隐语义向量, 然后依据用户和物品的隐语义向量来进行推荐.

推荐系统用到的数据能够有显式评分和隐式评分. 显式评分时用户对物品的打分, 显式评分矩阵通常很稀疏. 隐式评分是指用户的浏览, 购买, 搜索等历史记录, 表示的是用户行为的有无, 所以是一个密集矩阵.

1. 基本矩阵分解


矩阵分解方法会将用户和物品映射到技术分享维的隐向量空间, 用户对物品的评分表示为两个向量的内积. 亦即, 每一个物品技术分享表示为向量技术分享, 每一个用户表示成向量技术分享. 对于物品技术分享, 向量技术分享的元素表示的是物品技术分享具有这些隐因子的程度, 对于用户技术分享, 向量技术分享表示的是用户对各个隐因子的兴趣, 元素的值可正可负. 两个向量的内积

技术分享

表示的就是预计的用户对物品的评分. 所以基本的挑战就是计算用户和物品到隐向量的映射.

最简单的就是神秘值分解(Singular value decomposition, SVD), 使用SVD须要分解用户物品评分矩阵, 可是通常该矩阵中有非常多值是缺失的, 这样的情况下的SVD是不可行的. 另外, 仅仅处理已知的这些评分easy导致过拟合. 能够通过填充数据来使得矩阵变得稠密, 可是填充数据的准确性非常是问题.

最主流的做法是仅仅对那些已观測到的评分进行建模, 而且通过使用正则化项来避免过拟合, 亦即求解下面问题:

技术分享

当中技术分享是所以已知评分的用户-物品对, 技术分享控制着正则化的程度.

2. 学习算法


两种经常使用的求解上式的算法为随机梯度下降(SGD)和ALS(Alternating Least Square).

2.1 随机梯度下降


对于每一个用户-物品评分, 计算预測误差

技术分享

然后依照梯度下降的方向更新用户和物品的隐向量:

技术分享

技术分享

2.2 ALS(Alternating Least Square)


由于技术分享技术分享都是未知的, 所以公式2不是凸的. 可是, 当我们固定当中一个变量, 则2式变成一个二次函数, 可以被最优的求解. 所以ALS算法的思想就是交替的固定技术分享技术分享, 然后求解另外一个变量的二次函数的最优值.

通常SGD都会比ALS要简单并且高速, 可是ALS的并行性比較好, 并且能够较好地处理稀疏数据(?).

3. 加入偏置项


矩阵分解方法的一个优点就是能够灵活的加入很多面向应用的要求. 比方, 通常来说, 不同用户的评分倾向不同, 用的用户的打分普遍较高, 有的普遍较低, 物品亦然. 所以只使用用户和物品之间的交互技术分享来对评分进行建模不是非常好, 还须要加上一些偏置项. 一种一阶偏置项近似为:

技术分享

当中技术分享描写叙述的是全部评分的平均值, 技术分享描写叙述的是用户和物品相对于技术分享的偏差.

评分模型为:

技术分享

转化为最优化问题为:

技术分享

4. 其它的输入源


当解决冷启动问题时, 用户的评分信息非常少, 这时候就须要使用用户的其它输入信息, 比方用户隐式反馈(浏览, 购买历史等). 令技术分享表示用户有隐反馈的物品. 系统能够通过这些物品来对用户建模, 亦即把每一个物品表示成一个隐向量技术分享, 则用户能够通过下式来描写叙述:

技术分享

能够对上式进行正则化:

技术分享

也能够使用用户的一些其它属性(性别, 年龄, 收入等)来对用户建模, 令技术分享表示用户的一些布尔属性,则隐向量技术分享表示用户的某个属性, 用户的全部属性能够通过下式来描写叙述:

技术分享

用户对物品的评分能够表示为:

技术分享

5. 时间因素


到如今为止, 模型是静态的, 可是实际中物品的流行程度会随着时间变化, 用户的评分倾向也会变化, 用户的隐向量也会随时间变化. 所以能够将这些变量表示成时间的函数来更好地描写叙述这些现象:

技术分享

6. 不同可信度的输入源


不同的评分的可信度不同. 比方广告会影响某个物品的评分, 另外, 有些作弊的用户会对某些物品恶意的打高分或者低分. 另外, 在使用隐式反馈时, 能够使用某些行为(比方浏览)等得次数来表示用户喜欢某个物品的程度. 能够通过为某个评分技术分享设置权重技术分享来解决上述问题:

技术分享

 

參考文献:

[1]. Yuhuda Koren, Robert Bell and Chris Volinsky. Matrix Factorization Techniques for Recommender Systems.














































































以上是关于推荐系统中矩阵分解算法-funkSVD和ALS的主要内容,如果未能解决你的问题,请参考以下文章

推荐算法ALS算法原理和在音乐推荐上的应用

用Spark学习矩阵分解推荐算法

推荐算法之用矩阵分解做协调过滤——LFM模型

贝叶斯个性化排序(BPR)算法小结

深入理解Spark ML:基于ALS矩阵分解的协同过滤算法与源码分析

推荐算法协同过滤算法代码(pyspark | ALS)