推荐算法简介

时间:2022-12-07 12:21:26

一.推荐系统的主要算法[1] 

   按照使用数据分

         1.协同过滤:User-based协同过滤;Item-based协同过滤;基于模型的协同过滤
         2.基于内容的推荐:用户内容属性和物品内容属性
         3.社会化过滤:用户之间的社会网络关系

   按照模型分:

         1.最近邻模型:基于用户/物品的协同过滤算法
         2.Latent Factor Mode:基于矩阵分解/SVD的模型
         3.图模型:二分图模型,社会网络图模型

二.协同过滤[2]

       协同过滤是最早提出,研究最深入,商业应用最广泛的个性化技术。协同过滤技术服务的对象是个体,却利用了所有用户的信息。要理解什么是协同过滤(Collaborative Filtering, 简称 CF),首先想一个简单的问题,如果你现在想看个电影,但你不知道具体看哪部,你会怎么做?大部分的人会问问周围的朋友,看看最近有什么好看的电影推荐,而我们一般更倾向于从口味比较类似(衡量相似性)的朋友那里得到推荐。这就是基于用户的协同过滤的核心思想。

 首先,要实现协同过滤,需要一下几个步骤
 
    1.收集用户偏好数据
      2.找到相似的用户或物品
      3.进行计算推荐

    4.收集数据

       这里的数据指的都是用户的历史行为数据,比如用户的购买历史,关注,收藏行为,或者发表了某些评论,给某个物品打了多少分等等,这些都可以用来作为数据供推荐算法使用,服务于推荐算法。需要特别指出的在于,不同的数据准确性不同,粒度也不同,在使用时需要考虑到噪音所带来的影响。找到相似用户和物品这一步也很简单,其实就是计算用户间以及物品间的相似度。在知道了如何计算相似度后,就可以进行推荐了。以下是几种计算相似度的方法:

          1.欧几里德距离:


 
  
  
 
推荐算法简介

            2.皮尔逊相关系数

推荐算法简介

             3.Cosine 相似度

推荐算法简介

             4.Tanimoto 系数

推荐算法简介

    

    在协同过滤中,有两种主流方法:基于用户的协同过滤,和基于物品的协同过滤

       基于用户的协同过滤。 基本思想相当简单,使用历史数据,找到与目标用户对物品的偏好找“相似的”用户,根据“相似”的用户的相似度权重向量以及他们对物品的偏好,预测目标用户没有偏好的未涉及物品,计算得到一个排序的物品列表作为推荐。即衡量的是用户之间的相似性,与你有“相同品味”的用户购买的商品也是你可能购买的商品。

       计算上,先将一个用户对历史记录数据中的物品的偏好作为一个向量。继而衡量用户之间“相似性”,办法非常多[5],在讨论关联规则时提到的方法,例如Cosine相似性(分母是两个用户购买商品数目乘积的平方根)和Jaccard相似性(分母是两个用户购买商品的并集大小),都是常用的。举个例子,如果用户A购买了商品1,2,3,用户B购买了商品2,3,4,5,则分母是共同购买的商品数2Cosine相似性= 2/根号(3*4) =0.577Jaccard相似性= 2/5 =0.4。得到相似性后,可以把所有其他用户对商品的评价按照相似性加权求和的方式排序,排序推荐给目标用户;也可以选择相似性最高的k个用户,只考虑他们的影响;还可以设定一个相似性阈值,只考虑相似性高于这个阈值的用户的影响。

     具有的优势

       便于挖掘深层次的潜在关联,帮助提高交叉销售量。也就是在用户购买某品类产品的时候,向用户推荐其他品类的产品,从而提高用户购买的多样性。这不仅仅是眼前提高了用户的客单价,更重要的是扩充了用户新的购物品类,从而可以整体提高该用户的价值。

      下图给出了一个例子,对于用户 A,根据用户的历史偏好,这里只计算得到一个邻居 — 用户 C,然后将用户 C 喜欢的物品 D 推荐给用户 A。

