漫谈“推荐系统” http://youngfor.me/post/recsys/man-tan-tui-jian-xi-tong
下面的大部分文字内容转自@复旦李斌的博客,非常白话的review了推荐系统领域的一些研究内容以及存在的挑战,其中穿插了一些自己理解笔记,以及添加了一些互联网上其他相关资料(如,七月在线)。
先谈谈问题背景,故事是这样的:互联网出现后,随着网上内容的增加,好学的小伙伴们发现很多他们不懂的姿势网上都有,可互联网不像图书馆搞个书目索引就行,于是出现了搜索引擎帮助小伙伴们在茫茫互联网上找到他们感兴趣的东西,但条件是你必须知道你想要什么,然后提取成关键字去搜,所谓信息检索(Information Retrieval)。十年过去了,信息爆炸了,问题出现了,搜索引擎动辄返回几十万个结果,或者有些想要的信息却根本不知道它的存在,甚至根本不知道如何用关键词描述你想要的东西,这时推荐系统应运而生——小伙伴们不用自己去找,推荐系统就会根据小伙伴们的个人资料历史纪录从海量信息中自动筛选符合小伙伴们口味的内容进行推荐,所谓推荐系统(Recommender Systems)。如今,推荐系统已经无处不在,几乎所有的网络服务都集成了推荐系统。在此我就不提那些学术圈老掉牙的例子什么Netflix电影推荐啊Google新闻推荐啊Yahoo!广告推荐啊什么的了;我瞄了下自己的手机举几个例子吧:微博朋友推荐、虾米音乐推荐、LinkedIn工作推荐、YouTube视频推荐、大众点评餐馆推荐、等等。
既然要谈的是推荐“技术”,那么我得先把推荐问题用数学语言形式化了。淡定淡定,推荐问题形式化后非常简单干净——就三个矩阵(从这里往下得有一丢丢想像力,能在脑海里想象简单的矩阵操作)。最重要的一个矩阵是评分或偏好矩阵(Rating/Preference Matrix),其每一行对应一个用户,每一列对应一件物品,矩阵中的任一元素就是某用户对某物品的感兴趣程度(评分可以用正整数表示,点赞神马的可以用0/1表示),不失一般性,下面我们仅基于评分矩阵讨论。这个评分矩阵是极其稀疏的,因为每个用户只可能对很少一部分物品打分。第二个矩阵是用户信息矩阵,每一行对应一个用户,每一列对应一个用户属性(如年龄、职业、地区、标签等)。第三个矩阵是物品信息矩阵,每一行对应一件物品,每一列对应一个物品属性(如电影的流派、导演、演员等)。推荐问题的目标就是:基于给定的三个矩阵,把评分矩阵中缺失元素的评分预测出来,并基于预测出来的评分把得分高的物品推荐给相应用户。这里值得注意的是,只有评分矩阵是所有推荐技术所必需的,用户信息矩阵与物品信息矩阵这两者是可选的。真实推荐系统面临最大的挑战是评分矩阵的大规模与稀疏性。
总结:推荐系统包含评分矩阵,用户信息矩阵和物品信息矩阵;推荐系统的目标是对于某个用户通过对该用户的用户属性找最相关的人或对该用户接触过的物品找最相关的物品推荐给他。下面是具体的分类。
接下来我把一些当前常用的推荐技术分门别类。推荐技术可先分为三大类:基于人口统计的推荐技术(Demography-based)、基于物品内容的推荐技术(Content-based)、以及基于协同过滤的推荐技术(Collaborative Filtering,简称CF)。基于人口的又包括基于用户资料的(User Profile)和基于信任关系的(社交网络上的好友关系)等。基于物品内容的又可细分为基于元数据的(即Metadata,比如电影的流派、导演、演员等)和基于内容数据的(比如视频数据、音频数据)等——真实应用大多是基于元数据的,基于内容数据的推荐系统由于语义鸿沟(Semantic Gap)和效率问题,做了几十年,一直未突破(深度学习能突破么,拭目以待呵呵)。虽然基于人口和基于内容的两大类推荐技术在实际中的应用极广而且效果在某些应用场景下不比第三类技术协同过滤差,那为什么协同过滤技术一跃成为当今主流的推荐技术了呢?有以下几方面原因:1)协同过滤问题相当干净,只需要一个评分矩阵,不需要用户信息与物品信息,这解决了用户物品信息缺失场景下的推荐问题。2)协同过滤问题的本质是矩阵补全问题(Matrix Completion),也就是把一个稀疏矩阵的缺失元素给估计出来,这是机器学习中一个经典问题,除了推荐之外还有无数的应用都可归结为矩阵补全问题,所以机器学习的高速发展也促进了协同过滤技术。3)2006年Netflix发起的那个百万美元大奖功不可没,直接上演了持续多年相关研究领域全民做推荐的激情岁月,虽然这个竞赛使用了一个完全误导的评价指标来判断推荐算法的优劣(使用的是RMSE指标,这是一个评价回归的指标,而推荐问题事实上是一个排序问题)。跑题了,接着分类。协同过滤技术可以继续分为基于记忆的(Memory-based)和基于模型的(Model-based)。基于记忆的继续可分为基于用户的(User-based)和基于物品的(Item-based);而基于模型的可以继续分为基于矩阵分解的(Matrix Factorization)和基于联合聚类的(Co-clustering)。基于记忆的协同过滤技术使用的是K-近邻(K-Nearest Neighbors)的思想,而基于模型的协同过滤技术使用的是机器学习方法。分类结束。
总结:主要分为三类:1.基于人口(具体分为:用户属性相同的人和关系亲密的人);2.基于元数据(即物品信息内容);3.协同过滤(分为基于记忆(和前面一样基于用户和基于内容),基于模型的)。
真实系统都是使用的混合策略(Hybrid Strategy),多为基于人口、基于元数据、以及基于用户或物品的协同过滤推荐技术的各种组合。基于模型的协同过滤虽然使用了高端大气上档次的机器学习方法,但做过真实应用的同学都懂的,简单粗暴才是王道,提出并改进一个模型连发三篇顶级机器学习会议论文提高了一个百分点,往往不如真实系统中屌丝程序员在哪疙瘩加个莫名的阈值来得有效。那为什么顶尖互联网企业都在搞机器学习呢?这么说吧,五百的衣服和五万的衣服功能都是一样的,但是地位高到一定程度,除了衣服的基本功能外我们还会追求一些其它的东西。但是如果只是想基于推荐技术做一个网络服务神马的,就没必要搞那么玄的机器学习花样了,反而大规模计算的效率问题和推荐应用本身是否有市场前景是更应该考虑的,有了这些,最基本的基于人口统计与基于记忆的推荐技术就能搞定大多数应用。貌似跑题了,接着说混合策略。有些混合策略是对不同推荐技术的结果加权相加(Weighting);有些是根据场景不同在不同技术间跳转(Switching),比如新用户基于人口统计老用户基于协同过滤;有些是一个网页上不同区域同时显示不同推荐技术的结果(Mixing);有些是用一个推荐技术对另一个推荐技术输出的结果进行提升(Cascading)。
除了基于模型的协同过滤技术外,其它的推荐技术在原理上都相对简单,使用一些相关查询和启发式算法就能解决。这段就把除基于模型的协同过滤以外的推荐技术都简单介绍下。首先是基于人口统计学的,该类推荐技术需要基于用户信息矩阵和评分矩阵。原理很简单,就是查找用户信息矩阵中背景类似的用户,然后把对应评分矩阵中打高分的物品推荐给背景类似的用户。举个例子,用户信息上显示两个人年龄相仿居于湾区互联网从业者,于是系统就会认为这两人相关性强会有共同爱好,把其中一人打高分的电影推荐给另一个。这种推荐技术的优点是简单,一些相关性查询操作就能搞定,而且没有“冷启动(Cold-start)”问题(即用户缺失历史评分纪录);缺点是无法个性化推荐,基于人口统计相似度的假设太强,比如同为IT男,一个技术宅,一个伪文青,你把技术宅喜欢的东西推荐给伪文青肯定是不靠谱的,比如我排斥一切XX侠的电影。接下来是基于物品内容的推荐技术,该类推荐技术需要基于物品信息矩阵和评分矩阵(这里只讨论基于元数据的,基于真实内容的开门课都讲不完)。该类推荐技术的原理也很简单,基于元数据计算物品之间的相关性,然后把与该用户以前打高分的物品最相关的物品推荐给他。这类推荐技术比前一种靠谱,因为用户在同类物品上一般会表现出相同的兴趣程度。举个例子,我如果对《巴黎我爱你》打了个高分,那么推荐系统就会向我推荐强关联的《纽约我爱你》,而我也会对同一血统的电影很感兴趣。因此,该类技术的优点就是对偏好的建模较为精细与准确;缺点是依赖于物品元数据包含的信息量,在冷启动问题(需要用户的历史评分)。接下来介绍基于记忆的协同过滤技术,该类推荐技术的标准问题设置仅需要评分矩阵,当然近年来学术界有些关于迁移学习(Transfer Learning)在推荐系统中的研究会使用到用户与物品的信息矩阵、甚至使用另一个域的评分矩阵(我以前在推荐系统中的工作主要在这块,感兴趣的同学可以用谷歌百度下一个二页纸的小文“Cross-Domain Collaborative Filtering: A Brief Survey”),但这里我们只讨论标准的协同过滤问题设置。
基于用户的协同过滤分为两步:第一步是计算用户之间的相关度,这里的相关度是评分矩阵行向量间的相关度,其直观意义就是如果两个用户在相同物品上打的分越接近,那么这两个用户的偏好也越接近。如果评分矩阵是一个没有缺失项的满矩阵,那么行向量之间的相似度直接可以用欧式距离或者夹角余弦计算;由于评分矩阵是稀疏矩阵,因此计算相关性首先要把两个行向量之间的交集(打过分的物品)找出来,并只在该交集上计算一个类似夹角余弦的值,叫作皮尔森相关系数(Pearson Correlation Coefficients)。在取得了与所有用户两两之间的相关性后,第二步就是预测该用户的缺失评分。给定一个待预测用户,找到他的K-近邻用户集合,他的缺失评分就是用其K-近邻用户对应物品上的历史评分用相关性加权平均得到。基于物品的协同过滤和基于用户的是对称的,一个是对行操作,一个是对列操作,方法和原理都是一样的。
总结:基于人口的推荐是对人的外部属性或者关系亲密的人找相同的人,并将其喜欢的推荐给目标用户;基于元数据的推荐是对某个人接触过的物品的属性找相关的物品推荐给他(会出现冷启动的问题,如某个用户刚进来);协同过滤中的基于用户和基于物品的推荐都是针对评分矩阵进行操作(加权求和得到),而协同过滤中基于模型的方法(也叫隐语义模型)认为人购买一个东西是因为一些隐藏的因素导致的,所以将原来的评分矩阵拆分成两个矩阵(用户和隐藏因子矩阵;物品和隐藏因子矩阵)(常见的SVD方法),如下图所示:
使用梯度下降这里就和传统的线性回归差不多,为避免过拟合一般会加上正则项。
加上正则化的目标函数变换为:
虽然正则化可以避免过拟合,但是每个人打分都存在一些习惯,如习惯打高分。同时,电影也可能会因为本身导致分数存在偏差,如好莱坞大片可能习惯得高分。所以,为了尽可能的消除人和电影的客观因素,对人和电影分别加上偏差,以及最后的正则项,最后的目标函数变为:
下图是比赛别人的效果对比图,从图中可以看出,协同过滤的推荐整体优于基于事物属性或人的属性来推荐的方案。此外,通过对隐语义模型加上正则项,bias项,以及时间(上下文信息)是优于前几种方案的。
从这里往后的内容主要将介绍基于模型的协同过滤技术。在大多数推荐系统的介绍中一般直接就把基于模型与矩阵分解等同起来了,因为应用到实际推荐系统中的基于模型的推荐技术一般都是基于矩阵分解的,比如Netflix百万大奖得主提出的(Time)SVD++方法(但事实上前几名所用的方法都是很多种算法集成的结果,所以说研究归研究,在实际应用中干净优美的模型很难超越东拼西凑再加点人脑规则的四不像,这个道理我早在八年前做TRECvid的时候就总结出来了,当时直接导致我放弃多媒体研究直到现在一直对计算机视觉抱有悲观态度)。又跑题了,继续说基于模型的推荐技术。除了矩阵分解,这里我还要额外介绍一种基于联合聚类的技术,所谓联合聚类,就是对用户与物品(即评分矩阵的行与列)同时聚类,聚类的方法可以是简单的K-Means,但更优美的建模方法是双向混合模型——我个人非常喜欢这种建模方式,虽然对于评分预测的性能没有基于矩阵分解的好(因为矩阵分解的目标就是拟合评分而混合模型的目标是估计用户与物品在潜在类型上的分布)。
先说基于矩阵分解的方法吧。给定一个评分矩阵(大小为N*M),把该矩阵分解为两个矩阵的乘积,一个是用户特征矩阵(大小为N*K),一个是物品特征矩阵(大小为M*K),其中潜在特征(latent features)的维度远小于用户数与物品数;目标函数就是两个特征矩阵的重构与给定评分矩阵在那些可见评分上的值尽可能接近,一般使用矩阵范数(Frobenius norm),即两个矩阵相减所有元素上残差平方和;再加上对两个特征矩阵的矩阵范数作为正则化项。改优化问题常用两种方法解决:一种是交替最小二乘(Alternative Least Squares),交替优化用户特征矩阵与物品特征矩阵,在优化其一的时候固定另一个的值视其为已知,这样就相当于每轮解决一个标准的最小二乘问题,最后收敛到局部最优解。该方法的优点是收敛速度快,缺点是需要对用户数与物品数大小的方正求逆,难以规模化。另一种是随机梯度下降(Stochastic Gradient Descent),对每个用户与每个物品(评分矩阵的行与列)分别求偏导建立牛顿迭代公式,然后用可见评分顺序对这些迭代公式进行更新。该方法的优点是可以并行化、效率高,目前大规模矩阵分解都是用的这种优化算法;缺点可能是收敛速度没有第一种快(这点我不是很确定)。最后说说这种形式矩阵分解的物理含义。这样分解成两部分后,就相当于用户和物品都被放置到一个潜在的K维特征空间,只要拥有相似潜在特征的用户与物品,他们的夹角就小乘积就大得到的预测评分也就相应更高。那么凭什么我们能指定一个“潜在的K维特征空间”呢?拿Pandora的音乐推荐举例子,每个音乐有几百条“音乐基因”就是音乐的显式特征(不知道音乐基因的可以去古歌百度一下Music Gene Project)。如果不降维的话,那么音乐特征矩阵和用户特征矩阵的纬度就是其真实的特征纬度。假设我们基于主成分分析(PCA)用相同的一套基分别对这两个矩阵进行线性变换,那么得到的两个矩阵就可以认为是投影到潜在特征空间的两个矩阵,而这两个矩阵的乘积和原来的两个矩阵是一样的(因为当中两个投影矩阵的乘积是单位矩阵)。那么假如我们只用前K个基投影呢?那我们就得到了只有K维潜在特征空间的低秩矩阵。所以在实际问题中,我们都不需要知道真实的特征空间,只需要人为指定一个K维潜在特征空间就可以了,得出的结果可以认为是真实特征经过某个线性变化后投影到一个低维潜在特征空间。
最后介绍基于联合聚类的方法。这类方法的物理意义更直观,其实也能表示成为矩阵分解的形式,但不同的是联合聚类把评分矩阵(大小为N*M)分解为三部分,一个是用户隶属度矩阵(N*K),表示每个用户在K个潜在用户组上的分布情况,所有元素为正每行加起来为1;一个是物品隶属度矩阵(M*L),表示每个物品在L个潜在物品组上的分布情况,所有元素为正每行加起来为1;还有一个是压缩评分矩阵(K*L),表示某个用户组对某个物品组给的评分。使用这三个矩阵的乘积重构评分矩阵可以对缺失评分进行预测。解决该问题最简单的方法是分别对行与列进行K-Means聚类,然后用户与物品隶属度矩阵就根据聚类结果把对应的组设为1其它为0(硬聚类),而压缩评分矩阵是每个联合聚类中评分的平均值。更一般性的建模方法是令两个隶属度矩阵为在潜在组别上的分布(软聚类),这需要使用期望最大(Expectation-Maximization)算法解决;进一步地考虑贝叶斯,由于隶属度就是Dirichlet分布,那么其实该联合聚类问题可以使用Latent Dirichlet Allocation的变种建模,叫作Bi-LDA,使用吉布斯采样解决。这类方法的具体细节就不介绍了。
至此为止,基本的推荐技术大体都过了一遍了。剩下的就是解决协同过滤技术中的各种挑战,比如兴趣随时间与环境变化问题、矩阵稀疏问题、冷启动问题、噪声问题、大规模矩阵分解问题等等,这些“挑战”也是近年来学术界写论文的切入点。但其实在工业界,这些所谓的挑战大多都不是问题,或是可以用替代方案解决、或是对结果真正的影响不大。我个人觉得无论是学术界还是工业界,当前最重要的问题还是大规模矩阵分解问题(我也无法免俗大数据啊),各路神仙也从不同的突破点去解决这个问题,有使用分布式计算的、有提出加速优化算法的、有使用近似哈希算法的等等。在我的短期课程中,针对这些挑战的一些解决方案也占了很大的比重,但是这里就不一一累述了,用纯文字描述个问题都得花半页纸。其实我本来还想谈一下在线推荐系统,也是如今精准广告投放背后的核心技术,但是也因为问题的设置和协同过滤有很大的不同,技术上也几乎没有什么交集,就不展开了。在线推荐系统的主要技术是一大类被称为Multi-Armed Bandits(MAB)的方法——没错就是老虎机!广告投放就像赌博,你选哪个广告投放出去都会有不同的回报,随着一次又一次的尝试,从失败中吸取教训,慢慢学习到背后隐含的规律,之后就可以保持大概率的赢面。MAB的在线学习策略遵循的是“开采(Exploitation)”与“探索(Exploration)”,一边尽量投注之前赢面较大的广告,一边又不停尝试其它未知底细的广告以发现更高的赢面——这不就像是人生么?有些人觉得现状不错就一直保持着开采状态,而有些人则时不时探索一下,也许会走一些弯路,可或许在一段弯路过后会发现比以前更好的一条路;更何况,人生并不只是用最后累积到的财富来论成败,沿途的风景,妙不可言的或是痛彻心扉的,都是人生独一无二的财富。
下面转自:http://www.sohu.com/a/202017547_197042
2. 推荐系统的结构(Structure)
尽管不同的网站使用不同的推荐系统,但是总的来说,几乎所有的推荐系统的结构都是类似的,都由线上和线下两部分组成。线下部分包括后台的日志系统和推荐算法系统,线上部分就是我们看到的前台页面展示。线下部分通过学习用户资料和行为日志建立模型,在新的上下文背景之下,计算相应的推荐内容,呈现于线上页面中。
3. 推荐引擎算法(Algorithm)
3.1 协同过滤推荐算法
3.1.1 关系矩阵与矩阵计算
在一个推荐系统中,存在三类关系:用户与用户(U-U矩阵)、物品与物品(V-V矩阵)和用户与物品(U-V矩阵)。
U-U矩阵
算法原理
在基于用户相似度的协同过滤中,用户相似度的计算是基本前提。Pearson相关系数主要用于度量两个变量 i 和 j 之间的相关性,取值范围是+1(强正相关)到-1(强负相关),计算公式为:
式中,为用户 i 和 j 共同评价过的物品的集合,c 是这个集合中的物品元素,是用户 j 对物品 c 的评价值,为用户 i 对物品 c 的评价值,和分别表示用户 i 和 j 对物品的平均评价值。
算法流程
算法输入:用户行为日志。
算法输出:基于协同的用户相似度矩阵。
A. 从用户行为日志中获取用户与物品之间的关系数据,即用户对物品的评分数据。
B. 对于n个用户,依次计算用户1与其他n-1个用户的相似度;再计算用户2与其他n-2个用户的相似度。对于其中任意两个用户 i 和 j :
a) 查找两个用户共同评价过的物品集;
b) 分别计算用户 i 和对物品 j 的平均评价和;
c) 计算用户间相似度,得到用户 i 和 j 的相似度。
C. 将计算得到的相似度结果存储于数据库中。
V-V矩阵
算法原理
在基于物品相似度的协同过滤中,物品相似度的计算是基本前提。将物品的评价数值抽象为n维用户空间中的列向量 和,使用修正的余弦相似度,计算公式为:
式中,为对物品和共同评价过的用户的集合, 是用户 u 对物品的评价值,和分别表示用户对物品和的平均评价值。
算法流程
算法输入:用户行为日志。
算法输出:基于协同的物品相似度矩阵。
A. 从用户行为日志中获取用户与物品之间的关系数据,即用户对物品的评分数据。
B.对于n个物品,依次计算物品1与其他n-1个物品的相似度;再计算物品2与其他n-2个物品的相似度。对于其中任意两个物品 i 和 j:
a)查找对物品 i 和 j 共同评价过的用户集;
b)分别计算用户对物品 i 和 j 的平均评价和;
c) 计算物品间相似度,得到物品 i 和 j 的相似度。
C. 将计算得到的相似度结果存储于数据库中。
U-V矩阵
在真实的推荐系统中,一方面U-V矩阵的行列数会随着用户和物品数量变得庞大,另一方面,因为用户实际上只能对有限数量的物品做出评价,所以U-V矩阵的内部会非常稀疏。系统在直接处理这些庞大稀疏矩阵时,耗费的时间、内存和计算资源都十分巨大。因此需要采取降低计算复杂度的方法。矩阵分解技术是一种有效降低矩阵计算复杂的方法,它的实质是将高维矩阵进行有效降维。
奇异值分解(SVD)
SVD将给定矩阵分解为3个矩阵的乘积:
式中,矩阵为对角阵,其对角线上的值 为矩阵M的奇异值,按大小排列,代表着矩阵M的重要特征。将SVD用在推荐系统上,其意义是将一个系数的评分矩阵M分解为表示用户特性的U矩阵,表示物品特性的V矩阵,以及表示用户和物品相关性的矩阵。
主成分分析(PCA)
在推荐系统中,对于有较多属性的物品(物品的信息用向量 表示)可用PCA处理进行降维,将m×n的物品矩阵转化为m×k的新矩阵。
3.1.2 基于记忆的协同过滤算法
基于用户的协同过滤算法
基于用户的协同过滤(user-based collaborative filtering)算法是推荐系统中最古老的算法,产生于1992年,最初应用于邮件过滤系统,1994年被GroupLens用于新闻过滤。在此之后直到2000年,该算法都是推荐系统领域最著名的算法。
算法原理
什么是基于用户的协同过滤算法?举个简单的例子,我们知道樱桃小丸子喜欢葡萄、草莓、西瓜和橘子,而我们通过某种方法了解到小丸子和花伦有相似的喜好,所以我们会把小丸子喜欢的而花伦还未选择的水果(葡萄和橘子)推荐给花伦。
通过上面的例子我们可以做出如下总结:假设用户为,物品,对的评分为,基于用户的协同过滤算法主要包含以下两个步骤:
A. 搜集用户和物品的历史信息,计算用户u和其他用户的相似度
,找到和目标用户Ui兴趣相似的用户集合N(u)
B.找到这个集合中用户喜欢的,且目标用户还没有听说过的物品推荐给目标用户。
算法流程
算法输入:用户行为日志,基于协同的用户相似性矩阵。
算法输出:初始推荐结果
A.访问用户行为日志,获取近期变化的用户ID集合U。
B.针对集合U中每个用户 u:
a) 访问用户相似矩阵,获取与用户相似的用户合集N(u)。
b)对于N(u)中的每一个用户ui:
获取与用户ui有关联的物品合集。
针对物品合集中的每个物品,计算用户偏好值。
c)对集M(u)中的所有物品进行按照用户偏好进行加权、去重、排序。
d) 取Top-N个物品,为每个物品赋予解释。
e) 保存Top-N个物品到初始推荐列表中。
适用性
由于需计算用户相似度矩阵,基于用户的协同过滤算法适用于用户较少的场合; 由于时效性较强,该方法适用于用户个性化兴趣不太明显的领域。
基于物品的协同过滤算法
基于物品的协同过滤(item-based collaborative filtering)算法是目前业界应用最多的算法。无论是亚马逊网,还是Netflix、Hulu、Youtube,其推荐算法的基础都是该算法。
算法原理
基于物品的协同过滤算法给用户推荐那些和他们之前喜欢的物品相似的物品。比如,我们知道樱桃小丸子和小玉都喜欢葡萄和西瓜,那么我们就认为葡萄和西瓜有较高的相似度,在花伦选择了西瓜的情况下,我们会把葡萄推荐给花伦。
ItemCF算法并不利用物品的内容属性计算物品之间的相似度,它主要通过分析用户的行为记录计算物品之间的相似度。该算法认为,物品A和物品B具有很大的相似度是因为喜欢物品A的用户大都也喜欢物品B。
假设用户为,物品,对的评分为,基于物品的协同过滤算法主要分为两步:
A.对于目标用户及其待评分的物品,根据用户对物品的历史偏好数据,计算物品与其他已评分物品之间的相似度 Sim(j,i),找到与物品相似度的物品合集N(u);
B. 根据所有物品 N(u) 的评分情况,选出N(u)中目标用户可能喜欢的且没有观看过的推荐给目标用户并预测评分。
式中,为用户 u 对物品 i 的评分,是用户 u 对他买过的物品的平均打分。
算法流程
算法输入:用户行为日志,基于协同的物品相似性矩阵
算法输出:初始推荐结果
A. 访问用户行为日志,获取该用户最近浏览过物品的用户集合U。
B.针对集合U中每个用户u:
a)访问用户相似矩阵,获取与用户相似的用户合集N(u)。
b)访问物品相似矩阵,获取与M(u)相似的物品合集N(u)。
c) 针对物品合集M(ui)中的每个物品,计算用户偏好值。
d)根据用户偏好值,对N(u)的物品进行排序。
e)取Top-N个物品,为每个物品赋予解释。
f) 保存Top-N个物品到初始推荐列表中。
适用性
适用于物品数明显小于用户数的场合; 长尾物品丰富,用户个性化需求强烈的领域。
UserCF和ItemCF的比较
3.1.2 基于模型的协同过滤算法
基于隐因子模型的推荐算法
隐语义模型是最近几年推荐系统领域最为热门的研究话题,它的核心思想是通过隐含特征(latent factor)联系用户兴趣和物品。也就是,对于某个用户,首先找到他的兴趣分类,然后从分类中挑选他可能喜欢的物品。
基本算法
基于兴趣分类的方法大概需要解决3个问题:
A.如何给物品进行分类?
B.如何确定用户对哪些类的物品感兴趣,以及感兴趣的程度?
C. 对于一个给定的类,选择哪些属于这个类的物品推荐给用户,以及如何确定这些物品在一个类中的权重?
隐含语义分析技术采取基于用户行为统计的自动聚类,可以自动解决物品分类问题。LFM通过如下公式计算用户 u 对物品 i 的兴趣:
这个公式中,和是模型的参数,其中, 度量了用户 u 的兴趣和第 k 个隐类的关系,而度量了第 k 个隐类和物品 i 之间的关系。要计算这两个参数,需要一个训练集,对于每个用户 u ,训练集里都包含了用户 u 喜欢的物品和不感兴趣的物品,通过学习这个数据集,就可以获得上面的模型参数。
LFM和基于邻域的方法的比较
理论基础
LFM具有比较好的理论基础,它是一种学习方法,通过优化一个设定的指标建立最优的模型。基于邻域的方法更多的是一种基于统计的方法,并没有学习过程。
离线计算的空间复杂度
基于邻域的方法需要维护一张离线的相关表。在离线计算相关表的过程中,如果用户/物品数很多,将会占据很大的内存。而LFM在建模过程中,可以很好地节省离线计算的内存。
离线计算的时间复杂度
在一般情况下,LFM的时间复杂度要稍微高于UserCF和ItemCF,这主要是因为该算法需要多次迭代。但总体上,这两种算法在时间复杂度上没有质的差别。
在线实时推荐
UserCF和ItemCF在线服务算法需要将相关表缓存在内存中,然后可以在线进行实时的预测。LFM在给用户生成推荐列表时,需要计算用户对所有物品的兴趣权重,然后排名,不太适合用于物品数非常庞大的系统,如果要用,我们也需要一个比较快的算法给用户先计算一个比较小的候选列表,然后再用LFM重新排名。另一方面,LFM在生成一个用户推荐列表时速度太慢,因此不能在线实时计算,而需要离线将所有用户的推荐结果事先计算好存储在数据库中。因此,LFM不能进行在线实时推荐,也就是说,当用户有了新的行为后,他的推荐列表不会发生变化。
推荐解释
ItemCF算法支持很好的推荐解释,它可以利用用户的历史行为解释推荐结果。但LFM无法提供这样的解释,它计算出的隐类虽然在语义上确实代表了一类兴趣和物品,却很难用自然语言描述并生成解释展现给用户。
基于朴素贝叶斯分离的推荐算法
算法原理
由于推荐问题可以看成分类问题,因此可以使用机器学习领域中的分类算法加以解决。朴素贝叶斯分类算法是贝叶斯分类算法中比较简单的一种,它的基本思想是:对于给出的待分类物品和既定的类别,计算该物品在各个类别中出现的频率,哪个类别计算出的概率大就将物品归于那个类。在推荐系统中,朴素贝叶斯分类能够在已知某些评分的情况下,通过计算概率预测未知评分。
计算中用到贝叶斯定理:
式中,表示事件B已经发生的前提下事件A发生的概率;P(A)和P(B)均为无条件概率。
算法流程
算法输入:已知目标用户对物品之外的物品的评分情况,以及其他用户对各物品的评分情况。
算法输出:确定目标用户对物品的评分。
A. 设为一个待分类项,为
的特征属性;
B. 设类别集合
C.计算:
a) 找到一个已知分类的待分类项集合作为训练样本;
b)统计得到在各个类别下各个特征属性的条件概率估计,即
c) 如果各个特征属性是条件独立的,则根据贝叶斯定理有如下关系:
因为分母对所有类别为常数,因此只需将分子最大化即可,又由于各特征属性是条件独立的,所以有:
D.,则。
适用性
朴素贝叶斯分类实现起来比较简单,准确率高,但是分类的时候需要学习全部样本的信息。因此,朴素贝叶斯分类适用于数据量不大,类别较少的分类问题。
3.2 基于内容(CB)的推荐算法
基础CB推荐算法
算法背景
基础CB推荐算法利用物品的基本信息和用户偏好内容的相似性进行物品推荐。通过分析用户已经浏览过的物品内容,生成用户的偏好内容,然后推荐与用户感兴趣的物品内容相似度高的其他物品。
比如,用户近期浏览过冯小刚导演的电影“非诚勿扰”,主演是葛优;那么如果用户没有看过“私人订制”,则可以推荐给用户。因为这两部电影的导演都是冯小刚,主演都有葛优。
计算公式为:
式中,表示用户,表示物品,表示用户在第 k 个方面的特征,表示物品在第 k 个方面的特征,表示和在第 k 个特征方面上的相似度,表示权重。
算法流程
算法输入:物品信息,用户行为日志。
算法输出:初始推荐结果。
A.物品表示:每个物品使用特征向量表示,
其中表示物品的特征属性;
B. 从用户行为日志中,获取该用户所浏览、收藏、评价、分享的物品集合M,根据物品集合M中物品的特征数据,可以学到用户的内容偏好;
C.保存Top-K个物品到初始推荐结果中。
适用场景
适用于基础CB架构的搭建,尤其是对新上线物品会马上被推荐非常有效,被推荐的机会与老的物品是相同的。
基于TF-IDF的CB推荐算法
算法背景
在推荐系统中,用户的反馈往往分为两类:评分和文字评论。前者通过分数直接反映用户对物品的喜好程度,后者则需要从文字当中提取关键信息,这时需要用到TF-IDF(Term Frequency-Inverse Document Frequency)。TF-IDF算法被公认为信息检索中最重要的发明,在搜索、文献分类和其他相关领域有广泛应用。
TF-IDF是自然语言处理领域中计算文档中词或短语的权值的方法,是词频(Term Frequency, TF)和逆转文档频率(Inverse Document Frequency, IDF)的乘积。TF指的是某一个给定的词语在该文件中出现的次数,这个数字通常会被正规化,以防止它偏向长的文件(同一个词语在长文件里可能会比段文件有更高的词频,而不管该词语重要与否)。IDF是一个词语普遍重要性的度量,某一特定词语的IDF,可以由总文件数目除以包含该词语的文件数目,再将得到的商取对数得到。
算法原理
TF-IDF算法基于这样一个假设:若一个词语在目标文档中出现的频率高而在其他文档中出现的频率低,那么这个词语就可以用来区分出目标文档。这个假设的主要信息有两点:
在本文档出现的频率高;
在其他文档出现的频率低。
因此,TF-IDF算法的计算可以分为词频(TF)和逆转文档频率(IDF)两部分,由TF和IDF的乘积来设置文档词语的权重。
假设文档集包含的文档数为N,文档集中包含关键词的文档数为,表示关键词在文档中出现的次数,表示文档中出现的词语总数,在文档中的词频定义为
这个数字通常会被正规化,以防止它偏向长的文件。
IDF衡量词语的普遍重要性。表示某一词语在整个文档中出现的频率,由它计算的结果取对数得到关键词的逆文档频率。
由TF和IDF计算词语的权重为
可以看出,TF-IDF与词语在文档中的出现次数成正比,与该词在整个文档集中的出现次数成反比。在目标文档中,提取关键词的方法就是将该文档所有词语的TF-IDF计算出来并进行对比,取其中TF-IDF值最大的个数组成目标文档的特征向量来表示该文档。
基于KNN的CB推荐算法
算法背景
KNN(k-Nearest Neighbor)算法基于这样的假设:如果在特征空间中,一个样本的k个最邻近样本中的大多数样本属于某一个类别,则该样本也属于这个类别。
算法原理
KNN在CB推荐算法中的应用于在CF推荐算法中的应用极为相似,它们都是要首先找到与目标物品相似的且已经被用户 u 评价过的 k 个物品,然后根据用户 u 对这 k 个物品的评价来预测其目标物品的评价。它们的差别在于,CF推荐算法中的KNN是根据用户对物品的评分来计算物品间相似度的,而CB推荐算法中KNN是根据物品画像来计算相似度的,所以对于后者来说,如何通过物品画像来计算物品间的相似度是算法中的关键步骤。相似度的计算可以使用余弦相似度或Pearson相关系数的计算方法。
算法流程
算法输入:用户已评分物品,目标物品 i 。
算法输出:用户对目标物品 i 的评分。
A.采用余弦相似度公式计算相似度。
B.选择最近邻。在用户 u 评过分的所有物品中,找出 k 个与目标物品 i 相似度最高的物品,并用 N(u,i) 来表示这出 k 个物品的集合。
C. 计算预测值。在第二步的基础上,可使用以下公式计算用户对目标物品的评分:
式中,表示用户 u 对物品 i 的预测评分,是相似度。
基于Rocchio的CB推荐算法
算法背景
Rocchio是从用户浏览历史中抽取用户喜好的物品特征来构建用户画像的一种常用算法,是信息检索领域处理相关反馈(Relevance Feedback)的一个著名算法。它提供了如何通过用户浏览的物品,反馈计算用户特征向量中属性值的方法。
举个简单例子,假如用户观看过“星球大战”和“加勒比海盗”,并给予高分,那么根据用户的行为历史数据构建画像时,用户的特征向量可表示为{“动作”:1,“欧美”:1,“科幻”:1,“冒险”:0.5}。
算法原理
Rocchio算法基于这样的假设:如果我们需要计算出最精准度的用户特征向量,那么这个用户特征向量应该与用户喜欢的物品特征最相似,与用户讨厌的物品特征最不同。若表示用户喜欢的物品,表示用户讨厌的物品,那么根据Rocchio算法的思想,定义最优的用户特征向量为:
式中,表示用户特征向量与用户喜欢的物品的相似度,采用余弦相似度计算,公式为:
更新用户的特征向量,修改公式为:
式中,是原始的用户特征向量,为权重。若用户新的历史数据较多,那么可以增大和的值,反之,用户更新数据较少则可以适当减小和 的值。在基于内容的物品推荐中,根据用户的历史行为数据建立用户画像,我们可以采用Rocchio算法不断地调整用户的特征向量。
基于决策树的CB推荐算法
算法背景
基于决策树的推荐算法在训练阶段会生成一个显示的决策模型。决策树可以通过训练数据构建并有效判断一个新的物品是否可能受到欢迎。当物品的特征属性较少时,采用决策树算法能够取得不错的效果,另外,决策树学习的思想也比较容易被理解,在物品推荐时的可解释性较好。
算法原理
在物品推荐系统中,决策树的内部节点通常表示物品的特征属性,这些节点用于区分物品集合,例如,通过物品中是否包含这个特征将其进行分类。在只有两个分类的简单数据集中,用户是否对物品感兴趣一般出现在决策树的叶子节点上。
基于线性分类的CB推荐算法
算法背景
将基于内容的物品推荐问题视为分类问题时,可以采用多种机器学习方法。从一个更抽象的角度上看,大部分学习方法致力于找到一个可以准确区分用户喜欢和不喜欢的物品的线性分类模型系数。
将物品数据用n维特征向量来表示,线性分类器试图在给定的物品特征空间中找到一个能够将物品正确分类的平面,一类点尽可能在平面的某一边(喜欢),另一类在平面的另一边(不喜欢)。
算法原理
基于线性分类器的CB推荐算法通过物品特征的线性组合进行分类。若输入的物品特征向量为,输出的结果 y 表示用户是否喜欢物品,则线性分类器可以表示为:
式中,表示物品特征向量对应的权重,根据输入的物品特征属性做出决定输出结果。
基于朴素贝叶斯的CB推荐算法
算法背景
基于朴素贝叶斯的推荐系统假设用户和物品的特征向量中的各个分量之间条件独立,判断用户是否对某个物品有兴趣的方法是将这个问题转化为分类问题:喜欢和不喜欢。
计算物品分类情况的后验概率为:
式中,表示物品的相关属性;C为物品的分类,表示在分类 c 的一个物品的特征属性出现的概率。这样,物品分类的后验概率可以通过观察分析训练数据得到。
算法原理
推荐系统中,分类 c 下的一个物品特征属性的条件概率用 在分类 c 下所有物品中出现的频率近似表示,即
式中,表示在标记为的物品 c 出现的次数,表示在这些物品中出现的所有特征属性的个数。为了预防计算概率为0的情况,对式子进行平滑,新公式如下:
式中,|V|表示所有物品中的出现的不同特征属性数。
3.3 基于知识的推荐算法
3.3.1 概述
基于知识(Knowledge-based, KB)的推荐算法,是区别于基于CB和基于CF的常见推荐方法。如果说CB和CF像通用搜索引擎的话,KB好比某个领域的垂直搜索引擎,可以提供该领域的特殊需求,包括专业性的优质特征,帮助提高搜索引擎在特定领域的服务。
以视频推荐为例,一部电影的上映时期和档期热度,哪些导演执导的一定是大片,变形金刚和指环王系列口碑肯定不会太差,都是非常有价值的推荐信息。此外,基于知识的推荐,也更容易满足主观个性化需求。例如,对于VIP用户,如果配置好了偏好,就可以为其提供更加精准的推荐服务。
约束知识与约束推荐算法
如今网上购物所能涵盖的物品越来越丰富,人们逐渐发现推荐系统的CF和CB推荐算法并不能很好地适应某些特殊物品的推荐需求。例如,更新换代非常快的而人们又通常不会经常更换的电子产品。对于这些产品来说,其各方面的性能参数在几年间就会有很大变化,代表历史偏好的用户画像并不能很好地反映用户当前的购买需求,于是就需要推荐系统将用户当前的需求作为重要信息参考源。人们发现可以利用物品的参数特征等属性形成约束知识,再将用户对物品的特定刻画为约束条件,然后经过对物品集合的约束满足问题的求解,就可以得到用户所期望的物品了。
创建推荐任务
推荐任务是以元组(R,I)的形式表示出来,其中用集合 R 表示目标用户对物品的特定需求,即对物品的约束条件,用集合 I 表示一个物品集合。推荐的任务就是从集合 I 中确定出能够满足集合 R 要求的物品。
推荐任务的解决
推荐任务的解决是以找到可能的集合 S 为目标,集合 S 应满足的条件是,并且,其中,表示对集合 I 进行合取查询的运算符,R 表示对物品的约束条件或选择标准。
冲突集
冲突集CS应满足的条件为:,并且。特别地,当不存在集合时,集合CS被称为最小冲突集。
诊断集
诊断集应满足的条件是,并且。特别地,当不存在集合时,集合被称为最小诊断集。
关联知识与关联推荐算法
算法原理
关联知识以关联规则为表现形式,用以描述数据库中数据之间关联性的知识。在推荐系统领域,可以通过对用户画像中关联规则的挖掘分析来分析用户的习惯,发现物品之间的关联性,并利用这种关联性指导系统做出推荐。
算法流程
算法输入:n个用户画像。
算法输出:针对目标用户u的Top-N推荐列表。
A. 从系统中的n个用户画像中挖掘出所有的强关联规则,建立集合
以表示目标用户u尚未观看但极有可能感兴趣的物品。
B.再次使用置信度对集合中的物品进行高低排序。
C.取出排序列表中的前N个物品构成Top-N推荐列表。 由于对系统中全体用户的画像进行规则关联挖掘意义不明显且计算量大,所以基于关联规则的推荐算法常与CF推荐算法混合使用。在这类混合方案中,使用了CF推荐算法中的最近邻算法将用户画像数目n限定在目标用户的最邻近范围内,使得关联规则挖掘算法处理的数据规模被有针对性地限定在一定范围内。
3.4 混合推荐算法
各种推荐方法都有优缺点,为了扬长补短,在实际中常常采用混合推荐(Hybrid Recommendation)。研究和应用最多的是内容推荐和协同过滤推荐的组合。最简单的做法就是分别用基于内容的方法和协同过滤推荐方法去产生一个推荐预测结果,然后用某方法组合其结果。尽管从理论上有很多种推荐组合方法,但在某一具体问题中并不见得都有效,组合推荐一个最重要原则就是通过组合后要能避免或弥补各自推荐技术的弱点。
加权式:加权多种推荐技术结果。
切换式:根据问题背景和实际情况或要求决定变换采用不同的推荐技术。
混杂式:同时采用多种推荐技术给出多种推荐结果为用户提供参考。
特征组合:
特征补充:一种技术产生附加的特征信息嵌入到另一种推荐技术的特征输入中。
级联式:
【end】