推荐系统_全

Posted 漠小浅

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了推荐系统_全相关的知识,希望对你有一定的参考价值。

1 推荐系统的分类

基于应用领域分类:电子商务推荐,社交好友推荐,搜索引擎推荐,信息内容推荐
基于设计思想:基于协同过滤的推荐基于内容的推荐,基于知识的推荐,混合推荐
基于使用何种数据:基于用户行为数据的推荐,基于用户标签数据的推荐,基于社交网络数据,基于上下文信息(时间上下文,地点上下文等等)

2 常见评测标准

http://blog.csdn.net/u011263983/article/details/51544495

3 用户行为数据

            从用户的行为和偏好中发现规律,并基于此进行推荐,所以收集用户的偏好信息成为系统推荐效果最基础的决定因素。用户有很多方式向系统提供自己的偏好信息,比如:评分、投票、转发、保存书签、购买、点击流、页面停留时间等            以上用户行为都是通用的,在实际推荐引擎设计中可以自己多添加一些特定的用户行为,并用他们表示用户对物品的喜好程度。通常情况下,在一个推荐系统中,用户行为都会多于一种,那么如何组合这些不同的用户行为呢?基本上有如下两种方式 。                    1,将不同的行为分组                            一般可以分为查看和购买,然后基于不同的用户行为,计算不同用户或者物品的相似度。类似于当当网或者亚马逊给出的“购买了该 书的人还购买了” “查看了该书的人还查看了”等。                    2,对不同行为进行加权                            对不同行为产生的用户喜好进行加权,然后求出用户对物品的总体喜好。
           当我们收集好用户的行为数据后,还要对数据进行预处理,最核心的工作就是减噪和归一化。                      减噪:因为用户数据在使用过程中可能存在大量噪声或误操作,所以需要过滤掉这些噪声。                      归一化:不同行为数据的差别比较大,比如用户的查看数据肯定比购买数据大得多。通过归一化,才能使数据更加准确。                        通过上述步骤的处理,就得到了一张二维表,其中一维是用户列表,另一维是商品列表,值是用户对商品的喜好,如下

4 相似度

       对用户的行为分析得到用户的偏好后,可以根据用户的偏好计算相似用户和物品,然后可以基于相似用户或物品进行推荐。这就是协同过滤中的两个分支了,即基于用户的协同过滤和基于物品的协同过滤。        关于相似度的计算,现在 有几种基本方法都是基于向量的,其实也就是计算两个向量的距离,距离越近相似度越大。在推荐的场景中,在用户-物品偏好的二维矩阵中,我们可以将一个用户对所有物品的偏好作为一个向量来计算用户之间的相似度,或者将所有用户对某个物品的偏好作为一个向量来计算物品之间的相似度。下面是几种常见的相似度计算方法

4.1 同现相似度   

        物品i和 物品j的同现相似度公式定义:                                                        其中,分母是喜欢物品i的用户数,而分子是同时喜欢物品i和物品j的用户数据。因此,上述公式可以理解为喜欢物品i的用户中有多少比例的用户也喜欢物品j。        上述公式存在一个问题,如果物品 j 是热门物品,很多人都喜欢,那么 wij 就会很大,接近1,因此,该公式会造成任何物品都和热门物品有很大的相似度。为了避免推荐出热门的物品,可以用如下公式:                                            这个公式惩罚了物品 j 的权重,因此减轻了热门物品与很多物品相似的可能性。

4.2 欧氏距离相似度

         最初用于计算欧几里得空间中两个点的距离,假设x,y是n维空间的两个点,它们之间的欧几里得距离是:                                      
         可以看出,当 n = 2时,欧几里得距离就是平面上两个点的距离。          当用欧几里得距离表示相似度时,一般采用如下公式进行转换:距离越小,相似度越大。                                        

4.3 皮尔逊相关系数(pearson Correlation Coefficient)

          皮尔逊相关系数一般用户计算两个定距变量间联系的紧密程度,它的取值在[-1,+1]之间。

4.4 Cosine相似度(Cosine Similarity)

            Cosine相似度被广泛应用于计算文档数据的相似度:                                

