读书笔记--项亮《推荐系统实践》第二章

                                                                     第二章 利用用户行为数据

为了让推荐结果符合用户口味,我们需要深入了解用户。
通过用户注册时提交的信息来推断用户兴趣存在的缺点:

现在的自然语言理解技术很难理解用户用来描述兴趣的自然语言(还存在一种情况:给定的词汇可能不能准确表达/涵盖用户的实际兴趣)
用户的兴趣是不断变化的,但用户不会不停地更新兴趣描述
很多时候用户并不知道自己喜欢什么,或者很难用语言描述自己喜欢什么

因此,我们需要通过算法自动发掘用户行为数据,从用户的行为中推测出用户的兴趣,从而给用户推荐满足他们兴趣的物品。

基于用户行为分析的推荐算法是个性化推荐系统的重要算法,学术界一般将这种类型的算法称为协同过滤算法。

2.1 用户行为数据简介

用户行为数据在网站上最简单的存在形式就是日志。

会话日志和会话:
每个会话表示一次用户行为和对应的服务。会话日志可以用来描述用户行为。

会话日志包括展示日志和点击日志

一个并行程序会周期性地归并展示日志和点击日志,得到的会话日志中每个消息是一个用户提交的查询、得到的结果以及点击。

用户行为在个性化推荐系统中一般分两种——显性反馈行为(explicit feedback)和隐性反馈行为(implicit feedback)。

显性反馈行为包括用户明确表示对物品喜好的行为,主要有:
这里的主要方式就是评分和喜欢/不喜欢。

不同的网站需要根据自己的特点设计评分系统:
YouTube的用户主要将精力放在看视频上,因此他们只有在特别不满或者特别满意时才会评分,因此二级评分系统就足够了。但如果是评论网站,用户主要将精力放在评论上,这时多级评分系统就是必要的。

隐性反馈行为:
隐性反馈行为指的是那些不能明确反应用户喜好的行为。最具代表性的隐性反馈行为就是页面浏览行为

显性反馈数据和隐性反馈数据的比较:

按照反馈的方向分,又可以分为正反馈和负反馈。
正反馈指用户的行为倾向于指用户喜欢该物品,而负反馈指用户的行为倾向于指用户不喜欢该物品。

用户行为的表示:
将一个用户行为表示为6部分,即产生行为的用户和行为的对象、行为的种类、产生行为的上下文、行为的内容和权重。
产生行为的用户和行为的对象就是所有行为都必须包含的。

2.2 用户行为分析

在利用用户行为数据设计推荐算法之前,研究人员首先需要对用户行为数据进行分析,了解数据中蕴含的一般规律,这样才能对算法的设计起到指导作用。

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

互联网上的很多数据分布都满足一种称为Power Law 3 的分布,这个分布在互联网领域也称长尾分布。
两种分布都呈长尾分布。

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

二者的关系如下:
用户越活跃,越倾向于浏览冷门的物品

仅仅基于用户行为数据设计的推荐算法一般称为协同过滤算法。得到最广泛应用的算法是基于邻域的方法。基于邻域的方法主要包含下
面两种算法:
 基于用户的协同过滤算法 这种算法给用户推荐和他兴趣相似的其他用户喜欢的物品。
 基于物品的协同过滤算法 这种算法给用户推荐和他之前喜欢的物品相似的物品。

2.3 实验设计和算法评测

2.3.1 数据集

采用MovieLens 数据集,该数据集包含 6000 多用户对 4000 多部电影的 100 万条评分。
本章着重研究隐反馈数据集中的 TopN 推荐问题,因此TopN 推荐的任务是预测用户会不会对某部电影评分。

2.3.2 实验设计

实验设计步骤如下:
协同过滤算法的离线实验一般如下设计。首先,将用户行为数据集按照均匀分布随机分成 M份(本章取 M =8 ),挑选一份作为测试集,将剩下的 M -1 份作为训练集。然后在训练集上建立用户兴趣模型,并在测试集上对用户行为进行预测,统计出相应的评测指标。为了保证评测指标并不是过拟合的结果,需要进行 M 次实验,并且每次都使用不同的测试集。然后将 M 次实验测出的评测指标的平均值作为最终的评测指标。

2.3.3 评测指标

主要的评测指标有准确率 / 召回率、精度、覆盖率、新颖度

2.4 基于邻域的算法

2.4.1 基于用户的协同过滤算法

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

步骤 (1) 的关键就是计算两个用户的兴趣相似度,协同过滤算法主要利用行为的相似度计算兴趣的相似度。

