一直以来对推荐系统的学习和理解来自一些机器学习书中简单介绍(如《集体智慧编程》和《机器学习实战》)和自己网上搜的一些资料。而当被问及对推荐系统的改进和理解,发现自己对推荐系统所知甚少,除了知道几个常用的算法外,根本没有更深入的理解,更别提改进了。本篇博客为学习《推荐系统》一书的读书笔记,记录了常见的推荐算法和其思想。
ps:推荐系统入门学习可以看蒋凡先生翻译的《推荐系统》和项量的《推荐系统实践》。
协同过滤(Collaborative Filtering Recommendation),这是目前使用的非常广泛的一个算法。分为基于用户的协同过滤算法和基于物品的协同过滤算法。
系统思想是:如果用户在过去有相同的偏好(比如他们浏览或买过相同的书),那么他们在未来也会有相似的偏好。比如,用户A和B购买经历非常重叠,而且最近A买了B不知道的一本书,那么这时的基本逻辑是像B推荐这本书。由于选择可能感兴趣的书涉及到从大量的集合中过滤出最有希望的书,而且用户是隐式地与其他人相互协作,因此这种技术被称为协同过滤。
纯粹的协同过滤过滤方法不会利用或要求任何有关物品本身的知识,这样子的优势是,系统不需要获取并维护这些数据,其次,使用这些特征推荐的物品与用户过去喜欢的物品确实很相似,这样可能更有效一些。
输入:用户-物品评分矩阵
输出:当前用户对物品喜欢或不喜欢程度的预测数值,n项推荐物品列表
算法思想:以给定的评分数据集和当前用户为输入,寻找过去与当前用户有相似偏好的其他用户(这些用户有时也称为对等用户或者最近邻),找出后,对当前用户没有购买过/见过/使用过的每个商品p,利用其最近邻进行商品p的评分,以该评分作为预测的当前用户对这些商品的评分,并将评分高的物品推荐给当前用户。
一句话:找到跟用户有相似兴趣的其他用户,将其他用户感兴趣的物品推荐给当前用户。
假设:1)如果这些用户们过去有相似的偏好,那么他们未来也会有相似的偏好;2)用户的偏好不会随时间的变化而变化。
寻找与当前用户相似的用户需要利用用户-物品评分矩阵进行用户相似度计算,以用户之间的相似度表示用户之间的相似程度。
使用的算法有:
Pearson相关系数。注意,皮尔森相关系数即为数学上常用的相关系数。
改进的余弦函数。
Spearman秩相关系数。
选择与当前用户最相似的k个用户作为用户的近邻,并使用近邻和用户自身平均评分的偏差来计算当前用户对物品p的预测值。
如果预测列表中有一些物品的预测分值很高,那么可以将这些分值高的物品推荐给当前用户。
算法思想:流程类似基于用户的协同过滤,但是是计算和利用物品之间的相似度。如果商品A和商品B很相似,即购买商品A的用户群和购买商品B的用户群重合度很高(A和B被人同时喜欢),那么A和B商品就很相似,如果发现当前用户购买过A但是没有购买过B,于是可以向用户推荐B商品。
一句话:找到相似的物品,向用户推荐他没买过的相似的物品。
改进的余弦函数。
离线构建物品相似度矩阵。
二次采样
协同过滤需要对物品评分。
隐式评分:用户浏览停留时间/购买记录/点击/播放。
显示评分:用户自己评分。
实际应用中,由于用户一般只会评价/购买少部分的物品,评分矩阵一般都非常稀疏。此时一般需要利用用户的附加信息,如用户的性别,年龄,教育,兴趣等信息。针对刚上线的推荐系统,当然此时已经不再是纯粹的协同方法了。
用户-物品关系图,计算路径距离,扩展激活
缺省投票:给评分次数少的物品赋以缺省值。
冷启动:给没评分过用户推荐,给没被评分/被购买过的物体做推荐。解决的办法也是使用混合的方法(引入额外的信息)
传统的基于用户协同推荐,评分数据都存在内存中,直接生成推荐结果,精度高,但是性能和扩展性低
离线运算,有基于物品的过滤和一些降维技术。
使用矩阵因子分解的方法,从评分模式中取出一组潜在的因子,并通过因子向量描述用户和物品。
基于SVD推荐:将高度相关且一起出现的词语作为单独因子
主成成分分析:对评分进行预处理,得到主要方面,以解释大多数变量
关联规则挖掘的想法可以移植到协同推荐,将目标换成自动发现规则,比如“如果用户喜欢物品1和2,那么他很可能也喜欢物品5”
Apriori
朴素贝叶斯,计算(预测)用户在对其他物品评分集合X下对新的物品评分为i的概率。
将相似的物品或用户进行聚类,计算用户属于不同聚类的概率,再结合评分矩阵进行预测。
使用贝叶斯信任网络进行分类条件概率建模
利用用户对物品之间的评分差异来计算(预测)新的物品评分。
简单,使用
最新:概率潜在语义索引(PLSI)
考虑离线模型的连续更新问题。
推荐与用户过去喜欢的物品相似的物品。根据物品本身内容的相似度来做推荐,侧重于推荐文本描述的物品,并能自己学习用户记录。
(基于知识的推荐系统通常是显示询问用户偏好的)
推荐系统也可以看成是解决信息过载的工具(从大量的集合里选择最感兴趣的物品),所以,推荐系统的研究也根植于信息检索和信息过滤领域,这些领域主要强调的是区分相关和不相关的文档。
基于内容推荐的核心是能够得到物品的描述(人工生成/自动抽取),需要得到用户的记录(自动抽取/学习,或直接询问)。
优点:不需要大规模用户即可达到适度的推荐精度,而且一旦得到物品的属性就能够立刻进行推荐新物品。
基于内容推荐系统的一般工作原理是:评估用户还没看到的物品与当前用户过去喜欢的物品的相似程度。
维护物品特征的详细列表(属性集,特征集,物品记录),对于图书而言,可以是体裁,作者名,出版社,类型,价格等其他描述信息
相似度量:Dice系数。
提取文档内容中的关键字。
去停用词,词干还原(对英文?),选择出信息量大的词,使用短语
最近邻
如kNN,分为短期的最近主题信息和长期的最有信息量的词语。搜索短期模型和近邻。搜索长期~。如来了一组新闻,判断是否是用户最近关注的新闻,取相关度最高的来推荐。
相关性反馈
rocchio方法。
给定推荐结果,用户显示/隐式(单击)对结果评分。
将文档按用户是否喜欢进行分类(朴素贝叶斯,效率高,容易更新),冷启动(人工标注,用户填写兴趣)
其他:考虑文档词频。
将基于内容的推荐问题看做分类问题,那么还可以运用其他的机器学习技术。
SVM
决策树:内部节点为特征词,叶子结点为类别(相关/不相关)。因为基于内容推荐需要使用较大的特征集合,而决策树在特征较多时效果并不好。可以综合使用,比如先用决策树找出最相关的用户模型特征,再用协同过滤。
随机森林
规则归纳法:从训练数据中抽取决策规则。
决策模型的优势:推导出的决策规则可以作为生成系统推荐解释的基础;已有的先验领域知识可以整合到模型中。
卡方统计,互信息,词频,信息熵等。
局限:在推荐网页时,仅仅通过文本内容就想决定网页的质量和偏好可能还不够,还有其他的因素比如美观,可用性,超链接的正确性和布局等也决定了网页的质量。另外,小文本很难抽取出有区分度的好特征。
问题:如何考虑非文本因素(视频,图片,样式),从小文本中提取学习特征困难。
推荐结果缺乏新颖性:例子:推荐了用户熟知的物品/大路货。推荐了用户最近看过的用户最近看过的相同题材的文章。
获取评分:冷启动。需要用户标注的喜欢和不喜欢的标注集合。
在电子产品消费领域,会出现大量的单次购买者,系统可能无法依赖购买记录,没法应用协同过滤和基于内容的过滤。评分具有时效性,5年前对电脑的评分对基于内容的推荐就不太适合了。对于需求形式化的处理并不是纯粹协同过滤和基于内容推荐所擅长解决的。
原因:用户不会频繁地购买房子,车子和计算机,用户要明确定义需求。
基于知识的推荐系统需要利用到当前用户和有效物品的额外信息。要满足用户提出的特征,同时,也需要维护用户模型(确认用户偏好,如分辨率跟重量谁更重要)来提供个性化推荐。
基于知识的系统依赖物品特性的详细知识。
基于约束的推荐问题一般可以表示为由约束求解的约束满足问题,或者是数据库引擎执行并解决的合取查询形式。
基于实例推荐系统主要利用相似度衡量标准从目录中检索商品。
约束满足问题(CSP)。
基于实例推荐:利用相似度,描述物品属性与某些给定用户需求之间的匹配程度。
基于效用推荐可以看成是基于知识推荐的一种具体类型。
交互过程:
用户指定自己的最初偏好
有了足够多的需求和偏好后,提供一组产品,可提供推荐产品的解释。
用户进行需求修改,比如看看其他的候选方案,或者减少产品数量。
推荐默认值:帮助用户说明需求,尤其是当用户不清楚该选择哪个物品或者弄不清某些专业细节时。
静态默认设置:每个用户属性都有这个默认设置。
条件默认设置:根据用户的潜在需求进行组合确定。
派生默认设置:利用已有的交互日志自动抽取默认值。
确定默认值的方法:1最近邻,加权多数投票。
放宽问题限制。
物品排序根据市多属性效用理论,依据每个物品对用户的效用来评价。每个物品会根据事先定义好的维度进行评价。
用户以当前待推荐的物品未满足的目标来指明他们的修改要求。如:当前显示数码相机价格太高,用户就会给出更便宜的评价。
基于实例推荐系统的最新进展整好了基于查询和基于浏览的物品检索。一方面评价有助于在物品集合内有效地引导用户;另一方面,基于相似度的实例检索有助于识别最相似的物品。
允许用户在多个属性进行评价,提高了交互效率,减少了评价周期
用到范式。每一轮的评价是实时产生的。计算动态评价用到关联规则挖掘。
基于效用的推荐(Utility-based Recommendation)是建立在对用户使用项目的效用情况上计算的,其核心问题是怎么样为每一个用户去创建一个效用函数,因此,用户资料模型很大程度上是由系统所采用的效用函数决定的。基于效用推荐的好处是它能把非产品的属性,如提供商的可靠性(Vendor Reliability)和产品的可得性(Product Availability)等考虑到效用计算中。
(加权,组合,并行,串行)
内在有效性:指的是在受控测试条件下观察到的效果程度。
外在有效性:推广到其他其他用户群或环境的效果程度。
利用历史数据集进行评估,交叉验证。
点击率,准确率,召回率,MAE(平均绝对误差),ROC等
攻击的记录插入代价;攻击是否是针对特定算法设计的;攻击是否具有可识别性。
随机攻击;均值攻击;造势攻击;局部攻击;针对性的打压攻击;点击流攻击和隐式反馈(针对协同过滤等基于用户点击的推荐系统,使用爬虫等模拟点击访问一些物品,构造虚假的用户浏览记录,这种记录会干扰协同过滤的推荐,影响最近邻用户的选择)
对策:使用基于模型的技术和额外的信息(尽量采用不是只依赖评分信息的推荐系统);提高插入成本;自动探测攻击。
使用分布式协同过滤,为了保护用户隐私可以使用数据扰动(对用户的评分数据进行模糊,但是不妨碍进行有意义的计算)
环境效应,折中效应,非对称的优势效应,吸引效应;首位/新近效应;其他效应
个性和社会心理学,控制点,结束的需求,最大者和满意者,从众,信任,情感说服。
基于信任网络的推荐系统
大众分类法:基于标签云的推荐
上下文感知推荐,考虑时间地点同伴,移动领域。
我这边有两个问题,一个是与学长聊天时想的,一个是遇到的一道笔试题。
网易云音乐每天都会生成n首音乐推荐,请问,你觉得系统该如何设计进行这种个性化推荐?
首先要有一个离线和在线的推荐模型。
离线模型主要是应用推荐算法离线生成每个用户的个性化音乐列表,比如一次生成x首,x大于n。
而在线模型主要是当用户在实时使用过程中根据用户的反馈进行个性化音乐列表的修改(比如用户在听的过程中对某一种类型的音乐选择了不喜欢,那么个性化推荐列表就该删除这种类型的音乐,随之用离线的x首未选中的排名靠前的不是这类音乐的歌单替换)。
用户模型信息的获取,我觉得应该有用户听过的歌单列表及其播放次数,用户搜索/浏览/查看过某歌曲记录,用户收藏、喜欢的歌单和歌手,用户点击过喜欢和不喜欢的歌曲类型记录,用户好友记录。
对于离线推荐算法,我觉得应该是一个混合的推荐过程。其中应该有基于用户的协同过滤,即考虑与用户有相同爱好的其他用户,选择其他用户喜欢听的音乐而当前用户还没听过,则加入推荐列表。应该有基于歌曲的协同推荐,找出与用户喜欢听的音乐非常相似的音乐(主要利用用户-歌曲评分矩阵),这里可以使用一些降维技术,可以应用关联规则推荐等,然后将这些音乐加入到推荐列表。
基于内容的推荐。利用歌曲本身的信息(如旋律变化,歌词,使用的乐器等)来计算与当前用户喜欢的音乐相似度较高的音乐,然后选择相似度高的音乐加入推荐歌单。
将推荐看成是分类问题,使用LR,贝叶斯,SVM,RF等分类器进行用户是否喜欢某首音乐的分类作为推荐。
考虑短期模型和长期模型,在上面的推荐算法中考虑短期模型和长期模型,短期模型指的是用户最近一段时间喜欢听的,新加入收藏歌单的一些歌或者歌手,找出这些歌曲的相似歌曲进行推荐,长期模型指的是用户在较长的历史期间都喜欢听的一些歌手,歌曲,找出这些歌曲的相似歌曲进行推荐。
组合推荐,考虑上面提及的几种推荐方式,在一起选择一种混合的方式进行推荐。
按照上面的算法能够生成一个歌单,设生成了x首,x可能比较大,此时要选择前n首作为推荐歌单,而不能讲所有x首音乐全显示给用户了,一方面用户一次性听不了这么多首音乐,另一方面用户看到太多的列表可能也不会点太多,也方便页面布局,最后我们只需要推荐用户最喜欢的几首歌就行了,而排名靠后的音乐预测用户喜欢的程度可能没那么高。
你用过的推荐系统觉得有什么弊端,请提出自己的改进。
还是以网易云音乐为例,我觉得它的推荐不够多样性。如果我喜欢听A,B和C三种类型的歌曲,则网易云音乐几乎每天都会给我推荐这些类型下的歌曲。这样长期以往,如果我没有在网易云音乐上点击过或收藏过其他类型的歌曲,那么我的歌曲推荐将一直局限在一个目前这个歌曲类型中。而事实上,我可能也喜欢听D,E和F类型的歌曲,只是我现在没有听过,没准听了就喜欢了。
改进是,在主体保证推荐准确度的情况下,按照某种策略逐渐尝试推荐不同类型的歌曲给用户,如偶尔推荐给用户其他领域较为热门的歌曲混入每日歌单中。
以上问题的想法均属个人瞎想,如果您有意见请不吝指出。