【读书笔记】推荐系统实践-常见推荐算法及应用

《推荐系统实践》系统性地介绍了推荐系统这一领域,思路清晰,详细介绍了各个领域不同情景的推荐算法的应用,是一本很好的推荐系统入门书,尤其第二第三章的讲解比较细致。(Ps:书中插入的python代码有点生硬,读者可以直接忽略)

衡量推荐算法的指标

  • 用户满意度

    满意度是评测推荐系统最重要的指标,但是无法通过离线计算获得,只能通过用户调查或者在线实验。

  • 预测准确度

    对于TopN推荐(这里主要讨论TopN推荐),对于准确度的衡量有两个指标。R(u)是针对测试集,根据用户在训练集上的行为给用户作出的推荐列表,而T(u)是用户在测试集上的行为列表。

    • 召回率:表示用户喜欢的物品列表里被推荐系统推荐到的比例

    Recall=uUR(u)T(u)uU|T(u)|

    • 准确率:表示推荐系统推荐给用户的列表里用户喜欢该推荐的比例

    Precision=uUR(u)T(u)uU|R(u)|

  • 覆盖率:述一个推荐系统对物品长尾的发掘能力。覆盖率 最简单的定义为推荐系统能够推荐出来的物品占总物品集合的比例。假设系统的用户集合为U ,推荐系统给每个用户推荐一个长度为N的物品列表R(u) 。

    Coverage=uUR(u)|I|

  • 多样性:多样性描述了推荐列表中物品两两之间的不相似性,与推荐的相似性是相对的。

  • 新颖性:是指给用户推荐那些他们以前没有听说过的物品,给用户带来新颖感

  • 惊喜度:区别于新颖性,如果推荐结果和用户的历史兴趣不相似,但却让用户觉得满意,那么就可以说推荐结果的惊喜度很高,而推荐的新颖性仅仅取决于用户是否听说过这个推荐结果。

  • 信任度:指用户给推荐系统给出结果的信任,可以通过增加推荐系统的透明度(给出推荐理由)和考虑用户的社交网络(用户更信任他们的好友)来提升推荐系统的信任度。

  • 实时性:表现在用户行为变化后,即使更新推荐列表;同时在新的物品加入系统,物品能够被推荐到用户。

  • 健壮性:推荐系统能够抗攻击,推荐系统依赖用户行为,如果用户刻意造假用户行为,就会对推荐结果造成影响(如淘宝刷单强行将物品刷到热门,被推荐的概率大大增加)。增加健壮性的方法有:

    • 使用代价比较高的用户行为赋予更高的权重,代价比较的高的行为造假率低。
    • 使用数据前,进行攻击检测

推荐算法简介

当前业界用的最多的算法就是基于领域的推荐算法,包括基于用户的协同过滤和基于内容的系统过滤,当然还有一些其他算法,包括了基于图的推荐算法、基于内容的推荐算法、隐语义模型、利用标签推荐等等。

【读书笔记】推荐系统实践-常见推荐算法及应用

1. 基于用户的协同过滤

a.推荐思想

当一个用户A需要个性化推荐 时,可以先找到和他有相似兴趣的其他用户(这里的兴趣相似指两人感兴趣的物品重合度高),然后把那些用户喜欢的、而用户A没有听说过的物品推荐给A。这种方法称为基于用户的协同过滤算法。

主要步骤包括:

  • 找到和目标用户兴趣相似的用户集合(计算与当前用户兴趣相似度高的用户)
  • 找到这个集合中的用户喜欢的,且目标用户没有听说过的物品推荐给目标用户

b.算法实现

给定用户u和用户v,令N(u)表示用户u曾经有过正反馈的物品集合,令N(v) 为用户v曾经有过正反馈的物品集合。那么u与v的相似度可以如下计算:

wuv=|N(u)N(v)||N(u)||N(v)|

比如用户A对物品a,b,d产生过正反馈,用户B对物品a,c产生过正反馈

用户 物品
A a,b,d
B a,c

那么用户A与用户B的相似度计算为:

wAB=|a,b,da,c||a,b,d||a,c|=16