而计算用户行为相似度的方法主要有Jaccard相似度计算和余弦相似度计算两种方法。
给定用户 u 和用户 v ,令 N(u) 表示用户 u 曾经有过正反馈的物品集合,令 N(v)为用户 v 曾经有过正反馈的物品集合。那么,我们可以通过如下的 Jaccard 公式简单地计算 u 和 v 的兴趣相似度:

或者通过余弦相似度计算:
下面有一个计算相似度的例子:

计算用户兴趣相似度:
算法解释:
首先,需要建立物品—用户的倒排表(如图
2-7所示)。然后,建立一个4×4的用户相似度矩阵W,对于物品a,将W[A][B]和W[B][A]加1,对
于物品b,将W[A][C]和W[C][A]加1,以此类推。扫描完所有物品后,我们可以得到最终的W矩阵。
这里的W是余弦相似度中的分子部分,然后将W除以分母可以得到最终的用户兴趣相似度。

得到用户之间的兴趣相似度后, UserCF 算法会给用户推荐和他兴趣最相似的 K 个用户喜欢的物品。如下的公式度量(推测/预测)了 UserCF 算法中用户 u 对物品 i 的感兴趣程度:

其中, S(u, K) 包含和用户 u 兴趣最接近的 K 个用户, N(i) 是对物品 i 有过行为的用户集合, w uv
是用户 u 和用户 v 的兴趣相似度, r vi 代表用户 v 对物品 i 的兴趣,因为使用的是单一行为的隐反馈数
据,所以所有的 r vi =1 。
2. 用户相似度计算的改进(考虑物品的流行度/冷门热门情况对用户行为相似度的影响)
本节通过改进余弦相似度计算公式来提高 UserCF 的推荐性能

思考:
以图书为例,如果两个用户都曾经买过《新华字典》,这丝毫不能说明他们兴趣相似,因为绝大多数中国人小时候都买过《新华字典》。但如果两个用户都买过《数据挖掘导论》,那可以认为他们的兴趣比较相似,因为只有研究数据挖掘的人才会买这本书。
得出结论:
换句话说,两个用户对冷门物品采取过同样的行为更能说明他们兴趣的相似度。
改进方法:
加大对用户 u 和用户 v 共同兴趣列表中热门物品对他们相似度的影响的惩罚。
如下所示改进公式:
其中,红框部分表示惩罚了用户 u 和用户 v 共同兴趣列表中热门物品对他们相似度的影响。
本书将基于上述用户相似度公式的 UserCF 算法记为 User-IIF 算法。
3. 实际在线系统使用UserCF的例子相比我们后面要讨论的基于物品的协同过滤算法( ItemCF ), UserCF 在目前的实际应用中使用并不多。

2.4.2 基于物品的协同过滤算法

基于物品的协同过滤( item-based collaborative filtering )算法是目前业界应用最多的算法。

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

基于物品的协同过滤算法(简称 ItemCF )给用户推荐那些和他们之前喜欢的物品相似的物品。
ItemCF 算法并不利用物品的内容属性计算物品之间的相似度,它主要通过分析用户的行为记录计算物品之间的相似度。

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

这里,分母 |N(i)| 是喜欢物品 i 的用户数,而分子 N ( i )  N ( j ) 是同时喜欢物品 i 和物品 j 的用户数。因此,上述公式可以理解为喜欢物品 i 的用户中有多少比例的用户也喜欢物品 j 。
存在的问题:
如果物品 j 很热门,很多人都喜欢,那么 W ij 就会很大,接近 1 (我的理解:此时Nj相当于全集U,因此Ni交Nj就等于Ni,结果w就是1)。因此,该公式会造成任何物品都会和热门的物品有很大的相似度,这对于致力于挖掘长尾信息的推荐系统来说显然不是一个好的特性。
改进方法:
为了避免推荐出热门的物品,可以用下面的公式:

这个公式惩罚了物品 j 的权重,因此减轻了热门物品会和很多物品相似的可能性。

下面是一个一个计算物品相似度的简单例子:

上图的解析:
上图是一个根据上面的程序计算物品相似度的简单例子。图中最左边是输入的用户行为记录,每一行代表一个用户感兴趣的物品集合。然后,对于每个物品集合,我们将里面的物品两两加一,得到一个矩阵。最终将这些矩阵相加得到上面的 C 矩阵。其中 C[i][j] 记录了同时喜欢物品 i
和物品 j 的用户数。最后,将 C 矩阵归一化可以得到物品之间的余弦相似度矩阵 W (这个怎么求?)。

在得到物品之间的相似度后,ItemCF通过如下公式计算用户u对一个物品j的兴趣:

参数解释:
这里N(u)是用户喜欢的物品的集合,S(j,K)是和物品j最相似的K个物品的集合,w ji 是物品j和i的相似度,r ui 是用户u对物品i的兴趣。

该公式的含义是,和用户历史上感兴趣的物品越相似的物品,越有可能在用户的推荐列表中获得比较高的排名。

下面是一个简单的基于物品推荐的例子:

解释:关键点:兴趣度和相似度
图 2-12 是一个基于物品推荐的简单例子。该例子中,用户喜欢《 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 。
由此可以看出,ItemCF 的一个优势就是可以提供推荐解释。

  1. 用户活跃度对物品相似度的影响(对上述算法的改进)
    从前面的要论中我们可以看出,每个用户的兴趣列表都对物品的相似度产生贡献,现在的问题是:每个用户的贡献程度相同吗?

算法改进:
John S. Breese 在论文 1 中提出了一个称为 IUF ( Inverse User Frequence )倒数的参数,他也认为活跃用户对物品相似度的贡献应该小于不活跃的用户,他提出应该增加 IUF参数来修正物品相似度的计算公式:

上面的公式只是对活跃用户做了一种软性的惩罚,但对于很多过于活跃的用户,比如上面那位买了当当网 80% 图书的用户,为了避免相似度矩阵过于稠密,我们在实际计算中一般直接忽略他的兴趣列表,而不将其纳入到相似度计算的数据集中。
本书将上面的算法记为 ItemCF-IUF

  1. 物品相似度的归一化
    研究证明,将 ItemCF 的相似度矩阵按最大值归一化,可以提高推荐的准确率,公式如下:

实行归一化的优点:
①增加推荐的准确度;②提高推荐的覆盖率和多样性

一般来说,物品总是属于很多不同的类,每一类中的物品联系比较紧密。
举例理解:这也是归一化的一个典型的作用:所谓的统一量纲
在一个电影网站中,有两种电影——纪录片和动画片。那么, ItemCF 算出来的相似度一般是纪录片和纪录片的相似度或者动画片和动画片的相似度大于纪录片和动画片的相似度。但是纪录片之间的相似度和动画片之间的相似度却不一定相同。假设物品分为两类—— A 和 B , A 类物品之间的相似度为 0.5 , B 类物品之间的相似度为 0.6 ,而 A 类物品和 B 类物品之间的相似度是 0.2 。在这种情况下,如果一个用户喜欢了 5 个 A 类物品和 5 个 B 类物品,用 ItemCF 给他进行推荐,推荐的就都是 B 类物品,因为 B 类物品之间的相似度大。但如果归一化之后, A 类物品之间的相似度变成了 1 , B 类物品之间的相似度也是 1 ,那么这种情况下,用户如果喜欢 5 个 A 类物品和 5 个 B 类物品,那么他的推荐列
表中 A 类物品和 B 类物品的数目也应该是大致相等的。

对于两个不同的类,一般来说,热门的类其类内物品相似度一般比较大。如果不进行归一化,就会推荐比较热门的类里面的物品,而这些物品也是比较热门的。因此,推荐的覆盖率就比较低。因此,归一化可以提高覆盖率。

2.4.3 UserCF和ItemCF的综合比较

二者在原理方面的不同:
UserCF 的推荐结果着重于反映和用户兴趣相似的小群体的热点,而 ItemCF的推荐结果着重于维系用户的历史兴趣。换句话说, UserCF 的推荐更社会化,反映了用户所在的小型兴趣群体中物品的热门程度,而 ItemCF 的推荐更加个性化,反映了用户自己的兴趣传承。

举例说明:
serCF 适合用于新闻推荐,从技术角度考量来看:
因为作为一种物品,新闻的更新非常快,每时每刻都有新内容出现,而 ItemCF 需要维护一张物品相关度的表,如果物品更新很快,那么这张表也需要很快更新,这在技术上很难实现。

二者的综合比较:

分析:
为什么原始 ItemCF 算法的覆盖率和新颖度都不高

哈利波特问题:
购买任何一本书的人似乎都会购买《哈利波特》。原因:这本书太热门了。
解决方案:
①在分母上加大对热门物品的惩罚
其中   [0.5 ,1] 。通过提高 α ,就可以惩罚热门的 j 。
从离线实验结果可以看到, α 只有在取值为 0.5 时才会导致最高的准确率和召回率,也就是标准的 ItemCF 算法。
如果看覆盖率和平均流行度就可以发现, α 越大,覆盖率就越高,并且结果的平均热门程度会降低。