推荐算法简介

         

     基于商品的协同过滤。原理和基于用户的 CF 类似:分析目标用户购买过的商品,向其推荐和他曾经购买过的商品“相似”的商品。即衡量的是物品之间的相似性,即可以理解成喜欢电影《整蛊大师》的人也可能喜欢《唐伯虎点秋香》,因为两种电影具有相似性——幽默搞笑+周星驰

      从计算的角度看,就是将所有用户对某个物品的偏好作为一个向量来计算物品之间的相似度,得到物品的“相似”物品后,根据用户历史的偏好预测当前用户还没有表示偏好的物品,计算得到一个排序的物品列表作为推荐。考虑互联网用户兴趣的实时性,一般而言只分析用户近期的购买行为,或者认为以前的购买行为对当前推荐的影响是随着时间递减的。

     在定义商品的相似性的时候,可以通过:

      1.行为。看两个商品是否频繁被同一个用户购买过;
      2.内容。看两个商品的属性或者描述是否具有相似性。

    优势

      1.方便设计实时响应的算法。因为商品之间的相似性可以离线计算。这样的话,用户每次浏览新的商品后,包括放入购物车或者购买,容易实时计算并立刻更新用户看到的推荐商品栏;
     2是该方法可解释性强.因为在对用户进行推荐的时候,可以告诉用户推荐给你这个商品的主要原因是因为参考了你曾经购买或者浏览的若干商品——可解释性可以大大提高用户体验,在个性化电子邮件营销中有很大用途。 

     劣势:基于商品的协同过滤往往倾向于推荐同品类商品,在交叉销售方面价值较小。

       Amazon所使用的推荐算法的核心就是建立在内容分析基础上的基于商品的协同过滤[6]。由于图书的内容很丰富,判断内容之间的相似性非常准确,所以该方法在Amazon上效果很好。但是需要注意的是,这种方法移植到其他商品的推荐上,效果可能大打折扣。       

     下图给出了一个例子,从行为的角度解释基于商品的协同滤波。对于物品 A,根据所有用户的历史偏好,喜欢物品 A 的用户都喜欢物品 C,得出物品 A 和物品 C 比较相似,而用户 C 喜欢物品 A,那么可以推断出用户 C 可能也喜欢物品 C。

推荐算法简介

      这两种方法遇到的一个共同的问题就是倾向于推荐热门产品,推荐的多样性和新颖性不够——如何在不伤害推荐精确性的前提下提高推荐的多样性和新颖性,是个性化推荐技术研究的重大挑战[7,8]

        计算复杂度。Item-CF 和 User-CF 是基于协同过滤推荐的两个最基本的算法,User CF 是很早以前就提出来了,Item CF 是从 Amazon 的论文和专利发表之后(2001 年左右)开始流行,大家都觉得Item CF 从性能和复杂度上比 UserCF 更优,其中的一个主要原因就是对于一个在线网站,用户的数量往往大大超过物品的数量,同时物品的数据相对稳定,因此计算物品的相似度不但计算量较小,同时也不必频繁更新。但我们往往忽略了这种情况只适应于提供商品的电子商务网站,对于新闻,博客或者微内容的推荐系统,情况往往是相反的,物品的数量是海量的,同时也是更新频繁的,所以单从复杂度的角度,这两个算法在不同的系统中各有优势,推荐引擎的设计者需要根据自己应用的特点选择更加合适的算法。

      适用场景在非社交网络的网站中,内容内在的联系是很重要的推荐原则,它比基于相似用户的推荐原则更加有效。比如在购书网站上,当你看一本书的时候,推荐引擎会给你推荐相关的书籍,这个推荐的重要性远远超过了网站首页对该用户的综合推荐。可以看到,在这种情况下,Item CF 的推荐成为了引导用户浏览的重要手段。同时 Item CF 便于为推荐做出解释,在一个非社交网络的网站中,给某个用户推荐一本书,同时给出的解释是某某和你有相似兴趣的人也看了这本书,这很难让用户信服,因为用户可能根本不认识那个人;但如果解释说是因为这本书和你以前看的某本书相似,用户可能就觉得合理而采纳了此推荐。