假设用户数为n,利用一个n*n用户矩阵C保存用户两两之间相似度。但是这样两两计算用户相似度,用户数量多了之后,复杂度显然不可取。所以通常的计算方法是利用倒排表(物品到用户的倒排表)。对于每个物品都保存对该物品产生过行为的用户列表,设用户u和用户v同时属于倒排表中a物品对应的用户列表,那么矩阵对应的[u, v]位置加一。可以扫描倒排表中每个物品对应的用户列表,最终就可以得到所有用户之间相似度矩阵C。

注意得到了相似矩阵对于每个位置还需要除以|N(u)||N(v)|,才能得到相似度。

看下图,就会更清晰。

【读书笔记】推荐系统实践-常见推荐算法及应用

完成了用户之间相似度的计算,下面要根据相似度找到推荐的物品列表。

如下的公式度量了UserCF算法中用户u对物品i的感兴趣程度。这里S(u, K)包含和用户u兴趣最接近的K个用户,N(i)是对物品i有过行为的用户集合,wuv 是用户u和用户v的兴趣相似度,rvi代表用户v对物品i的兴趣(这里可以设为1):

pu,i=vS(u,K)N(i)wuvrvi

最后依据pu,i,找到最感兴趣的n的物品推荐给用户。

c.算法改进

在计算用户相似度的时候,简单的使用了余弦相似度公式,但这个公式过于粗糙。以电商为例子,如果两人都够了热门商品,并不能说明他们的相似度,因为很多人都会购买热门物品,所以改进的相似计算如下,惩罚了热门物品对相似度的影响。

wuv=iN(u)N(v)1log1+|N(i)||N(u)||N(v)|

2. 基于物品的协同过滤

a.算法思想

基于物品的协同过滤(itemCF)算法是目前业界应用最多的算法,算法思想是给用户推荐那些和他们之前喜欢的物品相似的物品,并且可以利用用户的历史行为给推荐结果提供推荐解释,明确给出推荐当前物品是因为你之前喜欢了xxx物品。

需要注意的是:在协同过滤中两个物品产生相似度是因为它们共同被很多用户喜欢,区别于仅仅基于物品本身相似度的推荐算法,也就是说每个用户都可以通过他们的历史兴趣列表给物品“贡献”相似度

主要步骤包括:

  • 计算物品之间的相似度
  • 根据物品的相似度和用户的历史行为给用户生成推荐列表

b.算法实现

给定物品i和物品j,令N(i)喜欢物品i的用户数量,令N(j) 为喜欢物品j的用户数量。那么i与j的相似度可以如下计算:

wij=|N(i)N(j)||N(i)||N(j)|

假设物品数为m,利用一个m*m物品矩阵C保存两两物品之间相似度。思路同UserCF,常的计算方法是利用倒排表(用户到物品的倒排表)。对于每个用户都保存一个他喜欢的物品列表,然后对于每个用户,将他物品列表中的物品两两在共现矩阵C中加1。然后除以|N(i)||N(j)|得到相似度。

看下图,就会更清晰。

【读书笔记】推荐系统实践-常见推荐算法及应用

完成了物品之间相似度的计算,下面要根据相似度找到推荐的物品列表。

ItemCF通过如下公式计算用户u对一个物品j的兴趣 。这里N(u)是用户喜欢的物品的集合,S(j,K)是和物品j最相似的K个物品的集合,wji是物品j和i 的相似度,rui是用户u对物品i的兴趣。

pu,i=iS(j,K)N(u)wjirui

最后依据pu,i,找到最感兴趣的n个物品推荐给用户。

3. UserCF和ItemCF的比较