两个不同领域的最热门物品之间往往具有比较高的相似度。这个时候,仅仅靠用户行为数据是不能解决这个问题的,因为用户的行为表示这种物品之间应该相似度很高。此时,我们只能依靠引入物品的内容数据解决这个问题,比如对不同领域的物品降低权重等。这些就不是协同过滤讨论的范畴了。

2.5 隐语义模型

Latent factor model:隐语义模型最早在文本挖掘领域被提出,用于找到文本的隐含语义。

2.5.1 基础算法

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

为解决物品分类问题,我们提出隐含语义分析技术,可以很好的解决人工进行物品分类方法存在的很多缺点。
隐含语义分析技术的关键:
采取基于用户行为统计的自动聚类。
隐含语义分析技术产生的模型和方法:
pLSA 、 LDA 、隐含类别模型( latent class model )、隐含主题模型( latent topic model )、矩阵分解( matrix factorization )

2 LFM算法
本章将以 LFM 为例介绍隐含语义分析技术在推荐系统中的应用。LFM也是基于用户行为统计的技术。
LFM 通过如下公式计算用户 u 对物品 i 的兴趣:
在这里插入图片描述

这个公式中 p u , k 和 q i , k 是模型的参数,其中 p u , k 度量了用户 u 的兴趣和第 k 个隐类的关系,而
q i , k 度量了第 k 个隐类和物品 i 之间的关系。
如何计算这两个参数:(从数据集中计算得到)
要计算这两个参数,需要一个训练集,对于每个用户 u ,训练集里都包含了用户 u 喜欢的物品和不感兴趣的物品,通过学习这个数据集,就可以获得上面的模型参数。

下面是LFM模型在隐性反馈数据集上解决TopN推荐问题。(隐性反馈数据集存在的弊端:特点是只有正样本(用户喜欢什么物品),而没有负样本(用户对什么物品不感兴趣))
(1)因此第一个问题就是要解决负样本。
最好的解决方法:
对于一个用户,从他没有过行为的物品中采样出一些物品作为负样本,但采样时,保证每个用户的正负样本数目相当。

对负样本进行采样时应遵守的原则:
对每个用户,要保证正负样本的平衡(数目相似)。
对每个用户采样负样本时,要选取那些很热门,而用户却没有行为的物品。
对第二条的解释:
一般认为,很热门而用户却没有行为更加代表用户对这个物品不感兴趣。因为对于冷门的物品,用户可能是压根没在网站中发现这个物品,所以谈不上是否感兴趣。

经过负样本采样,得到上述公式中出现的两个参数。
(2)然后计算损失函数,再利用随机梯度下降算法进行优化,最终得到最好的参数。

3 对LFM算法模型进行实验评测
略。

2.5.2 基于LFM的实际系统的例子

本章介绍使用 LFM 进行雅虎首页个性化设计的方案。

雅虎为解决LFM不能满足实时推荐对其进行了改进,解决方案如下:
该解决方案分为两个部分:
首先,利用新闻链接的内容属性(关键词、类别等)得到链接 i 的内容特征向量 y i;
其次,实时地收集用户对链接的行为,并且用这些数据得到链接 i 的隐特征向量 q i;
然后,利用如下公式预测用户 u 是否会单击链接 i。
在这里插入图片描述
其中, y i 是根据物品的内容属性直接生成的, x uk 是用户 u 对内容特征 k 的兴趣程度,用户向量x u 可以根据历史行为记录获得,而且每天只需要计算一次。而 p u 、 q i 是根据实时拿到的用户最近几小时的行为训练 LFM 获得的。因此,对于一个新加入的物品 i ,可以通过 x u T  y i 估计用户 u 对物品 i 的兴趣,然后经过几个小时后,就可以通过 p u T  q i 得到更加准确的预测值。(换言之,前者是历史信息,后者是实时信息)

2.5.3 LFM和基于邻域的方法的比较