三.基于内容推荐[5]

        基于内容的过滤——CB(content-based)应该算是第一代的个性化应用中最流行的推荐算法了。但由于它本身具有某些很难解决的缺点 比方说:item的特征抽取一般很难(Limited Content Analysis):如果系统中的item是文档(如个性化阅读中),那么我们现在可以比较容易地使用信息检索里的方法来“比较精确地”抽取出item的特征。但很多情况下我们很难从item中抽取出准确刻画item的特征,比如电影推荐中item是电影,社会化网络推荐中item是人,这些item属性都不好抽。其实,几乎在所有实际情况中我们抽取的item特征都仅能代表item的一些方面,不可能代表item的所有方面。这样带来的一个问题就是可能从两个item抽取出来的特征完全相同,这种情况下CB就完全无法区分这两个item了。 再加上在大多数情况下其精度都不是最好的,目前大部分的推荐系统都是以其他算法为主(如CF),而辅以CB以解决主算法在某些情况下的不精确性(如解决新item问题)。但CB的作用是不可否认的,只要具体应用中有可用的属性,那么基本都能在系统里看到CB的影子。组合CB和其他推荐算法的方法很多,最常用的可能是用CB来过滤其他算法的候选集,把一些不太合适的候选(比如不要给小孩推荐偏成人的书籍)去掉。 主要步骤分三步:

        1、item特征提取
      2、利用用户喜欢过的item的特征数据,来学习出该用户的喜好模型
      3、有了item特征和用户喜好模型,就可以进行最有推荐了。和ng教授的推荐系统那一章原理基本一样

      在Andrew的机器学习的recommendationsystem design那一章里讲的就是基于内容的推荐,但是它的第三小节,标题为Collaborative Filtering技术,却不太明白了(有大牛或者可以帮我答疑解惑一下)。了解了一下,它所使用的算法是矩阵分解,他说矩阵分解=协同过滤?

四.SVD简介[3]

       假如要预测Zero君对一部电影M的评分,而手上只有Zero君对若*电影的评分和风炎君对若*电影的评分(包含M的评分)。那么能预测出Zero君对M的评分吗?答案显然是能。最简单的方法就是直接将预测分定为平均分。不过这时的准确度就难说了。本文将介绍一种比这个最简单的方法要准上许多,并且也不算复杂的算法。 SVD(Singular Value Decomposition)的想法是根据已有的评分情况,分析出评分者对各个因子的喜好程度以及电影包含各个因子的程度,最后再反过来根据分析结果预测评分。电影中的因子可以理解成这些东西:电影的搞笑程度,电影的爱情爱得死去活来的程度,电影的恐怖程度。。。。。。SVD的想法抽象点来看就是将一个N行M列的评分矩阵R(R[u][i]代表第u个用户对第i个物品的评分),分解成一个N行F列的用户因子矩阵P(P[u][k]表示用户u对因子k的喜好程度)和一个M行F列的物品因子矩阵Q(Q[i][k]表示第i个物品的因子k的程度)。用公式来表示就是

 R = P * T(Q) (T(Q)表示Q矩阵的转置)

     下面是将评分矩阵R分解成用户因子矩阵P与物品因子矩阵Q的一个例子。R的元素数值越大,表示用户越喜欢这部电影。P的元素数值越大,表示用户越喜欢对应的因子。Q的元素数值越大,表示物品对应的因子程度越高。分解完后,就能利用P,Q来预测Zero君对《七夜》的评分了。按照这个例子来看,Zero君应该会给《七夜》较低的分数。因为他不喜欢恐怖片。注意不要纠结图中的具体数值,因为那些数值是我随便填上去的。