指标 UserCF ItemCF
性能 适用于用户较少的场合,如果用户很多,计算用户 相似度矩阵代价很大 适用于物品数明显小于用户数的场合,如果物品很多计算物品相似度矩阵代价很大
领域 时效性较强,用户个性化兴趣不太明显的领域 长尾物品丰富,用户个性化需求强烈的领域
实时性 用户有新行为,不一定造成推荐结果的立即变化 用户有新行为,一定会导致推荐结果的实时变化
冷启动 在新用户对很少的物品产生行为后,不能立即对他进行个性化推荐,因为用户相似度表是每隔一段时间离线计算的。 新物品上线后一段时间,一旦有用户对物品产生行 为,就可以将新物品推荐给和对它产生行为的用户 兴趣相似的其他用户 新用户只要对一个物品产生行为,就可以给他推荐和该物品相关的其他物品 。 没有办法在不离线更新物品相似度表的情况下将新物品推荐给用户
推荐理由 很难提供令用户信服的推荐解释 利用用户的历史行为给用户做推荐解释,可以令 用户比较信服

4. 基于图的推荐算法

多用于社交关系推荐。将用户行为数据表示成图的形式。数据是由一系列二元组组成的,其中每个二元组(u, i)表示用户u对物品i产生过行为。很容易用一个二分图表示。

将用户行为表示为二分图模型后,下面的任务就是在二分图上给用户进行个性化推荐。如果将个性化推荐算法放到二分图模型上,那么给用户u推荐物品的任务就可以转化为度量用户顶点 vu和与vu没有边直接相连的物品节点在图上的相关性,相关性越高的物品在推荐列表中的权重就越高。

具体算法可以使用随机游走的PersonalRank算法

假设要给用户u进行个性化推荐,可以从用户u对应的节点开始在用户物品二分图上进行随机游走。游走到任何一个节点时,首先按照概率α决定是继续游走,还是停止这次游走并从初识节点开始重新游走。如果决定继续游走,那么就从当前节点指向的节点中按照均匀分布随机选择一 个节点作为游走下次经过的节点。这样,经过很多次随机游走后,每个物品节点被访问到的概率 会收敛到一个数。最终的推荐列表中物品的权重就是物品节点的访问概率

5. 基于内容的推荐算法

该推荐方法简单的利用物品之间的相似度进行推荐,给用户推荐与自己喜欢过物品相似的物品,而这里的相似度仅简单由物品本身计算而来(具体计算方法可根据不同物品的特性来定),无须用户参与。因为改方案常用于推荐系统冷启动。

这里以电影推荐为例:

电影的内容信息一般包括标题、导演、演员、编剧、剧情、风格、国家、年代等,对于一些文本形式的介绍(包括电影基本信息和评论等等),需要引入一些理解自然语言的技术抽取关键词。

下图展示了从文本生成关键词向量的主要步骤。对于中文,首先要对文本进行分词,检测出关键信息导演、地名、演员等,这些实体和一些其他重要的词将组成关键词集合,最后对关键词进行排名,计算每个关键词的权重,从而生成关键词向量。

对于电影m,他的内容表示为一个关键词向量如下,其中ei 就是关键词,wi 是关键词对应的权重,可以利用TF-IDF计算。

di=(e1,w1),(e2,w2)...

在给定物品内容的关键词向量后,物品的内容相似度可以通过向量之间的余弦相似度计算:

wij=didj|di||dj|

参考UserCF和ItemCF,同样可以利用关键词-物品倒排表来加速计算,对于每个关键字保存相对应物品的列表,将列表中的物品两两在相似度矩阵C中相应位置加1。

推荐系统冷启动方案

  • 提供非个性化的推荐:非个性化推荐的最简单例子就是热门排行榜,我们可以给用户推荐热门排行榜,然后等到用户数据收集到一定的时候,再切换为个性化推荐

  • 利用用户注册时提供的年龄、性别等数据做粗粒度的个性化

  • 利用用户的社交网络账号登录(需要用户授权),导入用户在社交网站上的好友信息,然 后给户推荐其好友喜欢的物品。

  • 要求用户在登录时对一些物品进行反馈,收集用户对这些物品的兴趣信息,然后给用户推荐那些和这些物品相似的物品。

  • 对于新加入的物品,可以利用内容信息,将它们推荐给喜欢过和它们相似的物品的用户

  • 在系统冷启动时,可以引入专家的知识,通过一定的高效方式迅速建立起物品的相关度表。 比如音乐推荐系统,借助专家对音乐进行标注,比如包括心情、类别、时间、态度、流派等等