4.5 Tanimoto系数(Tanimoto Coefficient)

            Tanimoto系数也被称为Jaccard系数,是Cosina相似度的扩展,也多用于计算文档数据的相似度:                              


           在计算用户之间的相似度时,是将一个用户对所有物品的偏好作为一个向量;而在计算物品之间的相似度时,是将所有用户对某个物品的偏好作为一个向量。求出相似度后,接下来可以求相邻用户和相邻物品。                

5 常见推荐系统算法

5.1 关联规则

5.1.1 Apriori

见 http://blog.csdn.net/u011263983/article/details/51505108 博客

5.1.2 FPGrowth

见 http://blog.csdn.net/u011263983/article/details/51505108 博客

5.2 协同过滤

5.2.1 基于邻域的方法

          根据相似度计算用户和物品的相似度后,可以分别基于用户或者物品进行协同过滤推荐。
5.2.1.1 基于用户的协同过滤算法(User CF)
          基于用户的CF的基本思想相当简单:基于用户对物品的偏好找到相邻的邻居用户,然后将邻居用户喜欢的推荐给当前用户。在计算上,就是将一个用户对所有物品的偏好作为一个向量来计算用户之间的相似度, 找到K邻居后,根据邻居的相似度权重及其对物品的偏好,预测当前用户没有偏好的未涉及物品,计算得到一个排序的物品列表作为推荐。如下图:                                        对于用户A,根据用户的历史偏好,这里只计算得到一个邻居-用户C,然后将用户C喜欢的物品D推荐给用户A。
                       从上面的描述中可以看到,基于用户的协同过滤算法主要包括两个步骤:                      1,找到和目标用户兴趣相似的用户集合;                     2,找到这个集合中的用户喜欢的,且目标用户没有听说过的物品推荐给目标用户。                   举例说明:                   举例说明UserCF计算用户兴趣相似度的例子。再该例子中,用户A对物品a,b,d有过行为,用户B对物品a,c有过行为,利用余弦相似度公式计算用户A和用户B的兴趣相似度为:                                                                 得到用户之间的兴趣相似度后,UserCF算法会给用户推荐和他兴趣最相似的K个用户喜欢的物品。如下的公式度量了UserCF算法中用户u对物品i的感兴趣程度:                                                                                                                              邻居(K)的圈定:                               一般有两种方法:                                         1,固定数量的邻居:K-neighborhoods                                         2,基于相似度门槛的邻居:Threshold-based neighborhoods
5.1.2.2 基于物品的协同过滤算法(Item CF)
          基于物品的CF的原理和基于用户的CF类似,只是子计算邻居时采用物品本身,而不是从用户的角度。即基于用户对物品的偏好找到相似的物品,然后根据用户的历史偏好,推荐相似的物品给他。从计算的角度看,就是将所有用户对某个物品的偏好作为一个向量来计算物品之间的相似度,得到物品的相似度后,根据用户历史的偏好预测当前用户还没有表示偏好的物品,计算得到一个排序的物品列表作为推荐。如下图                            
           对于物品A,根据所有用户的历史偏好,喜欢物品A的用户都喜欢物品C,得出物品A和物品C比较相似,而用户C喜欢物品A,那么可以退出用户C可能也喜欢物品C。            从上面的描述中可以看到,基于物品的协同过滤算法主要包括两个步骤:                      1,计算物品之间的相似度。                     2,根据物品的相似度和用户的历史行为给用户生成推荐列表                     举例说明:                    用户喜欢《C++ Primer中文版》和《编程之美》两本书。然后ItemCF会为这两本书分别找出和它们最相似的3本书,然后根据公式的定义计算用户对每本书的感兴趣程度。比如,ItemCF给用户推荐《算法导论》,是因为这本书和《C++ Primer中文版》相似,相似度为0.4,而且这本书也和《编程之美》相似,相似度时0.5,。考虑到用户对《C++ Primer中文版》的兴趣是1.3,对《编程之美》的兴趣度是0.9,那么用户对《算法导论》的兴趣就是1.3*0.4+0.9*0.5=0.97。                    

