以下内容为《推荐系统实践》个人学习笔记,包含书籍内容概括、自己的解读。
文章内容仅供参考,有兴趣可自行购买阅读原文。
按照是否能反馈分为:
显性反馈行为(explicitfeedback):包括用户明确表示对物品喜好的行为;
隐性反馈行为(implicit feedback):不能明确反应用户喜好的行为。最具代表性的隐性反馈行为就是页面浏览行为。用户浏览一个物品的页面并不代表用户一定喜欢这个页面展示的物品,比如可能因为这个页面链接显示在首页,用户更容易点击它而已。
按照行为反馈方向分类为:
正反馈:指用户的行为倾向于指用户喜欢该物品;
负反馈:指用户的行为倾向于指用户不喜欢该物品;
在显性反馈中,很容易区分一个用户行为是正反馈还是负反馈,而在隐性反馈行为中,就相对比较难以确定。
用户行为数据可由6部分组成:1. 用户;2. 行为;3. 行为的种类;4. 产生行为的上下文;5. 行为的内容;6. 行为的权重
不同的数据集包含不同的行为,按照有无上下文信息+显性/隐性反馈分类,可分为如下4类:
- 无上下文信息的隐性反馈数据集:每一条行为记录仅仅包含用户ID和物品ID。
- 无上下文信息的显性反馈数据集:每一条记录包含用户ID、物品ID和用户对物品的评分。
- 有上下文信息的隐性反馈数据集:每一条记录包含用户ID、物品ID和用户对物品产生行为的时间戳。
- 有上下文信息的显性反馈数据集:每一条记录包含用户ID、物品ID、用户对物品的评分和评分行为发生的时间戳。
令 f u ( k ) f_u(k) fu(k)为对k个物品产生过行为的用户数,令 f i ( k ) f_i (k) fi(k)为被k个用户产生过行为的物品数。那么, f u ( k ) f_u(k) fu(k)和 f i ( k ) f_i (k) fi(k)都满足长尾分布。长尾分布公式如下:
f ( x ) = α x k f(x)=\alpha x^{k} f(x)=αxk
即,同时对越多物品产生过行为的用户数越少;同时被越多用户“使用过”的物品越少。
研究结论表示:用户活跃度和物品流行度的关系:用户越活跃,越倾向于浏览冷门的物品。
仅仅基于用户行为数据设计的推荐算法一般称为协同过滤算法。学术界对协同过滤算法进行了深入研究,提出了很多方法,比如基于邻域的方法(neighborhood-based)、隐语义模型(latent factor model)、基于图的随机游走算法(random walk on graph)等。在这些方法中,最著名的、在业界得到最广泛应用的算法是基于邻域的方法,而基于邻域的方法主要包含下面两种算法。
首先,将用户行为数据集按照均匀分布随机分成M份(本章取M=8),挑选一份作为测试集,将剩下的M-1份作为训练集。
然后,在训练集上建立用户兴趣模型,并在测试集上对用户行为进行预测,统计出相应的评测指标。为了保证评测指标并不是过拟合的结果,需要进行M次实验,并且每次都使用不同的测试集。
最后,将M次实验测出的评测指标的平均值作为最终的评测指标。
对用户u推荐N个物品,记为R(u),令用户u在测试集上喜欢的物品集合为T(u)。
评测指标1:召回率
描述用户喜欢的物品中,被推荐的物品的比例。比如用户u喜欢20个物品,我们推荐了10个,其中有5个在用户u喜欢的物品列表中,那么用户u的召回率=1/4。公式如下:
r e c a l l = ∑ u R ( u ) ∩ T ( u ) ∑ u T ( u ) recall=\frac{ \displaystyle\sum_u{R(u)\cap T(u)} }{ \displaystyle\sum_uT(u) } recall=u∑T(u)u∑R(u)∩T(u)
评测指标2:准确率
描述用户被推荐的物品中,实际喜欢的物品的比例。在上面的例子中,准确率=1/2;公式如下:
p r e c i s i o n = ∑ u R ( u ) ∩ T ( u ) ∑ u R ( u ) precision=\frac{ \displaystyle\sum_u{R(u)\cap T(u)} }{ \displaystyle\sum_u{R(u)} } precision=u∑R(u)u∑R(u)∩T(u)
评测指标3:覆盖率
反映了推荐算法发掘长尾的能力,覆盖率越高,说明推荐算法越能够将长尾中的物品推荐给用户。最简单的覆盖率公式如下:
C o v e r a g e = ∣ U u ∈ U R ( u ) ∣ ∣ I ∣ Coverage=\frac{ |U_{u\in{U}}R(u)| }{ |I| } Coverage=∣I∣∣Uu∈UR(u)∣
其中, ∣ U u ∈ U R ( u ) ∣ |U_{u\in{U}}R(u)| ∣Uu∈UR(u)∣表示被推荐物品的用户数, ∣ I ∣ |I| ∣I∣表示所有物品的总数量。该覆盖率表示最终的推荐列表中包含多大比例的物品。如果所有的物品都被推荐给至少一个用户,那么覆盖率就是100%。(即,被推荐的物品数/物品总数量)
评测指标4:新颖度
这里用推荐列表中物品的平均流行度度量推荐结果的新颖度。如果推荐出的物品都很热门,说明推荐的新颖度较低,否则说明推荐结果比较新颖。(即,推荐视频中的热门视频数量)
什么是基于用户的协同过滤算法?
在一个在线个性化推荐系统中,当一个用户A需要个性化推荐时,可以先找到和他有相似兴趣的其他用户,然后把那些用户喜欢的、而用户A没有听说过的物品推荐给A。这种方法称为基于用户的协同过滤算法。
基于用户的协同过滤算法主要包括2个步骤:
(1) 找到和目标用户兴趣相似的用户集合;
(2) 找到这个集合中的用户喜欢的,且目标用户没有听说过的物品推荐给目标用户。
步骤(1)的关键就是计算两个用户的兴趣相似度,协同过滤算法主要利用行为的相似度计算兴趣的相似度。计算方法有:1)Jaccard公式;2)余弦相似度;3)排除法优化余弦相似度;
1) Jaccard公式
给定用户u和用户v,令N(u)表示用户u曾经有过正反馈的物品集合,令N(v)为用户v曾经有过正反馈的物品集合。那么,我们可以通过如下的Jaccard公式简单地计算u和v的兴趣相似度:即,共同正反馈物品数量/每个用户物品数量之和
w u v = ∣ N ( u ) ∩ N ( v ) ∣ ∣ N ( u ) ∪ N ( v ) ∣ w_{uv}=\frac{ |N(u)\cap N(v)| }{ |N(u)\cup N(v)| } wuv=∣N(u)∪N(v)∣∣N(u)∩N(v)∣
2)余弦相似度
或者通过余弦相似度计算:即,共同正反馈物品数量/每个用户物品数量之积开平方
w u v = ∣ N ( u ) ∩ N ( v ) ∣ ∣ N ( u ) ∣ ∣ N ( v ) ∣ w_{uv}=\frac{ |N(u)\cap N(v)| }{ \sqrt{|N(u)|| N(v)|} } wuv=∣N(u)∣∣N(v)∣∣N(u)∩N(v)∣
3)排除法优化余弦相似度
以上方法的时间复杂度是 O ( ∣ U ∣ ∗ ∣ U ∣ ) O(|U|*|U|) O(∣U∣∗∣U∣),当用户数很大时非常耗时。很多用户相互之间并没有对同样的物品产生过行为,即很多时候 O ( ∣ U ∣ ∗ ∣ U ∣ ) = 0 O(|U|*|U|)=0 O(∣U∣∗∣U∣)=0。如果换一个思路,我们可以首先计算出 ∣ N ( u ) ∩ N ( v ) ∣ ≠ 0 |N(u)\cap N(v)|\ne 0 ∣N(u)∩N(v)∣=0的用户对(u,v),然后再对这种情况除以分母 ∣ N ( u ) ∣ ∣ N ( v ) ∣ \sqrt{|N(u)|| N(v)|} ∣N(u)∣∣N(v)∣。
排除法的具体步骤如下:建立物品到用户的倒排表,对于每个物品都保存对该物品产生过行为的用户列表。令稀疏矩阵 C [ u ] [ v ] = ∣ N ( u ) ∩ N ( v ) ∣ C[u][v]=|N(u)\cap N(v)| C[u][v]=∣N(u)∩N(v)∣,然后计算 ∣ N ( u ) ∣ ∣ N ( v ) ∣ \sqrt{|N(u)|| N(v)|} ∣N(u)∣∣N(v)∣,再对两个矩阵进行相对位置元素的除法运算,就可以得到不同用户间的行为相似度的矩阵。
得到用户之间的兴趣相似度后,UserCF算法会给用户推荐和他兴趣最相似的K个用户喜欢的物品。这时,就要想办法衡量用户对物品的兴趣。
假设对于计算用户u对物品i兴趣,这里的兴趣,可以理解为,对该物品可能产生行为的行为度。公式如下:
p ( u , i ) = ∑ v ∈ S ( u , k ) ∩ N ( i ) w u v r v i p(u,i)=\sum_{v\in S(u,k)\cap N(i)}w_{uv}r_{vi} p(u,i)=v∈S(u,k)∩N(i)∑wuvrvi
其中,S (u , K )包含和用户u行为最接近的K 个用户,N (i )是对物品i 有过行为的用户集合, w u v w_{uv} wuv 是用户u和用户v的行为相似度, r v i r_{vi} rvi 代表用户v对物品i的行为;因为使用的是单一行为的隐反馈数据,所以所有的 r v i = 1 r_{vi} =1 rvi=1。
案例:以K=3为标准进行计算,如何计算用户A对物品c、e的兴趣?
根据倒排表可得,进行过c、e行为的有BD、CD用户,那么用户A对c行为的兴趣度=用户A与用户B、D的兴趣相似度之和,即p(A,c)= W A B + W A D W_{AB}+W_{AD} WAB+WAD=AB共同行为数量/AB行为数量之积开根号+AD共同行为数量/AD行为数量之积开根号= 1 / 6 + 1 / 3 1/\sqrt{6}+1/3 1/6+1/3=0.7416。
故,计算用户u对物品i兴趣3个步骤:
①找到有过相关物品行为的用户;②计算目标用户与相关物品行为用户的兴趣相似度;③将所有相关物品行为用户的相似度加和,即得到目标用户对特定物品的兴趣(行为度)
模型效果评估:
研究中,设计随机挑选物品推荐,和物品流行度推荐两种方法对比,结论如下:Random算法每次都随机挑选10个用户没有产生过行为的物品推荐给当前用户,MostPopular算法则按照物品的流行度给用户推荐他没有产生过行为的物品中最热门的10个物品。两种基本推荐算法性能比较如下图所示:
MostPopular算法的准确率和召回率远远高于Random算法,但它的覆盖率非常低,结果都非常热门。可见,Random算法的准确率和召回率很低,但覆盖度很高,结果平均流行度很低。
对以上评估指标的解读情况如下:
准确率和召回率可以看到,推荐系统的精度指标(准确率和召回率)并不和参数K 成线性关系。在MovieLens数据集中,选择K =80左右会获得比较高的准确率和召回率。因此选择合适的K 对于获得高的推荐系统精度比较重要。当然,推荐结果的精度对K 也不是特别敏感,只要选在一定的区域内,就可以获得不错的精度。
流行度可以看到,在3个数据集上K 越大则UserCF推荐结果就越热门。这是因为K 决定了UserCF在给你做推荐时参考多少和你兴趣相似的其他用户的兴趣,那么如果K 越大,参考的人越多,结果就越来越趋近于全局热门的物品。
覆盖率可以看到,在3个数据集上,K 越大则UserCF推荐结果的覆盖率越低。覆盖率的降低是因为流行度的增加,随着流行度增加,UserCF越来越倾向于推荐热门的物品,从而对长尾物品的推荐越来越少,因此造成了覆盖率的降低。
优化方式:如何剔除热门物品对推荐的影响?
下面介绍对于用户兴趣相似度的计算的改进,也称为User-IIF算法,即两个用户对冷门物品采取过同样的行为更能说明他们兴趣的相似度,相似度公式如下:
w u v = ∑ i ∈ N ( u ) ∩ N ( v ) 1 l o g ( 1 + ∣ N ( i ) ∣ ) ∣ N ( u ) ∣ ∣ N ( v ) ∣ w_{uv}=\frac{ \displaystyle \sum_{i \in N(u) \cap N(v)}\frac{1}{log(1+|N(i)|)} }{ \sqrt{|N(u)||N(v)|} } wuv=∣N(u)∣∣N(v)∣i∈N(u)∩N(v)∑log(1+∣N(i)∣)1
该公式通过 1 l o g ( 1 + ∣ N ( i ) ∣ ) \frac{1}{log(1+|N(i)|)} log(1+∣N(i)∣)1惩罚了用户u和用户v共同兴趣列表中热门物品对他们相似度的影响。
ItemCF算法定义:
ItemCF算法主要通过分析用户的行为记录计算物品之间的相似度。该算法认为,物品A和物品B具有很大的相似度是因为喜欢物品A的用户大都也喜欢物品B。
算法步骤:
基于物品的协同过滤算法主要分为两步。(1) 计算物品之间的相似度。(2) 根据物品的相似度和用户的历史行为给用户生成推荐列表。
物品相似度的计算公式:即同时喜欢i、j两个物品的用户数/喜欢i物品的用户数
w i j = ∣ N ( i ) ∩ N ( j ) ∣ ∣ N ( i ) ∣ w_{ij}=\frac{ |N(i)\cap N(j)| }{ |N(i)| } wij=∣N(i)∣∣N(i)∩N(j)∣
因此,上述公式可以理解为喜欢物品i的用户中有多少比例的用户也喜欢物品j。
根据上述公式,可知Item算法计算物品相似度的步骤
计算用户u对物品j的兴趣:
该算法下,计算用户u对物品j兴趣的公式如下(注意对比和基于用户的协同过滤算法中用户u对物品i兴趣的差别):
p u j = ∑ i ∈ N ( u ) ∩ S ( j , K ) w j i r u i p_{uj}=\sum_{i\in{N(u)}\cap{S(j,K)}} w_{ji}r_{ui} puj=i∈N(u)∩S(j,K)∑wjirui
这里N(u)是用户喜欢的物品的集合,S(j, K)是和物品j最相似的K个物品的集合, w j i w_{ji} wji是物品j和i的相似度, r u i r_{ui} rui是用户u对物品i的兴趣。对于隐反馈数据集,如果用户u对物品i有过行为,即可令 r u i r_{ui} rui=1。该公式的含义是,和用户历史上感兴趣的物品越相似的物品,越有可能在用户的推荐列表中获得比较高的排名。
优化方向:如何剔除热门物品对物品相似度的影响?
如果物品j很热门,很多人都喜欢,那么 W i j W_{ij} Wij就会很大,接近1。因此,该公式会造成任何物品都会和热门的物品有很大的相似度,这对于致力于挖掘长尾信息的推荐系统来说显然不是一个好的特性。为了避免推荐出热门的物品,可以用下面的公式:
w i j = ∣ N ( i ) ∩ N ( j ) ∣ ∣ N ( i ) ∣ ∣ N ( j ) ∣ w_{ij}=\frac{ |N(i)\cap N(j)| }{ \sqrt{|N(i)||N(j)|} } wij=∣N(i)∣∣N(j)∣∣N(i)∩N(j)∣
即,喜欢两个物品的用户数/喜欢单个物品的用户数之积开根号,这个公式惩罚了物品j的权重,因此减轻了热门物品会和很多物品相似的可能性。
ItemCF的评估指标解读
精度(准确率和召回率):可以看到ItemCF推荐结果的精度也是不和K成正相关或者负相关的,因此选择合适的K 对获得最高精度是非常重要的。
流行度:和UserCF不同,参数K 对ItemCF推荐结果流行度的影响也不是完全正相关的。随着K 的增加,结果流行度会逐渐提高,但当K 增加到一定程度,流行度就不会再有明显变化。
覆盖率:K 增加会降低系统的覆盖率。
优化方向:考虑用户活跃度对物品相似度的影响
用户活跃度对物品相似度的影响如下:活跃用户对物品相似度的贡献应该小于不活跃的用户。故应该增加IUF参数(IUF(Inverse UserFrequence),即用户活跃度对数的倒数的参数)来修正物品相似度的计算公式,即ItemCF-IUF公式,修正公式具体如下:
w i j = ∑ u ∈ N ( i ) ∩ N ( j ) 1 l o g ( 1 + ∣ N ( u ) ∣ ) ∣ N ( i ) ∣ ∣ N ( j ) ∣ w_{ij}=\frac{ \displaystyle \sum_{u \in N(i) \cap N(j)}\frac{1}{log(1+|N(u)|)} }{ \sqrt{|N(i)||N(j)|} } wij=∣N(i)∣∣N(j)∣u∈N(i)∩N(j)∑log(1+∣N(u)∣)1
上面的公式只是对活跃用户做了一种软性的惩罚,但对于很多过于活跃的用户,比如上面那位买了当当网80%图书的用户,为了避免相似度矩阵过于稠密,我们在实际计算中一般直接忽略他的兴趣列表,而不将其纳入到相似度计算的数据集中。
如何理解ItemCF和ItemCF-IUF公式差异:
ItemCF-IUF在准确率和召回率两个指标上和ItemCF相近,但ItemCF-IUF明显提高了推荐结果的覆盖率,降低了推荐结果的流行度。从这个意义上说,ItemCF-IUF确实改进了ItemCF的综合性能。
优化方向:使用归一化以提高推荐准确率
如果将ItemCF的相似度矩阵按最大值归一化,可以提高推荐的准确率。如果已经得到了物品相似度矩阵w,那么可以用如下公式得到归一化之后的相似度矩阵w',公式如下:
w i j = w i j m a x j w i j w_{ij}=\frac{ w_{ij} }{ \mathop{max} \limits_j w_{ij} } wij=jmaxwijwij
归一化的好处还包括:①增加推荐的准确度,②提高推荐的覆盖率和多样性,即将不同类型的物品进行相似度的比较,类似消除量纲的影响。
热门的类其类内物品相似度一般比较大。如果不进行归一化,就会推荐比较热门的类里面的物品,而这些物品也是比较热门的。因此,推荐的覆盖率就比较低。相反,如果进行相似度的归一化,则可以提高推荐系统的覆盖率。
对比ItemCF算法和ItemCF-Norm算法的离线实验性能。从实验结果可以看到,归一化确实能提高ItemCF的性能,其中各项指标都有了比较明
区别一:对用户兴趣偏好的差异
UserCF给用户推荐那些和他有共同兴趣爱好的用户喜欢的物品,而ItemCF给用户推荐那些和他之前喜欢的物品类似的物品。从这个算法的原理可以看到,UserCF的推荐结果着重于反映和用户兴趣相似的小群体的热点,而ItemCF的推荐结果着重于维系用户的历史兴趣。换句话说,UserCF的推荐更社会化,反映了用户所在的小型兴趣群体中物品的热门程度,而ItemCF的推荐更加个性化,反映了用户自己的兴趣传承。
ItemCF算法适用于用户不太需要流行度来辅助他们判断一个物品的好坏,而是可以通过自己熟悉领域的知识自己判断物品的质量。这些网站中个性化推荐的任务是帮助用户发现和他研究领域相关的物品。此外,这些网站的物品更新速度不会特别快,一天一次更新物品相似度矩阵对它们来说不会造成太大的损失,是可以接受的。
区别二:存储空间的差异
UserCF需要维护一个用户相似度的矩阵,而ItemCF需要维护一个物品相似度矩阵。从存储的角度说,如果用户很多,那么维护用户兴趣相似度矩阵需要很大的空间,同理,如果物品很多,那么维护物品相似度矩阵代价较大。
区别三:指标差异
首先要指出的是,离线实验的性能在选择推荐算法时并不起决定作用。
首先应该满足产品的需求,比如如果需要提供推荐解释,那么可能得选择ItemCF算法。
其次,需要看实现代价,比如若用户太多,很难计算用户相似度矩阵,这个时候可能不得不抛弃UserCF算法。
最后,离线指标和点击率等在线指标不一定成正比。
而且,这里对比的是最原始的UserCF和ItemCF算法,这两种算法都可以进行各种各样的改进。一般来说,这两种算法经过优化后,最终得到的离线性能是近似的。
为什么原始ItemCF算法的覆盖率和新颖度都不高?原因如下:
如果j非常热门,那么上面公式的分子 ∣ N ( i ) ∩ N ( j ) ∣ |N(i)\cap{N(j)}| ∣N(i)∩N(j)∣就会越来越接近 ∣ N ( i ) ∣ |N(i)| ∣N(i)∣。尽管上面的公式分母已经考虑到了j的流行度,但在实际应用中,热门的j仍然会获得比较大的相似度。解决方法如下:①加大对热门物品的惩罚,比如采用如下公式:
w i j = ∣ N ( i ) ∩ N ( j ) ∣ ∣ N ( i ) ∣ 1 − α ∣ N ( j ) ∣ α w_{ij}=\frac{ |N(i)\cap{N(j)}| }{ |N(i)|^{1-\alpha}|N(j)|^{\alpha} } wij=∣N(i)∣1−α∣N(j)∣α∣N(i)∩N(j)∣
其中α∈[0.5,1]。通过提高α,就可以惩罚热门的j。α越大,覆盖率就越高,并且结果的平均热门程度会降低。因此,通过这种方法可以在适当牺牲准确率和召回率的情况下显著提升结果的覆盖率和新颖性(降低流行度即提高了新颖性)。
两个不同领域的最热门物品之间往往具有比较高的相似度。这个时候,仅仅靠用户行为数据是不能解决这个问题的,因为用户的行为表示这种物品之间应该相似度很高。此时,我们只能依靠引入物品的内容数据解决这个问题,比如对不同领域的物品降低权重等。
LFM(latent factor model)隐语义模型用于找到文本的隐含语义。相关的名词有LSI、pLSA、LDA和TopicModel。本章将以LFM为例介绍隐含语义分析技术在推荐系统中的应用。
核心思想是通过隐含特征(latent factor)联系用户兴趣和物品,即对用户兴趣和物品进行分类。该方法需要解决3个问题。
①如何给物品进行分类?
②如何确定用户对哪些类的物品感兴趣,以及感兴趣的程度?
③对于一个给定的类,选择哪些属于这个类的物品推荐给用户,以及如何确定这些物品在一个类中的权重?
对于如何给物品进行分类,隐含语义分析技术比编辑人工分类有如下优势:
隐含语义分析技术因为采取基于用户行为统计的自动聚类,较好地解决了5个问题。
编辑的意见不能代表各种用户的意见,但隐含语义分析技术的分类来自对用户行为的统计,代表了用户对物品分类的看法。隐含语义分析技术和ItemCF在物品分类方面的思想类似,如果两个物品被很多用户同时喜欢,那么这两个物品就很有可能属于同一个类。
编辑很难控制分类的粒度,但隐含语义分析技术允许我们指定最终有多少个分类,这个数字越大,分类的粒度就会越细,反之分类粒度就越粗。
编辑很难给一个物品多个分类,但隐含语义分析技术会计算出物品属于每个类的权重,因此每个物品都不是硬性地被分到某一个类中。
编辑很难给出多维度的分类,但隐含语义分析技术给出的每个分类都不是同一个维度的,它是基于用户的共同兴趣计算出来的,如果用户的共同兴趣是某一个维度,那么LFM给出的类也是相同的维度。
编辑很难决定一个物品在某一个分类中的权重,但隐含语义分析技术可以通过统计用户行为决定物品在每个类中的权重,如果喜欢某个类的用户都会喜欢某个物品,那么这个物品在这个类中的权重就可能比较高。
如何使用LFM,计算用户u对物品i的兴趣?
LFM公式如下:
P e r f e r e n c e ( u , i ) = r u i = p u T q i = ∑ f = 1 F p u , k q i , k Perference(u,i)=r_{ui}=p_u^Tq_i=\sum_{f=1}^F{p_{u,k}q_{i,k}} Perference(u,i)=rui=puTqi=f=1∑Fpu,kqi,k
其中 p u , k p_{u,k} pu,k 度量了用户u的兴趣和第k个隐类的关系,而 q i , k q_{i,k} qi,k度量了第k个隐类和物品i之间的关系。那么,下面的问题就是如何计算这两个参数。要计算这两个参数,需要一个训练集,对于每个用户u,训练集里都包含了用户u喜欢的物品和不感兴趣的物品,通过学习这个数据集,就可以获得上面的模型参数。
LFM如何给每个用户生成负样本?
推荐系统的用户行为分为显性反馈和隐性反馈。LFM在显性反馈数据(也就是评分数据)上解决评分预测问题并达到了很好的精度。对于隐性反馈数据集,LFM解决TopN推荐的第一个关键问题就是如何给每个用户生成负样本。可以参考如下方法:
对于一个用户,用他所有没有过行为的物品作为负样本。它的明显缺点是负样本太多,正负样本数目相差悬殊,因而计算复杂度很高,最终结果的精度也很差。
对于一个用户,从他没有过行为的物品中均匀采样出一些物品作为负样本。
对于一个用户,从他没有过行为的物品中采样出一些物品作为负样本,但采样时,保证每个用户的正负样本数目相当。
对于一个用户,从他没有过行为的物品中采样出一些物品作为负样本,但采样时,偏重采样不热门的物品。
以上方法,第三种好于第二种,而第二种好于第四种。
LFM模型对负样本采样时应该遵循以下原则:
①对每个用户,要保证正负样本的平衡(数目相似);
②对每个用户采样负样本时,要选取那些很热门,而用户却没有行为的物品。
如何构建LFM的损失函数?
根据以上逻辑,可得损失函数,通过求解损失函数得到最优参数p和q,损失函数公式如下:
C = ∑ ( u , i ) ∈ K ( r u i − r ^ u i ) 2 = ∑ ( u , i ) ∈ K ( r u i − ∑ k = 1 k p u , k q i , k ) 2 + λ ∣ ∣ p u ∣ ∣ 2 + λ ∣ ∣ q i ∣ ∣ 2 C=\sum_{(u,i)\in K}{(r_{ui}-\hat{r}_{ui})^2} =\sum_{(u,i)\in K}{(r_{ui}-\sum^k_{k=1}p_{u,k}q_{i,k})^2} +\lambda||p_u||^2+\lambda||q_i||^2 C=(u,i)∈K∑(rui−r^ui)2=(u,i)∈K∑(rui−k=1∑kpu,kqi,k)2+λ∣∣pu∣∣2+λ∣∣qi∣∣2
其中 λ ∣ ∣ p u ∣ ∣ 2 + λ ∣ ∣ q i ∣ ∣ 2 \lambda||p_u||^2+\lambda||q_i||^2 λ∣∣pu∣∣2+λ∣∣qi∣∣2是防止过拟合的正则化项。
如何求解LFM的损失函数?
求解以上函数,可以使用随机梯度下降法。
随机梯度算法是最优化理论里最基础的优化算法,它首先通过求参数的偏导数找到最速下降方向,然后通过迭代法不断地优化参数。下面介绍优化方法的数学推导:
第一步,求偏导,公式如下
∂ C ∂ p u k = − 2 q i k ⋅ e u i + 2 λ p u k ∂ C ∂ q i k = − 2 p u k ⋅ e u i + 2 λ q i k \begin{align} \frac{\partial{C}}{\partial{p_{uk}}} &=-2q_{ik}\cdot e_{ui}+2\lambda p_{uk}\\ \frac{\partial{C}}{\partial{q_{ik}}}&=-2p_{uk}\cdot e_{ui}+2\lambda q_{ik} \end{align} ∂puk∂C∂qik∂C=−2qik⋅eui+2λpuk=−2puk⋅eui+2λqik
第二步,得到递推公式:
p u k = p u k + α ( q i k ⋅ e u i − λ p u k ) q i k = q i k + α ( p u k ⋅ e u i − λ q i k ) \begin{align} p_{uk} &=p_{uk}+\alpha(q_{ik}\cdot e_{ui}-\lambda p_{uk})\\ q_{ik} &=q_{ik}+\alpha(p_{uk}\cdot e_{ui}-\lambda q_{ik}) \end{align} pukqik=puk+α(qik⋅eui−λpuk)=qik+α(puk⋅eui−λqik)
其中 α \alpha α为学习率,通过迭代获得最优参数值;
LFM中的4个重要参数:
- 隐特征的个数F;
- 学习速率alpha;
- 正则化参数lambda;
- 负样本/正样本比例 ratio,ratio参数对LFM的性能影响最大。
LFM模型评估指标结果如下:
随着负样本数目的增加,LFM的准确率和召回率有明显提高。
当ratio>10以后,准确率和召回率基本就比较稳定。
随着负样本数目的增加,覆盖率不断降低,而推荐结果的流行度不断增加,说明ratio参数控制了推荐算法发掘长尾的能力。
第一步,确立目标:雅虎的研究人员以CTR作为优化目标,利用LFM来预测用户是否会单击一个链接。
第二步,预测用户行为:利用前文提到的LFM预测用户是否会单击链接,即 r ^ u i = p u T ⋅ q i \hat{r}_{ui}=p_u^T\cdot q_i r^ui=puT⋅qi
第三步,迭代实时性问题:首先,他们利用新闻链接的内容属性(关键词、类别等)得到链接i的内容特征向量 y i y_i yi。其次,实时地收集用户对链接的行为,并且用这些数据得到链接i的隐特征向量 q i q_i qi。然后,他们会利用如下公式预测用户u是否会单击链接i:
r u i = x u T ⋅ y i + p u T ⋅ q i r_{ui}=x_u^T\cdot y_i+p_u^T\cdot q_i rui=xuT⋅yi+puT⋅qi
其中, y i y_i yi是根据物品的内容属性直接生成的, x u k x_{uk} xuk是用户u对内容特征k的兴趣程度,用户向量 x u x_u xu可以根据历史行为记录获得,而且每天只需要计算一次。而 p u p_u pu、 q i q_i qi是根据实时拿到的用户最近几小时的行为训练LFM获得的。因此,对于一个新加入的物品i,可以通过 x u T ⋅ y i x_u^T\cdot y_i xuT⋅yi估计用户u对物品i的兴趣,然后经过几个小时后,就可以通过 p u T ⋅ q i p_u^T\cdot q_i puT⋅qi得到更加准确的预测值。
两者的差异可以概括为以下5方面:①理论基础;②离线计算的空间复杂度;③离线计算的时间复杂度;④在线实时推荐;⑤推荐的解释性
理论基础:LFM具有比较好的理论基础,通过优化一个设定的指标建立最优的模型。基于邻域的方法更多的是一种基于统计的方法,并没有学习过程。
离线计算的空间复杂度:LFM在建模过程中,如果是F个隐类,那么它需要的存储空间是O(F *(M +N )),这在M和N很大时可以很好地节省离线计算的内存。基于邻域的方法需要维护一张离线的相关表。在离线计算相关表的过程中,如果用户/物品数很多,将会占据很大的内存。假设有M 个用户和N 个物品,假设是用户相关表,则需要O(M *M )的空间,对于物品相关表,则需要O(N *N )的空间。
离线计算的时间复杂度:假设有M 个用户、N 个物品、K 条用户对物品的行为记录。对于LFM,如果用F个隐类,迭代S次,那么它的计算复杂度是O(K * F* S )。UserCF计算用户相关表的时间复杂度是O(N * (K/N )^2),而ItemCF计算物品相关表的时间复杂度是O(M *(K /M )^2)。如果K /N < F *S,则代表UserCF的时间复杂度低于LFM,如果K /M < F *S,则说明ItemCF的时间复杂度低于LFM。一般LFM的时间复杂度要稍微高于UserCF和ItemCF,这主要是因为该算法需要多次迭代。但总体上,这两种算法在时间复杂度上没有质的差别。
在线实时推荐:LFM在给用户生成推荐列表时,需要计算用户对所有物品的兴趣权重,然后排名,返回权重最大的N 个物品。那么,在物品数很多时,这一过程的时间复杂度非常高,可达O(M *N *F )。因此,LFM不太适合用于物品数非常庞大的系统。UserCF和ItemCF在线服务算法需要将相关表缓存在内存中,然后可以在线进行实时的预测
推荐解释:ItemCF算法支持很好的推荐解释,它可以利用用户的历史行为解释推荐结果。但LFM无法提供这样的解释,它计算出的隐类虽然在语义上确实代表了一类兴趣和物品,却很难用自然语言描述并生成解释展现给用户。
本章讨论的用户行为数据是由一系列二元组组成的,其中每个二元组(u, i)表示用户u对物品i产生过行为。
令G (V , E)表示用户物品二分图,其中 V = V U ∪ V I V =V_U∪ V_I V=VU∪VI由用户顶点集合 V U V_U VU和物品顶点集合 V I V_I VI组成。对于数据集中每一个二元组( u, i),图中都有一套对应的边 e ( v u , v i ) e( v_u, v_i) e(vu,vi),其中 v u ∈ V U v_u∈V_U vu∈VU是用户u对应的顶点, v i ∈ V I v_i∈V_I vi∈VI是物品i对应的顶点。
下图是一个简单的用户物品二分图模型,其中圆形节点代表用户,方形节点代表物品,圆形节点和方形节点之间的边代表用户对物品的行为。比如图中用户节点A和物品节点a、b、d相连,说明用户A对物品a、b、d产生过行为。
如何理解基于图的推荐算法的原理?
如果将个性化推荐算法放到二分图模型上,那么给用户u推荐物品的任务就可以转化为度量用户顶点 v u v_u vu和与 v u v_u vu没有边直接相连的物品节点在图上的相关性,相关性越高的物品在推荐列表中的权重就越高。
度量图中两个顶点之间相关性的方法主要取决于下面3个因素:①两个顶点之间的路径数;②两个顶点之间路径的长度;③两个顶点之间的路径经过的顶点。
而相关性高的一对顶点一般具有如下特征:①两个顶点之间有很多路径相连;②连接两个顶点之间的路径长度都比较短;③连接两个顶点之间的路径不会经过出度比较大的顶点。
如何计算图中顶点之间相关性?
这里介绍两种方法:①基于随机游走的PersonalRank算法;②基于矩阵论设计算法。
接下来介绍计算图中顶点之间相关性的方法之一:基于随机游走的PersonalRank算法。
PersonalRank算法原理解释如下:假设要给用户u进行个性化推荐,可以从用户u对应的节点vu开始在用户物品二分图上进行随机游走。游走到任何一个节点时,首先按照概率α决定是继续游走,还是停止这次游走并从vu节点开始重新游走。如果决定继续游走,那么就从当前节点指向的节点中按照均匀分布随机选择一个节点作为游走下次经过的节点。这样,经过很多次随机游走后,每个物品节点被访问到的概率会收敛到一个数。最终的推荐列表中物品的权重就是物品节点的访问概率。
PersonalRank算法描述成公式,如下:
P R ( v ) = { α ∑ v ′ ∈ i n ( v ) P R ( v ′ ) ∣ o u t ( v ′ ) ∣ ( v ≠ v u ) ( 1 − a l p h a ) + α ∑ v ′ ∈ i n ( v ) P R ( v ′ ) ∣ o u t ( v ′ ) ∣ ( v = v u ) PR(v)=\begin{split} \begin{cases} \displaystyle \alpha\sum_{v'\in{in(v)}}\frac{PR(v')}{|out(v')|} & (v\ne v_u) \\ \displaystyle (1-alpha)+\alpha\sum_{v'\in{in(v)}}\frac{PR(v')}{|out(v')|} & (v= v_u) \end{cases} \end{split} PR(v)=⎩ ⎨ ⎧αv′∈in(v)∑∣out(v′)∣PR(v′)(1−alpha)+αv′∈in(v)∑∣out(v′)∣PR(v′)(v=vu)(v=vu)
PersonalRank的时间复杂度非常高,不仅无法在线提供实时推荐,甚至离线生成推荐结果也很耗时。这里给出两种解决方案。第一种很容易想到,就是减少迭代次数,在收敛之前就停止。这样会影响最终的精度,但一般来说影响不会特别大。
另一种方法就是从矩阵论出发,重新设计算法,具体方法如下:
第一步,令M为用户物品二分图的转移概率矩阵
M ( v , v ′ ) = 1 ∣ o u t ( v ) ∣ M(v,v')=\frac{1}{|out(v)|} M(v,v′)=∣out(v)∣1
第二步,迭代公式转化为:
r = ( 1 − α ) r 0 + α M T r = ( 1 − α ) ( 1 − α M T ) − 1 r 0 \begin{align} r &=(1-\alpha)r_0+\alpha M^Tr \\ &=(1-\alpha)(1-\alpha M^T)^{-1}r_0 \end{align} r=(1−α)r0+αMTr=(1−α)(1−αMT)−1r0
第三步,对稀疏矩阵 1 − α M T 1-\alpha M^T 1−αMT快速求逆