5

机器学习(十四)——协同过滤的ALS算法(2)

 2 years ago
source link: http://antkillerfarm.github.io/ml/2016/09/28/Machine_Learning_14.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

协同过滤的ALS算法(续)

Kendall秩相关系数(Kendall rank correlation coefficient)

对于秩变量对(xi,yi),(xj,yj):

(xi−xj)(yi−yj){>0,concordant=0,neither concordant nor discordant<0,discordantτ=(number of concordant pairs)−(number of discordant pairs)n(n−1)/2

注:Sir Maurice George Kendall,1907~1983,英国统计学家。这个人职业生涯的大部分时间都是一个公务员,二战期间出任英国船运协会副总经理。1949年以后担任伦敦大学教授。

https://en.wikipedia.org/wiki/Kendall_rank_correlation_coefficient

Tanimoto系数

T(x,y)=∣X∩Y∣∣X∪Y∣=∣X∩Y∣∣X∣+∣Y∣−∣X∩Y∣=∑xiyi∑xi2+∑yi2−∑xiyi

该系数由Taffee T. Tanimoto于1960年提出。Tanimoto生平不详,从名字来看,应该是个日本人。在其他领域,它还有另一个名字Jaccard similarity coefficient。(两者的系数公式一致,但距离公式略有差异。)

如果向量的每个维度取值是二值(0或1),那么Tanimoto系数就等同Jaccard距离。

注:Paul Jaccard,1868~1944,苏黎世联邦理工学院(ETH Zurich)博士,苏黎世联邦理工学院植物学教授。ETH Zurich可是出了24个诺贝尔奖得主的。

https://en.wikipedia.org/wiki/Jaccard_index

https://www.cnblogs.com/daniel-D/p/3244718.html

漫谈:机器学习中距离和相似性度量方法

https://mp.weixin.qq.com/s/rrIdxEEwFJMWbvbhn_DYDw

协同过滤算法分布式实现

https://zhuanlan.zhihu.com/p/138107999

常见的距离算法和相似度计算方法

https://mp.weixin.qq.com/s/OpBKbF1UHEAuosXjNDKqOA

机器学习距离与相似度计算

https://mp.weixin.qq.com/s/cYfbZtFFd9jvnN4p8T20UQ

9个数据科学中常见距离度量总结以及优缺点概述

ALS算法原理

http://www.cnblogs.com/luchen927/archive/2012/02/01/2325360.html

机器学习相关——协同过滤

https://mp.weixin.qq.com/s/Xgg61ICqkUo9ovdEV7G8Cw

推荐算法综述

https://mp.weixin.qq.com/s/lBj0Z9vY9FcEFQnk0VrdOw

协同过滤推荐算法

上面的网页概括了ALS算法出现之前的协同过滤算法的概况。

ALS算法是2008年以来,用的比较多的协同过滤算法。它已经集成到Spark的Mllib库中,使用起来比较方便。

从协同过滤的分类来说,ALS算法属于User-Item CF,也叫做混合CF。它同时考虑了User和Item两个方面。

用户和商品的关系,可以抽象为如下的三元组:<User,Item,Rating>。其中,Rating是用户对商品的评分,表征用户对该商品的喜好程度。

假设我们有一批用户数据,其中包含m个User和n个Item,则我们定义Rating矩阵Rm×n,其中的元素rui表示第u个User对第i个Item的评分。

在实际使用中,由于n和m的数量都十分巨大,因此R矩阵的规模很容易就会突破1亿项。这时候,传统的矩阵分解方法对于这么大的数据量已经是很难处理了。

另一方面,一个用户也不可能给所有商品评分,因此,R矩阵注定是个稀疏矩阵。矩阵中所缺失的评分,又叫做missing item。

针对这样的特点,我们可以假设用户和商品之间存在若干关联维度(比如用户年龄、性别、受教育程度和商品的外观、价格等),我们只需要将R矩阵投射到这些维度上即可。这个投射的数学表示是:

(1)Rm×n≈Xm×kYn×kT

这里的≈表明这个投射只是一个近似的空间变换。

不懂这个空间变换的同学,可参见《线性代数(二)》中的“奇异值分解”的内容,或是《机器学习(十七)》中的“主成分分析”的内容。

一般情况下,k的值远小于n和m的值,从而达到了数据降维的目的。

幸运的是,我们并不需要显式的定义这些关联维度,而只需要假定它们存在即可,因此这里的关联维度又被称为Latent factor。k的典型取值一般是20~200。

这种方法被称为概率矩阵分解算法(probabilistic matrix factorization,PMF)。ALS算法是PMF在数值计算方面的应用。

为了使低秩矩阵X和Y尽可能地逼近R,需要最小化下面的平方误差损失函数:

minx∗,y∗∑u,i is known(rui−xuTyi)2

考虑到矩阵的稳定性问题,使用Tikhonov regularization,则上式变为:

(2)minx∗,y∗L(X,Y)=minx∗,y∗∑u,i is known(rui−xuTyi)2+λ(∣xu∣2+∣yi∣2)

优化上式,得到训练结果矩阵Xm×k,Yn×k。预测时,将User和Item代入rui=xuTyi,即可得到相应的评分预测值。

同时,矩阵X和Y,还可以用于比较不同的User(或Item)之间的相似度,如下图所示:

ALS算法的缺点在于:

1.它是一个离线算法。

2.无法准确评估新加入的用户或商品。这个问题也被称为Cold Start问题。

ALS算法优化过程的推导

公式2的直接优化是很困难的,因为X和Y的二元导数并不容易计算,这时可以使用类似坐标下降法的算法,固定其他维度,而只优化其中一个维度。

对xu求导,可得:

∂L∂xu=−2∑i(rui−xuTyi)yi+2λxu=−2∑i(rui−yiTxu)yi+2λxu=−2YTru+2YTYxu+2λxu

令导数为0,可得:

(3)YTYxu+λIxu=YTru⇒xu=(YTY+λI)−1YTru

同理,对yi求导,由于X和Y是对称的,因此可得类似的结论:

(4)yi=(XTX+λI)−1XTri

因此整个优化迭代的过程为:

1.随机生成X、Y。(相当于对迭代算法给出一个初始解。)
Repeat until convergence {

2.固定Y,使用公式3更新xu。
3.固定X,使用公式4更新yi。

一般使用RMSE(root-mean-square error)评估误差是否收敛,具体到这里就是:

RMSE=∑(R−XYT)2N

其中,N为三元组<User,Item,Rating>的个数。当RMSE值变化很小时,就可以认为结果已经收敛。

算法复杂度:

1.求xu:O(k2N+k3m)

2.求yi:O(k2N+k3n)

可以看出当k一定的时候,这个算法的复杂度是线性的。

因为这个迭代过程,交替优化X和Y,因此又被称作交替最小二乘算法(Alternating Least Squares,ALS)。

用户给商品评分是个非常简单粗暴的用户行为。在实际的电商网站中,还有大量的用户行为,同样能够间接反映用户的喜好,比如用户的购买记录、搜索关键字,甚至是鼠标的移动。我们将这些间接用户行为称之为隐式反馈(implicit feedback),以区别于评分这样的显式反馈(explicit feedback)。

隐式反馈有以下几个特点:

1.没有负面反馈(negative feedback)。用户一般会直接忽略不喜欢的商品,而不是给予负面评价。

2.隐式反馈包含大量噪声。比如,电视机在某一时间播放某一节目,然而用户已经睡着了,或者忘了换台。

3.显式反馈表现的是用户的喜好(preference),而隐式反馈表现的是用户的信任(confidence)。比如用户最喜欢的一般是电影,但观看时间最长的却是连续剧。大米购买的比较频繁,量也大,但未必是用户最想吃的食物。

4.隐式反馈非常难以量化。

ALS-WR

针对隐式反馈,有ALS-WR算法(ALS with Weighted-λ-Regularization)。

首先将用户反馈分类:

pui={1,preference0,no preference

但是喜好是有程度差异的,因此需要定义程度系数:

cui=1+αrui

这里的rui表示原始量化值,比如观看电影的时间;

这个公式里的1表示最低信任度,α表示根据用户行为所增加的信任度。

最终,损失函数变为:

minx∗,y∗L(X,Y)=minx∗,y∗∑u,icui(pui−xuTyi)2+λ(∑u∣xu∣2+∑i∣yi∣2)

除此之外,我们还可以使用指数函数来定义cui:

cui=1+αlog⁡(1+rui/ϵ)

ALS-WR没有考虑到时序行为的影响,时序行为相关的内容,可参见:

http://www.jos.org.cn/1000-9825/4478.htm

基于时序行为的协同过滤推荐算法

参考论文:

《Large-scale Parallel Collaborative Filtering forthe Netflix Prize》

《Collaborative Filtering for Implicit Feedback Datasets》

《Matrix Factorization Techniques for Recommender Systems》

其他参考:

http://www.jos.org.cn/html/2014/9/4648.htm

基于大规模隐式反馈的个性化推荐

http://www.fuqingchuan.com/2015/03/812.html

协同过滤之ALS-WR算法

http://www.docin.com/p-714582034.html

基于矩阵分解的协同过滤算法

http://www.tuicool.com/articles/fANvieZ

Spark MLlib中的协同过滤

http://www.68idc.cn/help/buildlang/ask/20150727462819.html

Alternating Least Squares(ASL)的数学推导

https://mp.weixin.qq.com/s/bRhIm8Xvlb51zE2HpDO5Og

一文读懂推荐系统知识体系

http://mp.weixin.qq.com/s/QhP3wRGbrO7sYSDNm8z0gQ

常用推荐算法(50页干货)

https://zhuanlan.zhihu.com/p/23036112

推荐系统常用的推荐算法

https://mp.weixin.qq.com/s/6x8cK_SDW67At3IUZ15ijQ

协同过滤典型算法概述

https://mp.weixin.qq.com/s/wtvwWZhqCRjJgdCpa7qdJw

矩阵分解在协同过滤推荐中的应用

https://mp.weixin.qq.com/s/sUQPaiYAfRpCFryrHMqPoA

想写出人见人爱的推荐系统,先了解经典矩阵分解技术

https://mp.weixin.qq.com/s/7C_XRgPFh41r05SZdA2NfA

推荐系统之矩阵分解模型:科普篇

https://mp.weixin.qq.com/s/Fy2ZyxYvRj3C8BqOp6IGPQ

推荐系统之矩阵分解模型:原理篇

https://mp.weixin.qq.com/s/NnykbxFA6xnTUbLzX8GVIg

推荐系统之矩阵分解模型:实践篇


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK