http://book.douban.com/subject/10769749/
第一章 好的推荐系统
使用推荐系统的原因:信息过载 information overload
推荐:social recommendation; content-based filtering; collaborative filtering
系统:
评测推荐效果的实验方法:1. offline experiment; 2. user study; 3. online experiment (AB test)
评测指标:
(1) 用户满意度
(2) 预测准确度。评分预测:均方根误差(RMSE),平均绝对误差(MAE);TopN推荐:precision/recall curve
(3) 覆盖率 coverage:描述发掘长尾的能力,最好100% (全部覆盖)。覆盖的分布(平均度):信息熵;基尼系数
(4) 多样性 diversity
(5) 新颖性:用户没有听说过
(6) 惊喜度 serendipity:推荐结果和用户历史兴趣不相似,但却让用户觉得满意
(7) 信任度 trust:增加推荐系统的透明度(transparency),考虑用户的社交网络信息(好友)
(8) 实时性:用户新的行为变化;新加入系统的物品(冷启动)
(9) 健壮性 robust:e.g. profile injection attack
(10) 商业目标:e.g. 销售额
评测维度:用户、物品、时间,考察不同维度下的系统评测指标
References:
[1] http://dl.acm.org/citation.cfm?id=1864770
[3] http://dl.acm.org/citation.cfm?id=1125659
[4] http://research.microsoft.com/pubs/115396/evaluationmetrics.tr.pdf
[5] http://dl.acm.org/citation.cfm?id=1297235
[6] http://recsys.acm.org/2011/pdfs/RobustTutorial.pdf
第二章 利用用户行为数据
了解用户兴趣和需求的困难:
1. 自然语言理解技术不成熟
2. 用户兴趣不断变化,但不会不断更新兴趣描述
3. 很多时候用户不知道自己喜欢什么,或很难用语言描述自己喜欢什么
用户的行为不是随机的,而是蕴含着很多模式。基于用户行为分析的推荐算法:协同过滤算法。
用户行为数据:日志 raw log, session log, impression log (记录查询和返回结果), click log ==> 存储在Hadoop Hive (离线分析) 或 Google Dremel (在线分析) 等
显示反馈行为 explicit feedback (评分,喜欢/不喜欢),隐性反馈行为 implicit feedback (页面浏览、购买、观看行为)
用户行为分析:Power Law 长尾分布 Zipf定律
如:对k个物品产生过行为的用户数,或被k个用户产生过行为的物品数 (双对数曲线上呈现为直线)
用户活跃度和物品流行度:用户越活跃,越倾向于浏览冷门的物品
算法:neighborhood-based, latent factor model, random walk on graph等
基于邻域的算法:基于用户的协同过滤(兴趣相似的其他用户),基于物品的协同过滤(相似于之前喜欢的物品)
评测指标:Precision, Recall, Coverage = |Union_{u in U} R(u)| / |I|, 新颖度 = 平均流行度 (推荐的都热门,则新颖度较低。计算时对每个物品的流行度取对数,因长尾分布,取对数后平均值更加稳定)。
基于用户的协同过滤:(1) 找到和目标用户兴趣相似的用户集合 (2) 找到这个集合中的用户喜欢的,且目标用户没有听说过的物品推荐给目标用户
相似度:Jaccard, Cosine。建立物品到用户的倒查表。
计算用户兴趣相似度时考虑物品的流行度对提升推荐结果的质量有帮助。
基于物品的协同过滤 item-based collaborative filtering: 物品A和物品B具有很大的相似度相似度是因为喜欢物品A的用户大都也喜欢物品B (利用用户的历史行为)
(1) 计算物品之间的相似度;(2) 根据物品的相似度和用户的历史行为给用户生成推荐列表
建立用户到物品的倒排表。Amazon使用 [1]。
一些问题:用户活跃度影响物品相似度 [2];物品相似度的归一化 [3]
UserCF 和 ItemCF 的比较
隐语义模型 LFM (Latent Factor Model)
LSI, pLSA, LDA, Topic Model
从数据出发,自动找出物品/用户类别(属于每个类的权重),然后进行个性化推荐 --> latent variable analysis
隐性反馈数据集只有正样本,如何生成负样本?
采样没有过行为的物品,保证正负样本的平衡(数目相近),采样负样本时选取那些很热门、而用户却没有行为的物品。
LFM模型难以实现实时推荐,冷启动问题明显
与基于邻域的方法相比:理论基础较好(机器学习);空间复杂度低;时间复杂度一般略高
基于图的模型
用户-物品二分图:度量用户顶点和与之没有直接相连的物品节点在图上的相关性
相关性高的一对顶点:两点之间很多路径相连;两点之间的路径长度都比较短;连接两点间的路径不会经过出度比较大的顶点
Topic-sensitive pagerank [4]. 提高效率:稀疏矩阵快速求逆 [6]
References:
[1] http://ieeexplore.ieee.org/xpl/articleDetails.jsp?tp=&arnumber=1167344
[2] http://dl.acm.org/citation.cfm?id=2074100
[3] http://dl.acm.org/citation.cfm?id=502627
[4] http://dl.acm.org/citation.cfm?id=511513
[5] http://ieeexplore.ieee.org/xpl/login.jsp?tp=&arnumber=4072747
[6] http://dl.acm.org/citation.cfm?id=1835341
[7] http://ieeexplore.ieee.org/xpl/login.jsp?tp=&arnumber=4781145
[8] http://www.ideal.ece.utexas.edu/seminar/LatentFactorModels.pdf
第三章 推荐系统冷启动问题
cold start: 用户冷启动(给新用户做个性化推荐),物品冷启动(将新物品推荐给用户),系统冷启动(新网站)
solution: 热门排行榜(非个性化推荐),用户注册信息(人口统计学特征),用户社交网络信息,要求用户登录时对一些物品反馈,利用新物品的内容信息,专家知识
UserCF对物品冷启动不非常敏感(但仍需解决第一推动力问题),ItemCF物品冷启动时严重问题(需频繁更新相关表)
物品内容用vector space model表示,可利用TF-IDF计算词的权重,并计算余弦相似度,建立关键词-物品倒排表
Topic model [2]: 文档、话题、词语。每一篇文档都会表现为词的集合(bag of words)。一个人在写一篇文档时,首先想文章讨论哪些话题,然后思考这些话题应该用什么词描述,从而最终用词写成一篇文章。
使用LDA计算物品的内容相似度:先计算出物品在话题上的分布,然后用话题分布计算相似度 (计算分布的相似度可用Kullback-Leibler divergence, KL散度)
专家标注:音乐、电影的“基因” + 机器学习(自动标注新电影)
References:
[1] http://dl.acm.org/citation.cfm?id=1935910
[2] http://dl.acm.org/citation.cfm?id=944937
第四章 利用用户标签数据
UGC的标签内容:user generated content
label的流行度分布呈现非常典型的长尾分布
一、利用标签推荐物品:
1. 可借鉴TF-IDF思想赋予权重,并惩罚热门物品
2. 标签扩展:对每个标签找到和它相似的标签,可用topic model 或基于邻域的方法
3. 标签清理:去除stop word,词根变化,分隔符,让用户对标签进行反馈
基于图的推荐算法:图模型解释
label-based推荐最大好处是可以利用label做推荐解释,如标签云表示的兴趣分布
二、给用户推荐标签:方便用户输入标签;提高标签质量。推荐用户常用的label,推荐该物品的流行labels
对新用户或不热门物品:从物品内容中抽取关键词(如在上下文广告领域) + 关键词扩展
基于图的标签推荐算法:类似personalized pagerank
Reference:
[1] http://dl.acm.org/citation.cfm?id=1454017
[2] http://dl.acm.org/citation.cfm?id=1639726
[3] http://dl.acm.org/citation.cfm?id=1526800
[4] http://dl.acm.org/citation.cfm?id=1502650.1502661
[5] http://dl.acm.org/citation.cfm?id=1316678
第五章 利用上下文信息
alexander tuzhilin: "context aware recommender systems"
时间、地点、心情、季节等
推荐系统的实时性:推荐算法本身实时,非离线计算;推荐算法平衡考虑用户的近期行为和长期行为
推荐算法的时间多样性:推荐系统每天推荐结果的变化程度 --> 经常看到不同的推荐结果,用户满意度提高 [1]
实现方法:结果加入随机性;对看到多次的物品降权;使用随机的推荐算法
建模时间信息的方法:
1. 最近最热门 (时间衰减参数)
2. 时间上下文相关的ItemCF(短时间间隔的物品更高相似度,近期行为更大权重)
3. 时间上下文相关的UserCF(用户相似度考虑时间间隔,近期行为)
4. 时间段图模型 [2]
地点上下文信息:LARS [3]
References:
[1] http://dl.acm.org/citation.cfm?id=1835486
[2] http://dl.acm.org/citation.cfm?id=1835896
[3] http://ieeexplore.ieee.org/xpl/login.jsp?tp=&arnumber=6228105
[4] http://dl.acm.org/citation.cfm?id=1721677
第六章 利用社交网络数据
好友推荐可以增加推荐的信任度,可以解决冷启动问题,但并不一定能提高推荐算法的离线精度(好友关系不是基于共同兴趣产生的)
基于邻域的社会化推荐:familarity * similarity,考虑熟悉度和兴趣相似度
基于图的社会化推荐:如何建图?[2]
实际系统中有困难:用户所有好友历史记录庞大、大缓存数据库
信息流的个性化推荐 (twitter, facebook): 并不关心好友的所有言论
Facebook的EdgeRank:http://en.wikipedia.org/wiki/EdgeRank
推荐好友 link prediction: 基于内容、共同兴趣、社交网络图
References:
[1] http://dl.acm.org/citation.cfm?id=1835836
[2] http://dl.acm.org/citation.cfm?id=2043975
[3] http://dl.acm.org/citation.cfm?doid=1978942.1978974
[4] http://dl.acm.org/citation.cfm?id=1458205
[5] http://dl.acm.org/citation.cfm?doid=1518701.1518735
第七章 推荐系统实例
References:
[1] http://dl.acm.org/citation.cfm?id=1526711
[2] http://dl.acm.org/citation.cfm?id=1367529
[3] http://dl.acm.org/citation.cfm?id=1367554
第八章 评分预测问题
预测精度:通过已知的用户历史评分记录预测未知的用户评分记录
离线实验方法:RMSE
评分预测算法:1. 平均值;2. 基于邻域的方法;3. 隐语义模型与矩阵分解模型 (SVD, Funk-SVD, LFM, SVD++, ...);4. 加入时间效应;5. 模型融合(级联融合,加权融合)
Reference:
[1] http://dl.acm.org/citation.cfm?id=372071
[2] http://dl.acm.org/citation.cfm?id=657311
[3] http://dl.acm.org/citation.cfm?id=1644874
[4] http://ieeexplore.ieee.org/xpl/login.jsp?tp=&arnumber=5286031
[5] http://dl.acm.org/citation.cfm?id=1401944
[6] http://www.cs.uic.edu/~liub/KDD-cup-2007/proceedings/Regular-Paterek.pdf
后记
10条经验:
1. 确定你真的需要推荐系统。推荐系统只有在用户遇到信息过载时才必要。
2. 确定商业目标和用户满意度之间的关系。平衡企业的长期利益和短期利益之间的关系。
3. 选择合适的开发人员。
4. 忘记冷启动的问题。不断创新,互联网上有任何你想要的数据。只要用户喜欢产品,他们就会不断贡献新的数据。
5. 平衡数据和算法之间的关系。对用户行为数据的深刻理解是设计好推荐系统的必要条件。数据分析决定了如何设计模型,而算法只是决定了最终如何优化模型。
6. 找到相关的物品很容易,但是何时以何种方式将它们展现给用户是很困难的。
7. 不要浪费时间计算相似兴趣的用户,可以直接利用社会网络数据。
8. 需要不断提升算法的扩展性。
9. 选择合适的用户反馈方式。
10. 设计合理的评测系统,时刻关注推荐系统各方面的性能。