下面将从不同的方面对比 LFM 和基于邻域的方法。基于邻域的方法有UserCF 、 ItemCF等方法。

  • 理论基础 LFM
    具有比较好的理论基础,它是一种(机器)学习方法,通过优化一个设定的指标建立最优的模型。基于邻域的方法更多的是一种基于统计的方法,并没有学习过程。
  • 离线计算的空间复杂度
    假设有 M 个用户和 N 个物品,对于基于邻域的方法,如果假设是用户相关表,则需要 O(MM) 的空间,而对于物品相关表,则需要 O(NN) 的空间。而 LFM 在建模过程中,如果是 F 个隐类,那么它需要的存储空间是 O(F*(M+N))。
  • 离线计算的时间复杂度
    假设有 M 个用户、 N 个物品、 K 条用户对物品的行为记录。那么,UserCF 计算用户相关表的时间复杂度是 O(N * (K/N)^2) ,而 ItemCF 计算物品相关表的时间复杂度是 O(M*(K/M)^2) 。而对于 LFM ,如果用 F 个隐类,迭代 S 次,那么它的计算复杂度是 O(K * F * S) 。
    在一般情况下, LFM 的时间复杂度要稍微高于 UserCF 和 ItemCF ,这主要是因为该算法需要多次迭代。但总体上,这两种算法在时间复杂度上没有质的差别。
  • 在线实时推荐
    UserCF 和 ItemCF算法可以实现在线实时推荐,而LFM算法不能实现在线实时推荐,主要原因有两点:
    第一,在加入新物品重新进行物品权重排序时如果物品数量太多,其花费的时间复杂度较高;第二,LFM生成用户推荐列表时速度较慢。
  • 推荐解释
    ItemCF 算法支持很好的推荐解释,它可以利用用户的历史行为解释推荐结果。但 LFM 无法提供这样的解释,它计算出的隐类虽然在语义上确实代表了一类兴趣和物品,却很难用自然语言描述并生成解释展现给用户。

2.6 基于图的模型

用户行为很容易用二分图表示,因此很多图的算法都可以用到推荐系统中。本章重点解决如何将用户行为用图表示,并利用图的算法给用户进行个性化推荐。

2.6.1 用户行为数据的二分图表示

在研究基于图的模型之前,首先需要将用户行为数据表示成图的形式。
本章讨论的用户行为数据是由一系列二元组组成的,其中每个二元组 (u, i) 表示用户 u 对物品 i 产生过行为。

令 G ( V , E )表示用户物品二分图,其中 V  V U  V I 由用户顶点集合 V U 和物品顶点集合 V I组成。对于数据集中每一个二元组 (u, i) ,图中都有一套对应的边 e ( v u , v i ) ,其中 v u  V U 是用户 u对应的顶点, v i  V I 是物品 i 对应的顶点。
如下图所示用户物品二分图模型:
比如图中用户节点 A 和物品节点 a 、 b 、 d 相连,说明用户 A 对物品 a 、 b 、 d 产生过行为。
在这里插入图片描述

2.6.2 基于图的推荐算法

下面在二分图上给用户进行个性化推荐。
本质:如果将个性化推荐算法放到二分图模型上,那么给用户 u 推荐物品的任务就可以转化为度量用户顶点v u 和与 v u 没有边直接相连的物品节点在图上的相关性。

图中顶点的相关性主要取决于下面 3个因素:

  • 两个顶点之间的路径数;
  • 两个顶点之间路径的长度;
  • 两个顶点之间的路径经过的顶点。
    而相关性高的一对顶点一般具有如下特征:
  • 两个顶点之间有很多路径相连;
  • 连接两个顶点之间的路径长度都比较;
  • 连接两个顶点之间的路径不会经过出度比较大的顶点。

计算图中顶点之间相关性的方法,本节提出一种基于随机游走的PersonalRank算法。
算法思想:
假设要给用户 u 进行个性化推荐,可以从用户 u 对应的节点 v u 开始在用户物品二分图上进行随机游走。游走到任何一个节点时,首先按照概率 α 决定是继续游走,还是停止这次游走并从 v u 节点开始重新游走。如果决定继续游走,那么就从当前节点指向的节点中按照均匀分布随机选择一个节点作为游走下次经过的节点。这样,经过很多次随机游走后,每个物品节点被访问到的概率会收敛到一个数。最终的推荐列表中物品的权重就是物品节点的访问概率
如果将上面的描述表示成公式,可以得到如下公式:
在这里插入图片描述
示例:
我们用上面的算法跑了一下图 2-20 的例子,给 A 用户进行推荐。图 2-21 给出了不同迭代次数后每个顶点的访问概率。从图中可以看到,每个顶点的访问概率在 9 次迭代之后就基本上收敛了。在这个例子中,用户 A 没有对物品 b 、 d 有过行为。在最后的迭代结果中, d 的访问概率大于 b ,因此给 A 的推荐列表就是 {d, b} 。
在这里插入图片描述
PersonalRank 算法的缺点:
虽然 PersonalRank 算法可以通过随机游走进行比较好的理论解释,但该算法在时间复杂度上有明显的缺点。
原因:
PersonalRank 每次都需要在全图迭代并因此造成时间复杂度很高
两种解决方案:
其中一种:从矩阵论出发,重新设计算法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值