5.2.2 隐语义模型(基于模型的协同过滤算法)

       转到本文章:在5.3 基于内容的推荐----5.3.1 隐语义模型(基于模型的协同过滤算法)  原因:分类不唯一。感觉隐语义模型就是挖掘内容潜在的价值。

5.3 基于内容的推荐

         基于内容的推荐,其主要思想就是:我们首先给商品划分一些属性,你也可以称为分类,比如说,对汽车分为一些类别,比如微型车,中型车,大型车,豪华车等等,每一类中又可以在细分,例如按照马力,门数等等,我们建立了这些属性数据以后,我们怎么样进行推送呢?当用户看某一个商品的时候,可以给他推荐一些同类的,比如说它的属性比较相近,或者分类在同一类里面,或者说不是同一类但是是相近的分类的这么一些其它的汽车给他,这个就是一种称为内容的推荐。还有一种就是根据用户标签进行的推荐,这个标签就是我们给商品或者人打上的一些属性信息,这个跟前面的分类的区别:其实标签本质上也是一种分类,但是我们之前所说的对于汽车的分类可能是一种比较严肃的分类,比如说网站聘用了一些专业的编辑回来,这些编辑有比较强的业务能力,他对这个专业里面的知识理解的比较透彻,有这些人对这些商品进行分类;而标签应该是那种比较随意的,比较松散的,这个一般是由用家,玩家来做的,比如说玩家看一辆车,对这辆车打上一个标签,例如可爱,大气等等,或者说可能是机器给你加的,机器可能根据浏览的一些人的情况给这些商品加上标签,对人的标签也是一样,例如在移动公司里面,在它的交换机上得到一个日志,这个日志记录着用户访问网站的信息,有了用的访问的链接之后,可以通过这些链接把用户访问的网页抓回来,然后对抓回来的网页做一些文本挖掘,比如分词,提取一些关键字,然后分析一下这篇文章是属于哪种类型的,比如说是科技类文章,旅游类文章,电影类等等,可以知道用户是属于那种类型的人,对什么东西感兴趣,例如用户到周末经常看一些电影院,电影的网站,可能断定该用户是一个电影爱好者,移动就可以赠送给这个用户电影票来绑定该用户。所以说不光是商品,人其实也可以打标签,人的标签可以是人与人之间打标签,例如说qq上面给好友打标签,作评价,也可以是机器给人打标签,例如刚才所说的移动公司的例子。  不论是专业编辑给它赋属性也好,或者是业余人士(用户)随意的给它打上标签也好,也可能是机器打上去的,我们基于这种分类来做推荐的话,我们称之为基于内容的推荐(有些人称之为基于标签的推荐)。

5.3.1 隐语义模型(LFM),矩阵分解,潜在语义模型(LSA),SVD之间的关系

       最近这几年做机器学习和数据挖掘研究的人经常会看到下面的各种名词,即隐含语义模型(Latent Class Model)、隐语义模型(Latent Factor Model)、pLSA、LDA、Topic Model、Matrix Factorization(矩阵分解)、Factorized Model       这些名词在本质上应该是同一种思想体系的不同扩展。在推荐系统领域,提的最多的就是 潜在语义模型 矩阵分解模型,其实,这两个名词说的是一回事,就是如何通过降维的方法来评分矩阵补全。       用户的评分行为可以表示成一个评分矩阵R,其中R[u][i]就是用户u对物品i的评分。但是,用户不会对所有的物品评分,所以这个矩阵里有很多元素都是空的,这些空的元素称为缺失值。因此,评分预测从某种意义上来说就是填空,如果一个用户对一个物品没有评过分,那么推荐系统就要预测这个用户是否会对这个物品评分以及回评几分。

      矩阵分解技术是实现隐语义模型使用最为广泛的一种方法,其思想也正是来源于此,著名的推荐领域大神Yehuda Koren更是凭借矩阵分解模型勇夺Netflix Prize推荐比赛冠军,以矩阵分解为基础,Yehuda Koren在数据挖掘和机器学习相关的国际顶级会议(SIGIR,SIGKDD,RecSys等)发表了很多文章,将矩阵分解模型的优势发挥得淋漓尽致。实验结果表明,在个性化推荐中使用矩阵分解模型要明显优于传统的基于邻域的协同过滤(又称基于记忆的协同过滤)方法,如UserCF、ItemCF等,这也使得矩阵分解成为了目前个性化推荐研究领域中的主流模型。

    本文将隐语义模型和矩阵分解看作同一概念。

    另外,奇异值分解(Singular Value Decomposition, SVD),非负矩阵分解(Non-negative Matrix Factorization, NMF),概率矩阵分解(Probability Matrix Factorization, PMF)等方法虽然也使用矩阵分解的思想,属于矩阵分解的范畴,但是其分解方法和LFM有所不同。

   个人观点:矩阵分解是隐语义模型(LFM)采用的一种方法,是对传统潜在语义分析(LSA)就是的改进,传统潜在语义分析采用的是SVD。


     


