推荐系统的几种常见模型概述
网上对个性化推荐的介绍很零散,我正好做过相关的工作,所以这里做个总结。
总的来说,推荐系统的目标可以分为预测评分和物品推荐两种,其实模型也可相互转换,目前对前者的研究也更多,因为前者更适合建复杂的模型,所以这里只讨论预测评分的情况。推荐系统中常用的数据有以下几种:
1. 基于内容的推荐
要预测一个用户将来的行为,最直观的想法当然是看看他过去干了些什么,看了哪些电影啊,打多少分啊,听过什么歌啊,之类的。基于内容推荐的基本思想就是,你过去曾经买过什么东西、看过什么电影,我就给你推荐一样的东西或者类似的东西,显然这样的模型太直接,没有挖掘出数据背后隐含的内涵,只用这样简单的推荐肯定达不到最好的效果,所以我们需要有协同过滤。
2. 协同过滤
协同过滤可以分为两种模型,一种叫KNN,用户最近邻模型,一种是Matrix Factorization,矩阵分解模型。KNN又有两种基本做法:一是找出与用户u最类似的K个用户,譬如如果我们想要预测u对电影i的评分,我们可以找出其他K个对电影i评过分的用户,然后分别计算他们与用户u的相似性,然后把他们对i的评分进行加权以后,作为用户u对i的评分。计算用户之间的相似性有很多方法,最常用的是余弦相似系数和皮尔森相似系数,都是将每一个用户的评分情况作为一个向量以后计算两个向量之间的余弦夹角或皮尔森系数。其中皮尔森系数其实就是一种减掉了平均值的方法,理论上更能贴近实际情况,更可靠。这是基于用户的推荐,基于物品的推荐也是一个道理,譬如我们要预测用户u对物品i的评分,我们找出用户u评过分的其他K个的物品,用同样的办法加权后得到u对i的预测值。基于用户和基于物品可以结合起来做推荐,有人专门做过这个研究,譬如把两者的结果分别乘一个加权系数以后相加,然后再学习出两个系数的合适的值。
KNN的做法比较简单也很容易想到,所以自然需要一种更复杂的办法来改进系统。Matrix Factorization的想法来自于SVD,即奇异值分解(singular value decomposition)。奇异值分解的概念网上随便搜一搜就有很多,搞统计的还有搞模式识别的人整天就研究这些东西。SVD只是分解矩阵的其中一种方法,譬如特征值分解一般线性代数课上都讲过,简单地说就是把一个M*N的矩阵分解成M*M、M*N、N*N三个矩阵的乘积,然后中间那个M*N的矩阵中就包含了奇异值,也就代表了这个矩阵与众不同的一些地方。
SVD有许多办法可以算出来,但在推荐系统中奇异值不是直接计算出来的,一般都是通过随机梯度下降学习出来的。这就好像你在推荐系统需要做直线拟合的时候也不会直接去算,而是进行迭代。矩阵分解出来的奇异值理论上是不可解释的。假如有u个用户和i个物品,这样评分矩阵就是一个u*i的矩阵,假设经过分解之后,有u*f和i*f这样两个矩阵,就是说分解出来了一个长度为f的向量,拿电影来打比方,譬如用户有三个:张三、李四、王二,电影也有三个:《拯救大兵瑞恩》、《了不起的盖茨比》、《霍比特人》、这样分解出来的向量可能具有的意义就是:二战、斯皮尔伯格、小资、三角恋、奇幻、中世纪,这样f就为6,u*f的矩阵就是表示用户对这些标签的感冒程度,i*f的矩阵则表示电影对这些标签的拥有程度,譬如u*f中张三的那一行是(0.9,0.5,0.2,0.2,0.4,0.3),我们就可以知道张三最喜欢战争片,而不太喜欢小资爱情片,假如这时候有一部新的电影new movie的向量为(0.4,0.3,0.5,0.6,0.7,0.5),那么张三对这个new movie的评分就可以预测为两个向量的内积。
在很多论文中,分解出来的向量的信息被称为隐含向量(latent factor),前面的KNN模型就没有考虑到latent factor的影响,这也是KNN和Matrix Factorization模型最重要的区别。
除此之外,实际的推荐系统中还会考虑到偏见的影响,又称为基准偏移量,所以又有一个baseline模型。譬如有的用户很苛刻,倾向于给电影评分评低1分。有的电影口碑不好,譬如《小时代》,就容易被人故意评低几分。所以我们需要建立两个向量,一个存放每个用户的偏见分数,一个存放每个电影的偏见分数。这样就消除了偏见的影响。举个例子,譬如所有电影的评分的均值是3.5分(5分是满分),电影《小时代》倾向于被人评低2分,而用户小花评分不负责,总是评分多出均值1.5分,那我们对小花对《小时代》的评分预测就是3.5-2+1.5=2.5分。在实际算法中,两个偏移矩阵也是通过随机梯度下降学习出来。
到此,协同过滤的方法已经有三种了:矩阵分解、用户最近邻、基准偏移。
3. 基于社交网络的推荐
在真实的推荐系统中我们能得到的信息往往不止用户的评分信息,一般还有写别的的属性信息,譬如用户的填写的个人资料之类的。一种利用这些属性信息的办法就是在异质网络中进行推荐。譬如要看用户u对电影i的评分,可以找出用户u的好友们对i的评分,用这些评分再来预测u对i的评分。建立用户和项目之间的联系需要引入元路径的概念,譬如一种将用户u和电影i相连的方式就是u-u的朋友-i,这就可以看做一条路径,其他的路径还有用户-电影i-电影类型-电影j之类的。我自己的毕业设计做的就是这个,不过模型比较简单,挑选了5条元路径,每条路径上都是KNN推荐,最后的结果非常可观,完爆前面所说的其他算法。这说明在大数据分析中,数据量才是重点,挖空心思去研究数据背后的数学理论的结果远不如多整合点数据。
4. 结语
真正的推荐系统中往往都是结合了多种方法,然后再加上些抖机灵的办法。