【推荐系统实践-02】利用用户行为数据(协同过滤)

喜夏-厌秋 提交于 2020-01-12 05:14:19

项亮老师的《推荐系统实践》学习笔记​。​

目录

  • 用户行为数据简介
  • 用户行为分析
    • 用户活跃度和物品流行度的分布
    • 用户活跃度和物品流行度的关系
  • 基于邻域的算法
    • 基于用户的协同过滤算法
    • 基于物品的协同过滤算法
    • UserCF和ItemCF的比较
  • 隐语义模型
  • 基于图的模型

为了让推荐结果符合用户口味,我们需要深入了解用户。
基于用户行为分析的推荐算法是个性化推荐系统的重要算法,学术界一般将这种类型的算法称为协同过滤算法。顾名思义,协同过滤就是指用户可以齐心协力,通过不断地和网站互动,使自己的推荐列表能够不断过滤掉自己不感兴趣的物品,从而越来越满足自己的需求。

1、用户行为数据简介

用户行为数据在网站上最简单的存在形式就是日志。网站在运行过程中都产生大量原始日志(raw log),并将其存储在文件系统中。很多互联网业务会把多种原始日志按照用户行为汇总成会话日志(session log),其中每个会话表示一次用户行为和对应的服务。
会话日志通常存储在分布式数据仓库中,这些日志记录了用户的各种行为,如在电子商务网站中这些行为主要包括网页浏览、购买、点击、评分和评论等。
用户行为在个性化推荐系统中一般分两种——显性反馈行为(explicit feedback)和隐性反馈行为(implicit feedback)。显性反馈行为包括用户明确表示对物品喜好的行为。隐性反馈行为指的是那些不能明确反应用户喜好的行为。最具代表性的隐性反馈行为就是页面浏览行为。

什么数据是显性反馈数据,什么是隐性反馈数据?

一般来说,不同的数据集包含不同的行为,目前比较有代表性的数据集有下面几个。

  • 无上下文信息的隐性反馈数据集
    每一条行为记录仅仅包含用户ID和物品ID。
  • 无上下文信息的显性反馈数据集
    每一条记录包含用户ID、物品ID和用户对物品的评分。
  • 有上下文信息的隐性反馈数据集
    每一条记录包含用户ID、物品ID和用户对物品产生行为的时间戳。
  • 有上下文信息的显性反馈数据集
    每一条记录包含用户ID、物品ID、用户对物品的评分和评分行为发生的时间戳。

2、用户行为分析

2.1、用户活跃度和物品流行度的分布

很多关于互联网数据的研究发现,互联网上的很多数据分布都满足一种称为Power Law的分布,这个分布在互联网领域也称长尾分布。
f(x)=αxkf(x)=\alpha x^k
很多研究人员发现,用户行为数据也蕴含着这种规律。令fu(k)f_u(k)为对k个物品产生过行为的用户数,令fi(k)f_i(k)为被k个用户产生过行为的物品数。那么,fu(k)f_u(k)fi(k)f_i(k)都满足长尾分布。分布示意图如下图所示。
物品流行度的分布曲线(横坐标为流行度K,纵坐标为流行度为K的物品总数)(Delicious和CiteULike数据集一个月的原始数据)

用户活跃度的分布曲线(横坐标为用户的活跃度K,纵坐标为活跃度为K的用户总数)

2.2、用户活跃度和物品流行度的关系

一般认为,新用户倾向于浏览热门的物品,因为他们对网站还不熟悉,只能点击首页的热门物品,而老用户会逐渐开始浏览冷门的物品。
用户活跃度和物品流行度之间的关系如图所示。(横坐标是用户活跃度,纵坐标是具有某个活跃度的所有用户评过分的物品的平均流行度)

图中曲线呈明显下降的趋势,这表明用户越活跃,越倾向于浏览冷门的物品。

仅仅基于用户行为数据设计的推荐算法一般称为协同过滤算法。

  • 基于邻域的方法(neighborhood-based)
  • 隐语义模型(latent factor model)
  • 基于图的随机游走算法(random walk on graph)

在这些方法中,最著名的、在业界得到最广泛应用的算法是基于邻域的方法,而基于邻域的方法主要包含下面两种算法。

  • 基于用户的协同过滤算法
    给用户推荐和他兴趣相似的其他用户喜欢的物品
  • 基于物品的协同过滤算法
    给用户推荐和他之前喜欢的物品相似的物品

3、基于邻域的算法

基于邻域的算法是推荐系统中最基本的算法。基于邻域的算法分为两大类,一类是基于用户的协同过滤算法,另一类是基于物品的协同过滤算法。

3.1、基于用户的协同过滤算法