5.3.2 隐语义模型(基于模型的协同过滤算法)

       本节以LFM为例介绍隐含语义分析在推荐系统中的应用。
       首先说明一下隐语义模型的历史:                 源于对SVD(奇异值分解)方法的改进,传统SVD是线性代数典型问题;

               SVD可用于推荐系统评分矩阵补全,但由于计算量太大,实际上只是适用于觃模很小的系统;
               Simon Funk改进SVD(Funk-SVD),后来被称为Latent Factor Model(SVD是纯矩阵问题,运算过程中会产生一巨大的矩阵,          一般适合比较小的系统,Fuck改进以后,他不用矩阵计算,变成用迭代计算,使用梯度下降法来求解,比较容易计算。即用梯度下降算         法解决一个SVD问题)。


       隐语义模型LFM和LSI,LDA,Topic Model其实都属于隐含语义分析技术,是一类概念,他们在本质上是相通的,都是找出潜在的主题或分类。这些技术一开始都是在文本挖掘领域中提出来的,近些年它们也被不断应用到其他领域中,并得到了不错的应用效果。比如,在推荐系统中它能够基于用户的行为对item进行自动聚类,也就是把item划分到不同类别/主题,这些主题/类别可以理解为用户的兴趣。
        对于一个用户来说,他们可能有不同的兴趣。就以作者举的豆瓣书单的例子来说,用户A会关注数学,历史,计算机方面的书,用户B喜欢机器学习,编程语言,离散数学方面的书, 用户C喜欢大师Knuth, Jiawei Han等人的著作。那我们在推荐的时候,肯定是向用户推荐他感兴趣的类别下的图书。那么前提是我们要对所有item(图书)进行分类。那如何分呢?大家注意到没有,分类标准这个东西是因人而异的,每个用户的想法都不一样。拿B用户来说,他喜欢的三个类别其实都可以算作是计算机方面的书籍,也就是说B的分类粒度要比A小;拿离散数学来讲,他既可以算作数学,也可当做计算机方面的类别,也就是说有些item不能简单的将其划归到确定的单一类别;拿C用户来说,他倾向的是书的作者,只看某几个特定作者的书,那么跟A,B相比它的分类角度就完全不同了。
        显然我们不能靠由单个人(编辑)或team的主观想法建立起来的分类标准对整个平台用户喜好进行标准化。原因如下:                使用专业人员(编辑)对商品进行整理分类,但这样会产生成本和效率瓶颈
               受限于编辑的专业水平,编辑的意见未必能代表用户的意见
               分类的粒度难于控制
              如果商品有多个分类,很难考虑周全
              多维度,多规角分类
              编辑很难决定商品在类别里的权重

      为了解决上面的问题,研究人员提出:为什么我们不从数据出发,自动地找到那些类,然后进行个性化推荐?于是,隐含语义分析(latent variable analysis)出现了。隐含语义分析技术因为采取基于用户行为统计的自动聚类,较好地解决了上面提出的5个问题。
      下面我们就来看看LFM是如何解决上面的问题的?对于一个给定的用户行为数据集(数据集包含的是所有的user, 所有的item,以及每个user有过行为的item列表),使用LFM对其建模后,我们可以得到如下图所示的模型:(假设数据集中有3个user, 4个item, LFM建模的分类数为4)

       R矩阵是user-item矩阵,矩阵值Rij表示的是user i 对item j的兴趣度,这正是我们要求的值。对于一个user来说,当计算出他对所有item的兴趣度后,就可以进行排序并作出推荐。LFM算法从数据集中抽取出若干主题,作为user和item之间连接的桥梁,将R矩阵表示为P矩阵和Q矩阵相乘。其中P矩阵是user-class矩阵,矩阵值Pij表示的是user i对class j的兴趣度;Q矩阵式class-item矩阵,矩阵值Qij表示的是item j在class i中的权重,权重越高越能作为该类的代表。所以LFM根据如下公式来计算用户U对物品I的兴趣度
                                                                 我们发现使用LFM后,              我们不需要关心分类的角度,结果都是基于用户行为统计自动聚类的,全凭数据自己说了算。              不需要关心分类粒度的问题,通过设置LFM的最终分类数就可控制粒度,分类数越大,粒度约细。              对于一个item,并不是明确的划分到某一类,而是计算其属于每一类的概率,是一种标准的软分类。              对于一个user,我们可以得到他对于每一类的兴趣度,而不是只关心可见列表中的那几个类。              对于每一个class,我们可以得到类中每个item的权重,越能代表这个类的item,权重越高。     举个例子假如LFM 把所有物品分成3 个类型[ 语文数学英语],  用户A 非常喜欢中国文学因此用户A p(u,k) 向量可以写成[1,0,0],  现在有两本书< 微积分> < 唐诗三百首>,  分别以q1(i,k)=[0,1,0] q2(i,k)=[1,0,0] 表示那么我们就可以计算用户A 分别对两本书的喜爱程度了                     A < 微积分> 的喜爱程度p1 = p(u,k) * q1(i,k) = [1,0,0] * [0,1,0] = 0                     A < 唐诗三百首> 的喜爱程度p2 = p(u,k) * q2(i,k) = [1,0,0] * [1,0,0] = 1              这样就可以判断A 对于< 唐诗三百首> < 微积分> 的喜爱程度要高, 然后给他推荐< 唐诗三百首>.       举例2:                  

