推荐系统学习综述


推荐系统

根据用户的兴趣以及需求等,通过推荐算法从各类数据库信息里挖掘出用户可能感兴趣的内容,并将得到的项目以个性化的形式推荐给用户。

能够有效解决信息过载问题,解决了无穷无尽的信息与用户有限的精力之间的矛盾;使得用户的碎片时间得到了最大化效益,帮助用户快速地发现自己感兴趣以及高质量的信息;用户花费在移动端APP的时间变得更多,增加了用户粘性,推荐方法也可以引导用户点击或者购买,提高了转化率,进而提高互联网企业效益。

长尾问题

 大多数现有的推荐算法只能为主流热门的商品或项目提供推荐,而很大程度上不会向用户推荐长尾处的冷门商品或项目。那些分布在尾部80%的冷门商品的商业规模可以超过头部前20%的热门商品(??二八定律:前20%的热门商品提供了80%的利润)。所以也要重视长尾商品,不断发现用户的潜在喜好。

推荐系统分类

特征是被观测对象的一个独立可观测的属性或者特点。通常将特征表示为向量的形式。

基于内容的推荐

挖掘用户曾经喜欢的物品,本质上就是利用用户已知的偏好、兴趣等特征和物品的特征相匹配,以此为用户推荐新的感兴趣的商品,这种算法主要是提取推荐对象的特征

比如用户A喜欢看爱情电影,用户B喜欢看恐怖电影,当新上映一部片子的定位是爱情电影时,就把它推荐给用户A

基于协同过滤的推荐(CF)

基于内存的协同过滤

主要是通过启发式的方法来进行推荐,主要步骤一个是相似性函数的选择,如何选择合适的相似性函数来更好的度量两个项目或者用户的相似性是关键;另一个主要步骤是如何进行推荐,最简单的推荐方法是基于大多数的推荐策略,即推荐那些大多数人产生过行为而目标用户未产生过行为的项目。

最重要的一个矩阵是评分或偏好矩阵(Rating/Preference Matrix),其每一行对应一个用户,每一列对应一件物品,矩阵中的任一元素就是某用户对某物品的感兴趣程度

基于用户的协同过滤

从行的角度计算相关度,选取和特定用户最相似的K个用户,将用户的列表中没有但相似的K个用户中有的高频项目推荐给此用户。