在一个在线个性化推荐系统中,当一个用户A需要个性化推荐时,可以先找到和他有相似兴趣的其他用户,然后把那些用户喜欢的、而用户A没有听说过的物品推荐给A。这种方法称为基于用户的协同过滤算法

基于用户的协同过滤算法主要包括两个步骤。
(1) 找到和目标用户兴趣相似的用户集合。
(2) 找到这个集合中的用户喜欢的,且目标用户没有听说过的物品推荐给目标用户。

步骤(1) 的关键就是计算两个用户的兴趣相似度。这里,协同过滤算法主要利用行为的相似度计算兴趣的相似度。给定用户u和用户v,令N(u)表示用户u曾经有过正反馈的物品集合,令N(v)为用户v曾经有过正反馈的物品集合。我们需要计算u和v的兴趣相似度。
通过Jaccard:
Wuv=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)W_{uv}=\frac{|N(u)\cap{N(v)}|}{\sqrt{|N(u)||N(v)|}}
UserCF只有一个重要的参数K,即为每个用户选出K个和他兴趣最相似的用户,然后推荐那K个用户感兴趣的物品。
实验发现参数K的对一些评估指标的影响结果。

  • 准确率和召回率
    推荐系统的精度指标(准确率和召回率)并不和参数K成线性关系。此选择合适的K对于获得高的推荐系统精度比较重要。
  • 流行度
    因为K决定了UserCF在给你做推荐时参考多少和你兴趣相似的其他用户的兴趣,那么如果K越大,参考的人越多,结果就越来越趋近于全局热门的物品。
  • 覆盖率
    K越大则UserCF推荐结果的覆盖率越低。覆盖率的降低是因为流行度的增加,随着流行度增加,UserCF越来越倾向于推荐热门的物品,从而对长尾物品的推荐越来越少,因此造成了覆盖率的降低。

上述介绍的余弦相似度公式过于粗糙,下面介绍用户相似度计算的改进。
两个用户对冷门物品采取过同样的行为更能说明他们兴趣的相似度。
Wuv=iN(u)N(v)1log(1+N(i))N(u)N(v)W_{uv}=\frac{\sum\limits_{i\in{N(u)\cap{N(v)}}}\frac{1}{\log{(1+|N(i)|)}}}{\sqrt{|N(u)||N(v)|}}
可以看出,该公式通过1log(1+N(i))\frac{1}{\log{(1+|N(i)|)}}惩罚了用户u和用户v共同兴趣列表中热门物品对他们相似度的影响。
如上,可以计算出用户之间的兴趣相似度。

步骤(2) 计算完用户之间的兴趣相似度后,UserCF算法会给用户推荐和他兴趣最相似的K个用户喜欢的物品。如下的公式度量了UserCF算法中用户u对物品i的感兴趣程度:
p(u,i)=vS(u,K)N(i)wuvrvip(u,i)=\sum\limits_{v\in{S(u,K)\cap{N(i)}}}w_{uv}r_{vi}
其中,S(u,K)S(u, K)包含和用户u兴趣最接近的K个用户,N(i)是对物品i有过行为的用户集合,wuvw_{uv}是用户u和用户v的兴趣相似度,rvi{r_{vi}}代表用户v对物品i的兴趣。

3.2、基于物品的协同过滤算法

1.基础算法

基于用户的协同过滤算法的缺点很明显。首先,随着网站的用户数目越来越大,计算用户兴趣相似度矩阵将越来越困难,其运算时间复杂度和空间复杂度的增长和用户数的增长近似于平方关系。其次,基于用户的协同过滤很难对推荐结果作出解释。

基于物品的协同过滤算法(简称ItemCF)给用户推荐那些和他们之前喜欢的物品相似的物品。该算法认为,物品A和物品B具有很大的相似度是因为喜欢物品A的用户大都也喜欢物品B。

基于物品的协同过滤算法主要分为两步。
(1) 计算物品之间的相似度。
(2) 根据物品的相似度和用户的历史行为给用户生成推荐列表。

步骤(1) 来计算物品的相似度:
Wij=N(i)N(j)NiW_{ij}=\frac{|N(i)\cap{N(j)}|}{|N{i}|}
这里,分母|N(i)|是喜欢物品i的用户数,而分子N(i)N(j)N(i)\cap{N(j)}|是同时喜欢物品i和物品j的用户数。因此,上述公式可以理解为喜欢物品i的用户中有多少比例的用户也喜欢物品j。
上述公式虽然看起来很有道理,但是却存在一个问题。如果物品j很热门,很多人都喜欢,那么WijW_{ij}就会很大,接近1。因此,该公式会造成任何物品都会和热门的物品有很大的相似度,这对于致力于挖掘长尾信息的推荐系统来说显然不是一个好的特性。为了避免推荐出热门的物品,可以用下面的公式:
Wij=N(i)N(j)N(i)N(j)W_{ij}=\frac{|N(i)\cap{N(j)}|}{\sqrt{|N(i)||N(j)|}}
这个公式惩罚了物品j的权重,因此减轻了热门物品会和很多物品相似的可能性。