那么,接下去的问题就是如何计算矩阵P和矩阵Q中参数值。一般做法就是最优化损失函数来求参数。在定义损失函数之前,我们需要准备一下数据集并对兴趣度的取值做一说明
      需要根据用户的行为数据构建训练集                 a.      显性反馈数据                          用户对和教育平台上的产品或者教育资源进行的”打分”, “点赞”或者”踩”的行为就是显性反馈数据的来源.                 b.      隐性反馈数据                         相对于显性反馈数据, 隐性反馈数据比较难以获取. 如果把用户经常浏览的教育资源作为对某个隐分类的正反馈数据, 现在的困难就在于如何获得用户的负反馈                         数据, 因为不可能把用户没有浏览过的教育资源就当成用户不喜欢的教育资源. 我觉得应该在热门推荐系统的基础上选取一些热门的但是用户没有浏览过或者                           表达过偏好的教育资源当成是用户不喜欢的资源, 因为一些热门的资源在用户看来应该是经常能够看到的,在这个前提下用户却没有去看, 发生这种小概率事件                           就可以看成用户不喜欢这一类型的资源.                   在隐性反馈数据下产生负样本的几种方法:                                                         然后喜欢设定rui为1,不喜欢设定为rui为0(最简单)

接下来求解计算矩阵P和矩阵Q中参数值      损失函数:                       损失函数的意义是用户u 对物品i 的真实喜爱程度与推算出来的喜爱程度的均方根误差通俗来说就是真实的喜爱程度与推算的喜爱程度的误差, 要使模型最合理当然就是使这个误差达到最小值公式中最后两项是惩罚因子用来防止分类数取得过大而使误差减少的不合理做法的发生, Lambda 参数是一个常数需要根据经验和业务知识进行反复尝试决定的. 对损失函数求最小值可以使用梯度下降法(或者采用最小二乘法 Spark Mllib 的ALS 就是采用最小二乘法求解的),本次采用梯度下降算法.(梯度下降算法是同时求出两个参数,最小二乘法的思想就是固定一个求解另一个,类似于SMO算法)       1,对两组未知数求偏导数               2,根据随机梯度下降法得到梯度公式                   其中α是在梯度下降的过程中的步长( 也可以称作学习速率),  这个值不宜过大也不宜过小过大会产生震荡而导致很难求得最小值过小会造成计算速度下降需要经过试验得到最合适的值.       最终会求得每个用户对于每个隐分类的喜爱程度矩阵和每个物品与每个隐分类的匹配程度矩阵在用户- 物品的矩阵中通过两次迭代可以求得每个用户对每个物品的喜爱程度, 选取喜爱程度最高而且用户没有反馈过的物品进行推荐.

