本系列文章会从最简单的推荐系统到目前主流的推荐系统解决方案作总结。算法
基于邻域的算法是推荐系统中最基本的算法,在业界获得了普遍应用。基于邻域的算法分为两大类,一类是基于用户的协同过滤算法,另外一类是基于物品的协同过滤算法。编程
定义:性能
在一个在线个性化推荐系统中,当一个用户A须要个性化推荐时,能够先找到和他有类似兴趣的其余用户,而后把那些用户喜欢的、而用户A没有据说过的物品推荐给A。网站
步骤:ui
设用户u和用户v ,N(u)表示用户u曾经有过正反馈的物品集合,N(v)表示用户v曾经有过正反馈的物品集合。能够经过下面几种方法计算用户的兴趣类似度。spa
举例:设计
用户A对物品{a, b, d}有过行为,用户B对物品{a, c}有过行为,利用余弦类似度公式计算用户A和用户B的兴趣类似度为:3d
同理,能够计算出用户A和用户C、 D的类似度:orm
分析:blog
以上例子对两两用户经过利用余弦类似度计算类似度。这种方法的时间复杂度是O(|U|*|U|),这在用户数很大时很是耗时。解决办法是创建“物品—用户”的倒排表。能够扫描倒排表中每一个物品对应的用户列表,令稀疏矩阵C[u][v]= | N(u)∩N (v) |,将用户列表中的两两用户对应的C[u][v]加1,最终就能够获得全部用户之间不为0的C[u][v],具体以下图所示:
这里的W是余弦类似度中的分子部分,而后将W除以分母能够获得最终的用户兴趣类似度。
获得用户之间的兴趣类似度后, UserCF算法会给用户u推荐和他兴趣最类似的K个用户喜欢的物品。以下的公式度量了UserCF算法中用户u对物品 i 的感兴趣程度:
其中, S(u, K)包含和用户u兴趣最接近的K个用户, N(i)是对物品 i 有过行为的用户集合,即用户v的集合, wuv是用户u和用户v的兴趣类似度, rvi表明用户v对物品i的兴趣。
举例:
以上图为例,对用户A进行推荐。选取K=3,用户A对物品c、 e没有过行为,所以能够把这两个物品推荐给用户A。根据UserCF算法,用户A对物品c、 e的兴趣是:
分析:
使用MovieLens数据集上的离线实验来评测基础算法的性能。 UserCF只有一个重要的参数K,即为每一个用户选出K个和他兴趣最类似的用户,而后推荐那K个用户感兴趣的物品:
能够发现参数K是UserCF的一个重要参数,它的调整对推荐算法的各类指标都会产生必定的影响。
准确率和召回率:
能够看到,推荐系统的精度指标(准确率和召回率)并不和参数K成线性关系。在MovieLens数据集中,选择K=80左右会得到比较高的准确率和召回率。所以选择合适的K对于得到高的推荐系统精度比较重要。固然,推荐结果的精度对K也不是特别敏感,只要选在必定的区域内,就能够得到不错的精度。
流行度:
能够看到,在3个数据集上K越大则UserCF推荐结果就越热门。这是由于K决定了UserCF在给你作推荐时参考多少和你兴趣类似的其余用户的兴趣,那么若是K越大,参考的人越多,结果就愈来愈趋近于全局热门的物品。
覆盖率:
能够看到,在3个数据集上, K越大则UserCF推荐结果的覆盖率越低。覆盖率的下降是由于流行度的增长,随着流行度增长, UserCF愈来愈倾向于推荐热门的物品,从而对长尾物品的推荐愈来愈少,所以形成了覆盖率的下降。
用户类似度计算的改进
余弦类似度计算用户兴趣过于粗糙。
改进思路:两个用户对冷门物品采起过一样的行为更能说明他们兴趣的类似度。
经过1/log(1+|N(i)|)惩罚了用户u和用户v共同兴趣列表中热门物品对他们类似度的影响。这种算法叫作User-IIF算法。
一样地,对UserCF-IIF的推荐性能,并将其和UserCF进行对比:
能够看到,UserCF-IIF在各项性能上略优于UserCF。这说明在计算用户兴趣类似度时考虑物品的流行度对提高推荐结果的质量确实有帮助。
基于用户的协同过滤总结
基于物品的协同过滤算法是目前业界应用最多的算法。
定义:
给用户推荐那些和他们以前喜欢的物品类似的物品。
步骤:
物品的类似度:
其中分母 |N(i)| 是喜欢物品 i 的用户数,而分子 |N(i) ∩N(j)| 是同时喜欢物品 i 和物品 j 的用户数。上述公式能够理解为喜欢物品 i 的用户中有多少比例的用户也喜欢物品 j 。
分析:
但上述公式存在一个问题,即若是物品 j 很热门,不少人都喜欢,那么Wij就会很大,接近1。即会形成任何物品都会和热门的物品有很大的类似度,致使出现长尾效应。
物品类似度计算的改进
经过惩罚物品j的权重,从而减轻了热门物品会和不少物品类似的可能性。
用ItemCF算法计算物品类似度时也能够首先创建用户—物品倒排表(即对每一个用户创建一个包含他喜欢的物品的列表),而后对于每一个用户,将他物品列表中的物品两两在共现矩阵C中加1。
上图左边是输入的用户行为记录,每一行表明一个用户感兴趣的物品集合。右边矩阵C中的 C[i][j] 记录了同时喜欢物品 i 和物品 j 的用户数。最后,将C矩阵归一化能够获得物品之间的余弦类似度矩阵W。
在获得物品之间的类似度后, ItemCF经过以下公式计算用户u对一个物品 j 的兴趣:
这里N(u)是用户喜欢的物品的集合, S(j,K)是和物品 j 最类似的K个物品的集合, wji是物品j和i的类似度, rui是用户u对物品 i 的兴趣度。(对于隐反馈数据集,若是用户u对物品 i 有过行为,那么rui=1)
该公式的含义是,和用户历史上感兴趣的物品越类似的物品,越有可能在用户的推荐列表中得到比较高的排名。
例子:
用户喜欢《C++ Primer中文版》和《编程之美》两本书。而后ItemCF会为这两本书分别找出和它们最类似的3本书,并根据公式的定义计算用户对每本书的感兴趣程度。
能够看到, ItemCF的一个优点就是能够提供推荐解释,即利用用户历史上喜欢的物品为如今的推荐结果进行解释。
分析:
ItemCF算法离线实验的各项性能指标的评测结果:
精度(准确率和召回率)
能够看到ItemCF推荐结果的精度也是不和K成正相关或者负相关的,所以选择合适的K对得到最高精度很是重要。
流行度
和UserCF不一样,参数K对ItemCF推荐结果流行度的影响也不是彻底正相关的。随着K的增长,结果流行度会逐渐提升,但当K增长到必定程度,流行度就不会再有明显变化。
覆盖率
K增长会下降系统的覆盖率。
物品类似度计算的改进
两个物品产生类似度是由于它们共同出如今不少用户的兴趣列表中。换句话说,每一个用户的兴趣列表都对物品的类似度产生贡献。那么,是否是每一个用户的贡献都相同呢?
未必。有些用户虽然活跃,可是买这些书并不是都是出于自身的兴趣,并且这些书覆盖了当当网图书的不少领域,因此这个用户对于他所购买书的两两类似度的贡献应该远远小于一个只买了十几本本身喜欢的书的文学青年。即:活跃用户对物品类似度的贡献应该小于不活跃的用户。
ItemCF-IUF算法
上式增长用户活跃度对数的倒数这个参数来修正物品类似度的计算公式。
ItemCF-Norm 算法
研究中发现若是将ItemCF的类似度矩阵按最大值归一化,能够提升推荐的准确率。所以,若是已经获得了物品类似度矩阵w,那么能够用以下公式获得归一化以后的类似度矩阵w':
归一化的好处不只仅在于增长推荐的准确度,它还能够提升推荐的覆盖率和多样性。
能够看到,归一化确实能提升ItemCF的性能,其中各项指标都有了比较明显的提升。
UserCF给用户推荐那些和他有共同兴趣爱好的用户喜欢的物品。
ItemCF给用户推荐那些和他以前喜欢的物品相似的物品。.
因此,UserCF的推荐结果着重于反映和用户兴趣类似的小群体的热点,既社会化。而ItemCF的推荐结果着重于维系用户的历史兴趣,即个性化。
所以,在新闻推荐中使用UserCF,缘由有三:
在图书、电子商务和电影网站中使用ItemCF,缘由有三:
总结
在设计ItemCF算法之初发现ItemCF算法计算出的图书相关表存在一个问题,就是不少书都和《哈利波特》相关。也就是说,购买任何一本书的人彷佛都会购买《哈利波特》。后来他们研究发现,主要是由于《哈利波特》太热门了,确实是购买任何一本书的人几乎都会购买它。
但实际上,这些书与《哈利波特》并不一样属同一类型。换句话说,哈利波特问题描述的是两个不一样领域的最热门物品之间每每具备比较高的类似度。
解决办法:
其中一个办法是能够在分母上加大对热门物品的惩罚,好比采用以下公式:
其中α∈[0.5 ,1] 。经过提升α,就能够惩罚热门的物品 j 。而更好的方法是依靠引入物品的内容数据解决这个问题,好比对不一样领域的物品下降权重等。