目录
我们需要通过算法自动发掘用户行为数据,从用 户的行为中推测出用户的兴趣,从而给用户推荐满足他们兴趣的物品。
2.1 用户行为数据简介
如搜索引擎中:
服务会为每次查询生成一个展示日志(impression log),其中记录了查询和返回结果。如果用户点击了某个结果,这个点击信息会被服务器截获并存储在点击日志(click log)中。 一个并行程序会周期性地归并展示日志和点击日志,得到的会话日志中每个消息是一个用户提交 的查询、得到的结果以及点击。
会话日志通常存储在分布式数据仓库中,如支持离线分析的 Hadoop Hive和 支持在线分析的Google Dremel。
用户行为:显性反馈和隐性反馈。
2.2 用户行为分析
2.2.1 用户活跃度和物品流行度的分布
都是长尾分布。也就是说非常活跃的用户/非常流行的物品,都只是小部分。不活跃的用户/不流行的物品,还很多。
“8/2”原则:80%的结果取决于20%的原因。如80%的流行度取决于20%的物品。
2.2.2 用户活跃度和物品流行度的关系
用户越活跃,越倾向冷门的物品。
仅仅基于用户行为数据设计的推荐算法一般称为协同过滤算法。最著名的、在业界得到最广泛应用的算法是基于邻域的方法,基于领域方法的主要有两种算法:
- 基于用户的协同过滤算法(userCF): 给用户推荐和他兴趣相似的其他用户喜欢的物品
- 基于物品的协同过滤算法(itemCF): 给用户推荐和他之前喜欢的物品相似的物品
2.3 实验设计和算法评测
评测推荐系统有3种方法:离线实验、在线实验和用户调查。
本节采用离线实验。
2.3.1 数据集
中等大小的MovieLens数据集:6000多用户对4000多部电影的100万条 评分。该数据集是一个评分数据集,用户可以给电影评5个不同等级的分数(1~5分)
本节着重研究隐反馈数据集中的TopN推荐问题,TopN推荐的任务是预测用户会不会对某部电影评分,而不是给电影评多少分。
2.3.2 实验设计
协同过滤算法的离线实验一般如下设计。
首先,将用户行为数据集按照均匀分布随机分成M 份(本章取M=8),挑选一份作为测试集,将剩下的M-1份作为训练集。
然后,在训练集上建立用户兴趣模型,并在测试集上对用户行为进行预测,统计出相应的评测指标。
为了保证评测指标并不是过拟合的结果,需要进行M次实验,并且每次都使用不同的测试集。然后将M次实验测出的评 测指标的平均值作为最终的评测指标。
2.3.3 评测指标
正确率即检索出来的有多少是正确的;召回率即所有正确的有多少被检索出来了。F值即正确率和召回率的调和平均值。
- 正确率:提取的正确数目 / 提取的总数目;
- 召回率:提取的正确数目 / 样本中总数目;
- F值:正确率 * 召回率 * 2 / (正确率 + 召回率);
2.4 基于邻域的算法
基于邻域的算法是推荐系统中最基本的算法。分为两类:userCF和itemCF。
2.4.1 基于用户的协同过滤算法
1. 基础算法
userCF的两个步骤:
- 用户相似度:找到和目标用户兴趣相似的用户集合
- 找到这个集合中的用户喜欢的,且目标用户没有听说过的物品推荐给目标用户
用户相似度计算:表示用户u曾经有过正反馈的物品集合;
表示用户v曾经有过正反馈的物品集合。
Jaccard公式:,或者余弦相似度:
如果有n个用户,那么两两用户都要计算,时间复杂度是,当用户量大时,非常耗时。
我们可以先把没有交集的用户排除掉,即找出的所有用户对(i, j),只对这部分用户做相似度计算。
得到用户之间的兴趣相似度后,UserCF算法会给用户推荐和他兴趣最相似的K个用户喜欢的物品。用户A没有对物品c、e有过行为,那么根据userCF,看下用户A对c和e的兴趣:
比如我们可以设置一个兴趣度阈值0.6,p(A,c) >0.6, p(A,e) > 0.6,故给用户A推荐c和e。
注:有一个重要参数K,即选K个与他兴趣相似的用户。K的选定会影响性能(准确率、召回率等)。
2. 用户相似度计算的改进
如果两个人都买了《新华字典》,那么不能说明他们兴趣相似。如果两个人都买了《推荐系统实践》,那么可以认为他们兴趣相似。也就是说,两个用户对冷门物品采取过同样的行为更能说明他们兴趣的相似度。
改进的余弦公式:
该公式,分子部分惩罚了用户u和用户v共同兴趣列表中热门物品对他们相似度的影响。
3. 举例
略。
2.4.2 基于物品的协同过滤算法
最基础、应该最多的推荐算法。
1. 基础算法
ItemCF算法并不利用物品的内容属性计算物品之间的相似度,它主要通过分析用户的行为记录计算物品之间的 相似度。
该算法认为,物品A和物品B具有很大的相似度是因为喜欢物品A的用户大都也喜欢物品B。
例如:喜欢《推荐系统实践》的用户,大都也喜欢《推荐系统》,所以这两本书有很大的相似度。
ItemCF算法分为两步:
- 计算物品之间的相似度
- 根据物品的相似度和用户的历史行为给用户生成推荐列表
物品相似度可以理解为:喜欢物品i的用户中有多少比例的用户也是喜欢物品j
其中,分母表示喜欢物品i的用户数,分子表示同时喜欢物品i和物品j的用户数。
上述公式虽然看起来很有道理,但是却存在一个问题。如果物品j很热门,很多人都喜欢,那么Wij就会很大,接近1。因此,该公式会造成任何物品都会和热门的物品有很大的相似度,这对于致力于挖掘长尾信息的推荐系统来说显然不是一个好的特性。为了避免推荐出热门的物品, 可以用下面的公式:
这个公式惩罚了物品j的权重,因此减轻了热门物品会和很多物品相似的可能性。
那么,
在得到物品之间的相似度后,ItemCF通过如下公式计算用户u对一个物品j的兴趣:
这里N(u)是用户喜欢的物品的集合,S(j,K)是和物品j最相似的K个物品的集合,wji是物品j和i 的相似度,rui是用户u对物品i的兴趣。(如果用户u对物品i有过行为,如观看过,即可令 rui=1)
2. 用户活跃度对物品相似度的影响
活跃用户(如书店批发老板)对物品相似度的贡献应该小于不活跃的用户,IUF修正物品相似度:
这个公式只是对活跃用户做了软性的惩罚,对于过于活跃用户(如买了当当网80%图书的书店老板),应该直接忽略他的兴趣列表。
3. 物品相似度的归一化
假设物品分为两类——A和B,A类物品之间的相似 度为0.5,B类物品之间的相似度为0.6,而A类物品和B类物品之间的相似度是0.2。在这种情况下, 如果一个用户喜欢了5个A类物品和5个B类物品,用ItemCF给他进行推荐,推荐的就都是B类物品, 因为B类物品之间的相似度大。
但如果归一化之后,A类物品之间的相似度变成了1,B类物品之 间的相似度也是1,那么这种情况下,用户如果喜欢5个A类物品和5个B类物品,那么他的推荐列 表中A类物品和B类物品的数目也应该是大致相等的。从这个例子可以看出,相似度的归一化可 以提高推荐的多样性。
2.4.3 UserCF与ItemCF的比较
UserCF比ItemCF古老,UserCF的代表实践者是Digg,ItemCF的代表实践者是亚马逊。
UserCF的推荐结果着重于反映和用户兴趣相似的小群体的热点,而ItemCF 的推荐结果着重于维系用户的历史兴趣。换句话说,UserCF的推荐更社会化,反映了用户所在的小型兴趣群体中物品的热门程度,而ItemCF的推荐更加个性化,反映了用户自己的兴趣传承。
一般来说,新闻类用UserCF,图书、电子商务和电影网站用ItemCF。
注:标准ItemCF算法的覆盖率和新颖度都不高。
2.5 隐语义模型
2.5.1 基础算法
核心思想:通过隐含特征 (latent factor)联系用户兴趣和物品。隐语义模型有很多,以LFM为主讲。
2.5.2 基于LFM的实际系统的例子
略
2.5.3 LFM和基于领域的方法的比较
略
2.6 基于图的模型
略
2.6.1 用户行为数据的二分图表示
略
2.6.2 基于图的推荐算法
略