LFM中的重要参数:

        a, 模型中隐特征个数F(尝试,根据经验)
        b, 梯度下降法中选取的学习率
        c, 损失凼数中的惩罚项系数lambda
        d, 训练集的负样本/正样本比例ratio(一般取1)

    这四项参数需要在试验过程中获得最合适的值.acd三项需要根据推荐系统的准确率,召回率,覆盖率,流行度作为参考b项则是要通过参考模型的训练效率.



当估算出P和Q矩阵后,我们就可以使用公式计算用户U对各个item的兴趣度值(Rui),并将兴趣度值最高的N个iterm(即TOP N)推荐给用户。


下面介绍一个改进的LFM的方法:假如偏置项后的LFM

刚才说的LFM预测公式:

                                    

这个预测公式通过隐类将用户和物品联系在了一起。但是,实际情况下,一个评分系统有些固有属性和用户物品无关,而用户也有些属性和物品无关,物品也有些属性和用户无关。因此,Netflix Prize中提出了另一种LFM,其预测公式如下:

                                                                     

这个预测公式中加入了3项u,bu,bi。他们的作用如下:

      1,u   训练集中多有记录的评分的全局平均数。在不同的 网站中,因为网站定位和销售的物品不同,网站的整体评分分布也显示出一下差异。比如有些网站的用户就是喜欢打高分,而另一些网站的用户就是喜欢打低分。而全局平均数可以表示网站本身对用户评分的影响。

     2, bu  用户偏执(user bias)项。这一项表示了用户的评分习惯中和物品没有关系的那种因素。比如有些用户就是比较苛刻,对什么东西要求都很高,他们的评分就会偏低,而有些用户比较宽容,对什么东西都觉得不错,那么他的评分就会偏高。

     3, 物品偏执(item bias)项。这一项表示了物品接受的评分中和用户没有关系的因素。比如有些物品本身质量就很高,因此获得的评分相对都比较高,而有些物品本身质量很差,因此获得的评分相对都比较低。

     增加的3个参数中,只有bu、bi是要通过机器学习训练出来的。同样可以求导,然后用梯度下降求解这两个参数。

     Spark MLlib中的ALS提供了求解带偏置矩阵分解的交替最小二乘算法


5.3.3 LSA

        LSA(latent semantic analysis)潜在语义分析,也被称为LSI(latent semantic index),是Scott Deerwester, Susan T. Dumais等人在1990年提出来的一种新的索引和检索方法。该方法和传统向量空间模型(vector space model)一样使用向量来表示词(terms)和文档(documents),并通过向量间的关系(如夹角)来判断词及文档间的关系;而不同的是,LSA将词和文档映射到潜在语义空间,从而去除了原始向量空间中的一些“噪音”,提高了信息检索的精确度。

场景:

         

求解LSA的步骤:

        分析文档集合,建立Term-Document矩阵。
        对Term-Document矩阵进行奇异值分解。
        对SVD分解后的矩阵进行降维,也就是奇异值分解一节所提到的低阶近似。
        使用降维后的矩阵构建潜在语义空间,或重建Term-Document矩阵。

例子:

07_推荐系统算法详解

推荐系统_推荐系统的常用评测指标

推荐系统_推荐系统的常用评测指标

矩阵分解在协同过滤推荐算法中的应用

推荐系统(蒋凡译)— 第二章 协同过滤推荐

推荐算法---模式场景