步骤(2) 在的到物品的相似度后,ItemCF通过如下公式计算用户u对一个物品j的兴趣:
puj=vS(j,K)N(u)wjiruip_{uj}=\sum\limits_{v\in{S(j,K)\cap{N(u)}}}w_{ji}r_{ui}
其中,S(j,K)S(j, K)包含和物品j最相似的K个物品集合,N(u)是用户喜欢的物品集合,wjiw_{ji}是物品j和物品i的相似度,rui{r_{ui}}代表用户v对物品i的兴趣。

2.用户活跃度对物品相似度的影响

John S. Breese在论文中提出了一个称为IUF(Inverse User Frequence),即用户活跃度对数的倒数的参数,他也认为活跃用户对物品相似度的贡献应该小于不活跃的用户,他提出应该增加IUF参数来修正物品相似度的计算公式:
Wuv=uN(i)N(j)1log(1+N(u))N(i)N(j)W_{uv}=\frac{\sum\limits_{u\in{N(i)\cap{N(j)}}}\frac{1}{\log{(1+|N(u)|)}}}{\sqrt{|N(i)||N(j)|}}
当然,上面的公式只是对活跃用户做了一种软性的惩罚,但对于很多过于活跃的用户,为了避免相似度矩阵过于稠密,我们在实际计算中一般直接忽略他的兴趣列表,而不将其纳入到相似度计算的数据集中。

3.物品相似度的归一化

Karypis在研究中发现如果将ItemCF的相似度矩阵按最大值归一化,可以提高推荐的准确率。
归一化的好处不仅仅在于增加推荐的准确度,它还可以提高推荐的覆盖率和多样性。

3.3、UserCF和ItemCF的比较

回顾一下UserCF算法和ItemCF算法的推荐原理。UserCF给用户推荐那些和他有共同兴趣爱好的用户喜欢的物品,而ItemCF给用户推荐那些和他之前喜欢的物品类似的物品。
从这个算法的原理可以看到,UserCF的推荐结果着重于反映和用户兴趣相似的小群体的热点,而ItemCF的推荐结果着重于维系用户的历史兴趣。换句话说,UserCF的推荐更社会化,反映了用户所在的小型兴趣群体中物品的热门程度,而ItemCF的推荐更加个性化,反映了用户自己的兴趣传承。

在新闻网站中,用户的兴趣不是特别细化,绝大多数用户都喜欢看热门的新闻。个性化新闻推荐更加强调抓住新闻热点,热门程度和时效性是个性化新闻推荐的重点,而个性化相对于这两点略显次要。因此,UserCF可以给用户推荐和他有相似爱好的一群其他用户今天都在看的新闻,这样在抓住热点和时效性的同时,保证了一定程度的个性化。UserCF适合用于新闻推荐的另一个原因是从技术角度考量的。因为作为一种物品,新闻的更新非常快,每时每刻都有新内容出现,而ItemCF需要维护一张物品相关度的表,如果物品更新很快,那么这张表也需要很快更新,这在技术上很难实现。绝大多数物品相关度表都只能做到一天一次更新,这在新闻领域是不可以接受的。而UserCF只需要用户相似性表,虽然UserCF对于新用户也需要更新相似度表,但在新闻网站中,物品的更新速度远远快于新用户的加入速度,而且对于新用户,完全可以给他推荐最热门的新闻,因此UserCF显然是利大于弊。

在图书、电子商务和电影网站,比如亚马逊、豆瓣、Netflix中,ItemCF则能极大地发挥优势。首先,在这些网站中,用户的兴趣是比较固定和持久的。此外,这些系统中的用户大都不太需要流行度来辅助他们判断一个物品的好坏,而是可以通过自己熟悉领域的知识自己判断物品的质量。

同时,从技术上考虑,UserCF需要维护一个用户相似度的矩阵,而ItemCF需要维护一个物品相似度矩阵。从存储的角度说,如果用户很多,那么维护用户兴趣相似度矩阵需要很大的空间,同理,如果物品很多,那么维护物品相似度矩阵代价较大。

如图从不同的角度对比了UserCF和ItemCF算法。

4、隐语义模型

该算法最早在文本挖掘领域被提出,用于找到文本的隐含语义。相关的名词有LSI、pLSA、LDA和Topic Model。

隐语义模型的核心思想是通过隐含特征(latent factor)联系用户兴趣和物品。