第一步是计算用户之间的相关度,指的是上述提到的矩阵行向量间的相关度,如果两个用户在相同物品上打的分越接近,那么这两个用户的偏好也就越接近。如果矩阵是满矩阵,那么行向量之间的相关度直接可以用欧氏距离(n维空间下两点之间的距离:根号下(a1-b12+(a2-b22+...+(an-bn2)或者余弦相似度来计算。如果矩阵是稀疏矩阵,计算相关度要把两个行向量之间的交集找出来,在该交集上计算皮尔逊相关系数。取得了所有用户两两之间的相关度之后,第二步是预测该用户的缺失评分(根据已知值来预测出未知项的值),即给定一个待预测用户,找到他的K-近邻用户集合(和用户兴趣最相似的K个用户的集合),他的缺失评分就是用其K-近邻用户对应物品上的历史评分用相关性加权平均得到。将缺失评分排序后,选取最高的N个项目推荐给用户。

余弦相似度:通过计算两个向量角度的余弦值来评估他们的相似度

取值为【-1,1】,相同的两个向量之间的相似度为1。

皮尔逊相关系数:其值介于【-1,1】之间,值越大则说明相关性越强。

基于项目的协同过滤

和基于用户的协同过滤步骤相同,只不过是从列的维度来计算相关度,选取和特定项目最相似的K个项目构成推荐列表,将用户的列表中还没有发生过的项目推荐给用户。

比如你们班的学生都喜欢玩单机小游戏,你没有玩过召唤神龙,但你们班90%的同学都玩过,就把召唤神龙推荐给你,是基于用户的协同过滤。召唤神龙和大鱼吃小鱼很类似,把你没有玩过的大鱼吃小鱼推荐给你 ,就是基于项目的协同过滤。

  基于用户的协同过滤 基于项目的协同过滤
性能 适用于用户较少的场合,如果用户太多,计算用户相似度矩阵的代价变大 适用于项目数明显小于用户数的场合,如果项目很多,计算项目相似度矩阵的代价变大
领域 实效性要求较高,用户个性化兴趣要求不高 长尾物品丰富,用户个性化需求强烈
实时性 用户有新行为,不一定需要推荐结果立刻变化 用户有新行为,一定会导致推荐结果的实时变化
冷启动

新用户出现时,找不到与其相似的用户,无法进行推荐;

新用户出现时,无法根据其之间的喜好进行推荐

基于模型的协同过滤

模型的建立相当于从行为数据中提取特征,给用户和物品同时打上“标签”。

隐语义模型(LFM)

没有显性特征,需要根据已有的偏好数据,去发掘出隐藏的特征。

假设现在已知用户对不同视频的兴趣程度以及每个视频占比类型

可以得到:

用户潜在因子矩阵:

  军事 时政 历史 娱乐 爱情
用户A 0.7 0.3 0.4 0.8 0.8
用户B 0.8 0.4 0.6 0.7 0.1
用户C 0.5 0.6 0.7 0.3 0.1

数值表示不同用户对于不同标签的偏好程度

视频潜在矩阵:

  军事 时政 历史 娱乐 爱情
视频A 0.8 0 0.4 0.8 1
视频B 0 0.8 0 0.7 0
视频C 0.5 0 0.7 0.6 0

数值表示每种视频包含各种标签的比例

利用上面的两个矩阵,就可以推算用户A对视频A的喜欢程度,即:

用户A对军事的偏好 * 视频1含有军事成分 + ……(依次类推相乘相加),得到:0.7 * 0.8+0.3 * 0+0.4 * 0.4+0.8 * 0.8+0.8 * 1=2.16

同理,可以得到所有用户对所有视频的喜爱程度:

  视频A 视频B 视频C
用户A 2.16 0.8 1.11
用户B 1.13 0.81 1.24
用户C 1.16 0.69 1.02

因此,我们推荐用户A的视频是A,对用户B推荐的视频是C,对用户C推荐的视频是A。但这种推荐过程有几个问题:

  1. 需要计算用户对不同视频的喜好程度
  2. 需要给每个视频打不同粒度的标签
  3. 需要计算不同标签在视频中所占比例

为此, LFM 提出了一个相对简单的解决方案。

LFM的思想与上面的例子类似,通过

计算用户u对物品i的兴趣程度。参数 pu,k表示用户 u 的兴趣和第 k 个隐类的关系(即0~1内的数值), qi,k 表示物品i和第k个隐类的关系(即0~1内的数值),而参数 F 则是隐类的个数。这两个参数需要通过有监督的机器学习方法得到。

既然是有监督的机器学习,那就需要构造数据集。对于用户喜欢的物品当作是正样本,而负样本的生成应该遵循下面的规则:

  • 对每个用户,要保证正负样本的平衡(数目相似)。
  • 对每个用户采样负样本时,要选取那些很热门,而用户却没有行为的物品。

一般认为,很热门而用户却没有行为更加代表用户对这个物品不感兴趣。因为对于冷门的物品,用户可能是压根没在网站中发现这个物品,所以谈不上是否感兴趣。
于是经过采样,就可以得到一个用户-物品集 K = {(u, i)} ,其中(u, i)是样本,如果是正样本则对应的 label 用 rui = 1表示,否则 rui = 0 。

其中损失函数定义为,λ 是为了减少过拟合而加入的正则化参数

使用随机梯度下降算法对此损失函数进行优化,对p和q分别求偏导得:

,于是,其中,α 是学习率,需要手动设置

??优点:

  • 能通过参数 F 控制分类的粒度
  • 能给一个物品多个分类
  • 可以确定物品在某个分类中的权重

??缺点:

  • 很难实现实时的推荐。
  • 推荐模型的更新,需要在用户行为记录上反复迭代,每次训练都很耗时。
  • 冷启动问题明显。

评价指标

预测准确度可以用评分预测和TopN表示。

评分预测的预测准确度一般通过均方根误差(RMSE)和平均绝对误差(MAE)计算。对于测试集中一个用户u 和 物品 i,令 yui 是用户u对i 的实际评分,而^yui 是推荐算法给出的预测评分。那么 RMSE 的定义为:

EU为测试集。

MAE的定义为:

TopN方法:网站在提供服务时,一般是给用户一个个性化的推荐列表,这种推荐叫做 TopN 推荐。TopN 推荐的预测准确度一般是通过 准确率(precision)/召回率(recall) /F1指标度量。

对用户u">u推荐了N个物品 R(u)">R(u),用户在测试集上喜欢的物品集合为T(u)">T(u)

准确率:推荐给用户的物品中,属于测试集的比例

召回率:测试集中有多少在用户的推荐列表中

F1指标:

对P和R加权调和平均,当a=1时,即为F1指标

给用户推荐了100个物品,用户喜欢其中的10个,而用户喜欢的所有物品总数为50个

准确率为10/100=0.1

召回率为10/50=0.5

F1=2*0.1*0.5/(0.1+0.5)=1/6