推荐算法简介

      实际上,我们给一部电影评分时,除了考虑电影是否合自己口味外,还会受到自己是否是一个严格的评分者和这部电影已有的评分状况影响。例如:一个严格评分者给的分大多数情况下都比一个宽松评分者的低。你看到这部电影的评分大部分较高时,可能也倾向于给较高的分。在SVD中,口味问题已经有因子来表示了,但是剩下两个还没有相关的式子表示。因此有必要加上相关的部分,提高模型的精准度。改进后的SVD的公式如下: 

R = OverallMean + biasU + biasI + P * T(Q) (1)

     其中OverallMean表示所有电影的平均分,biasU表示用户评分偏离OverallMean的程度,biasI表示电影评分偏离OverallMean的程度,P,Q意思不变。特别注意,这里除了OverallMean之后,其它几个都是矩阵。

     分解完后,即(1)式中的五个参数都有了正确的数值后,就可以用来预测分数了。假设我们要预测用户u对电影i的评分:

推荐算法简介

    bu表示第u个用户的偏离程度,bi表示第i部电影的偏离程度,pu表示第u个用户的因子爱好程度,qi表示第i部电影的因子程度。    

    SVD实现。在第一部分的例子中,你也许会有疑问:明明评分矩阵有一个元素的值是空的,为什么还能得到两个完整的矩阵P和Q呢?原因是那两个矩阵是通过学习(learnin, 得到的。SVD使用随机梯度下降(stochasticgradientdescent)学习(1)式中除了OverallMean之外的参数。学习过程可以概括成这样:先给各个参数一个初值,然后利用这些参数进行预测,并将预测结果与已知评分进行对比,最后根据对比结果修正各个参数。更准确点的说法是调整参数的值,使得以下式子能取到最小值:

推荐算法简介

     ALPHA表示所有训练样本。被第一个圆括号括着的部分表示当前的预测结果与实际值的偏差。被第二个圆括号括着的部分是为了防止过拟合(overfitting)。

     以上就是SVD实现时的主要思想了,至于具体实现可以参考该作者的代码。这个实现版本在movielens1M上的效果比《A GuidetoSingularValueDecomposition for Collaborative Filtering》中提到的要好一点点。这里,其主要提一下实现SVD时要注意的地方:

      a. 更新qi时,要先保存
b. 预测分数时,范围要限制在最小值和最大值内

    此外,这是原作者找到的一些有用的建议:

      a. 所有参数的regularization值是一样的,不用特别区分bu,bi和 p,q
b. bu, bi不需要初始化,全部设成0
c. P,Q应该的初始化,一般使用 0.1 * rand(0,1) / sqrt(dim) dim指特征的维数

参考:

1.基于内容的推荐(Content-based Recommendations) - BreezeDeus - 博客园
on www.cnblogs.com →
2.非常好的协同过滤入门文章 - wentingtu - 博客园
on www.cnblogs.com →
3.机器学习相关--协同过滤 - ~大器晚成~ - 博客园
on www.cnblogs.com →
4.各路推荐算法
5. L. Lü, T. Zhou, Link prediction in complex networks: a survey, Physica A 390 (2011) 1150-1170.
6.  G. Linden, B. Smith, J. York, Amazon.com recommendations: item-to-item collaborative filtering, IEEE Internet Computing 7(1) (2003) 76-80.
7.C.-N. Ziegler, S. M. McNee, J. A. Konstan, G. Lausen, Improving recommendation lists through topic diversification, Proceedings of the 14th international conference on World Wide Web, ACM Press, New York, 2005.
8.T. Zhou, Z. Kuscsik, J.-G. Liu, M. Medo, J. R. Wakeling, Y.-C. Zhang, Solving the apparent diversity-accuracy dilemma of recommender systems, Proceedings of the National Academy of Sciences of the United States of America 107 (2010) 4511-4515.
9.科普一下协同过滤