隐含语义分析技术从诞生到今天产生了很多著名的模型和方法,其中和该技术相关且耳熟能详的名词有pLSA、LDA、隐含类别模型(latent class model)、隐含主题模型(latent topic model)、矩阵分解(matrix factorization)。这些技术和方法在本质上是相通的,其中很多方法都可以用于个性化推荐系统。这里将以LFM为例介绍隐含语义分析技术在推荐系统中的应用。
LFM通过如下公式计算用户u对物品i的兴趣:
Preference(u,i)=rui=puTqi=f=1Fpu,kqi,kPreference(u,i)=r_{ui}=p_{u}^{T}q_i=\sum\limits_{f=1}^{F}p_{u,k}q_{i,k}
这个公式中pu,kp_{u,k}qi,kq_{i,k}是模型的参数,其中pu,kp_{u,k}度量了用户u的兴趣和第k个隐类的关系,而qi,kq_{i,k}度量了第k个隐类和物品i之间的关系。那么,下面的问题就是如何计算这两个参数。
要计算这两个参数,需要一个训练集,对于每个用户u,训练集里都包含了用户u喜欢的物品和不感兴趣的物品,通过学习这个数据集,就可以获得上面的模型参数。我们可以通过优化如下的损失函数来找到最合适的参数p和q:
C=(u,i)K(ruirui^)2=(u,i)K(ruik=1Kpu,kqi,k)2+λpu2+λqi2C=\sum\limits_{(u,i)\in{K}}(r_{ui}-\hat{r_{ui}})^2=\sum\limits_{(u,i)\in{K}}(r_{ui}-\sum\limits_{k=1}^{K}p_{u,k}q_{i,k})^2+\lambda\left||p_u|\right|^2+\lambda\left||q_i|\right|^2
这里,λpu2+λqi2\lambda\left||p_u|\right|^2+\lambda\left||q_i|\right|^2, 是用来防止过拟合的正则化项,λ可以通过实验获得。
可以利用随机梯度下降法来最小化上面的损失函数。

5、基于图的模型

基于图的模型(graph-based model)是推荐系统中的重要内容。其实,很多研究人员把基于邻域的模型也称为基于图的模型,因为可以把基于邻域的模型看做基于图的模型的简单形式。
在研究基于图的模型之前,首先需要将用户行为数据表示成图的形式。
下图是一个简单的用户物品二分图模型。
其中圆形节点代表用户,方形节点代表物品,圆形节点和方形节点之间的边代表用户对物品的行为。比如图中用户节点A和物品节点a、b、d相连,说明用户A对物品a、b、d产生过行为。

将用户行为表示为二分图模型后,下面的任务就是在二分图上给用户进行个性化推荐。如果将个性化推荐算法放到二分图模型上,那么给用户u推荐物品的任务就可以转化为度量用户顶点vuv_{u}和与vuv_{u}没有边直接相连的物品节点在图上的相关性,相关性越高的物品在推荐列表中的权重就越高。

这里介绍一种基于随机游走的PersonalRank算法
假设要给用户u进行个性化推荐,可以从用户u对应的节点vuv_u开始在用户物品二分图上进行随机游走。游走到任何一个节点时,首先按照概率α决定是继续游走,还是停止这次游走并从vuv_u节点开始重新游走。如果决定继续游走,那么就从当前节点指向的节点中按照均匀分布随机选择一个节点作为游走下次经过的节点。这样,经过很多次随机游走后,每个物品节点被访问到的概率会收敛到一个数。最终的推荐列表中物品的权重就是物品节点的访问概率。
如果将上面的描述表示成公式,可以得到如下公式:

虽然PersonalRank算法可以通过随机游走进行比较好的理论解释,但该算法在时间复杂度上有明显的缺点。因为在为每个用户进行推荐时,都需要在整个用户物品二分图上进行迭代,直到整个图上的每个顶点的PR值收敛。这一过程的时间复杂度非常高,不仅无法在线提供实时推荐,甚至离线生成推荐结果也很耗时。
为了解决PersonalRank每次都需要在全图迭代并因此造成时间复杂度很高的问题,这里给出两种解决方案。第一种很容易想到,就是减少迭代次数,在收敛之前就停止。这样会影响最终的精度,但一般来说影响不会特别大。另一种方法就是从矩阵论出发,重新设计算法。
对矩阵运算比较熟悉的读者可以轻松将PersonalRank转化为矩阵的形式。令M为用户物品二分图的转移概率矩阵,即:
M(v,v)=1out(v)M(v,v')=\frac{1}{|out(v)|}
那么,迭代公式可以转化为:
r=(1α)r0+αMTrr=(1-\alpha)r_0+\alpha M^Tr
解得:
r=(1α)(1αMT)1r0r=(1-\alpha)(1-\alpha M^T)^{-1}r_0
因此,只需要计算一次(1αMT)1(1-\alpha M^T)^{-1},这里1αMT1-\alpha M^T是稀疏矩阵。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!