推荐系统实践(项亮)学习笔记二:基于用户行为数据的基于邻域的协同过滤算法

文章目录

    • 用户行为数据
    • 用户行为分析
    • 实验设计
    • 基于邻域的算法
      • 基于用户的协同过滤算法
      • 基于物品的协同过滤算法
      • UserCF和ItemCF的综合比较

用户行为数据

用户行为数据在网站上的存在形式就是日志。网站运行过程中产生大量的原始日志(raw log),存储在文件系统中。将多种原始日志按照用户行为汇总成会话日志(session log),这些会话日志通常存储在分布式数据仓库中(如Hadoop hive),每个会话表示一次用户的行为和对应的服务(如用户的点击、购买、评分等行为和对应的服务)。
用户行为有两种形式,显性反馈行为(explicit feedback)和隐性反馈行为(implicit feedback)。显性反馈行为包括用户明确对物品表示喜好的行为,主要形式为评分和喜欢/不喜欢。隐性反馈行为指的是不能明确反应用户喜好的行为,如用户的页面浏览行为。
显性反馈数据和隐形反馈数据的比较:

显性反馈数据 隐性反馈数据
用户兴趣 明确 不明确
数量 较少 庞大
存储 数据库 分布式文件系统
实时读取 实时 有延迟
正负反馈 都有 只有正反馈

用户行为的统一表示:

user id 产生行为用户的唯一标识
item id 产生行为对象的唯一标识
behavior type 行为类型(如点击、收藏、购买、评论、转发)
context 产生行为的上下文,包括时间和地点
behavior weight 产生行为的权重(如观看视频行为的观看时长、打分行为的分数)
behavior context 行为内容(如评论行为的文本、打标签行为的标签)

代表性的数据集行为数据:

用户行为数据 每一条行为记录 数据集
无上下文信息的隐性反馈数据集 只包含user id和item id book-crossing
无上下文信息的显性反馈数据集 包含user id、item id和用户对物品的评分
有上下文信息的隐性反馈数据集 包含user id、item id和用户对物品产生行为的时间戳 Last.fm
有上下文信息的显式反馈数据集 包含user id、item id、用户对物品的评分和评分行为的时间戳 Netflix

用户行为分析

用户活跃度和物品流行度都满足长尾分布。设 f u ( k ) f_u(k) fu(k)为对 k k k个物品产生过行为的用户数, f i ( k ) f_i(k) fi(k)为被 k k k个用户产生过行为的物品数,则 f u ( k ) f_u(k) fu(k) f i ( k ) f_i(k) fi(k)都满足长尾分布,即
f u ( k ) = α u k β u f_u(k)=\alpha_uk^{\beta_u} fu(k)=αukβu f i ( k ) = α i k β i f_i(k)=\alpha_ik^{\beta_i} fi(k)=αikβi

用户活跃度与物品流行度也有一定的关系。一般认为,新用户倾向于浏览热门的物品,老用户会逐渐开始浏览冷门的物品。这表明用户越活跃,越倾向于浏览冷门的物品。


实验设计

在GroupLens提供的MovieLens数据集上,采取离线实验方法,研究隐反馈数据的top-N推荐问题。
只基于用户行为数据的推荐算法称为协同过滤算法,包括基于领域的方法隐语义模型基于图的随机游走算法等。

基于邻域的算法

基于用户的协同过滤算法

基于用户的协同过滤算法是推荐系统最古老的算法,该算法在1992年被提出并应用于邮件过滤系统,1994年被GroupLens用于新闻过滤。

  • 基础算法

基于用户的协同过滤算法主要包括两个步骤:
(1) 找到和目标用户兴趣相似的用户集合;
(2)找到这个集合中的用户喜欢的、且目标用户没有听说过的物品推荐给目标用户。
步骤(1)的关键是利用用户历史行为的相似度计算两个用户的兴趣相似度。对于用户 u u u和用户 v v v,令 N ( u ) N(u) N(u) N ( v ) N(v) N(v)分别表示用户 u u u和用户 v v v有过正反馈的物品集合,通过下面的jaccard公式计算用户 u u u和用户 v v v的兴趣相似度:
在这里插入图片描述
这里分母为用户 u u u和用户 v v v有历史行为的所有物品的数量,分子为用户 u u u和用户 v v v有过正反馈的相同物品的数量。
或者通过余弦相似度计算用户 u u u和用户 v v v的兴趣相似度:
在这里插入图片描述
这里分子依然为用户 u u u和用户 v v v有过正反馈的相同物品的数量,分母为两个用户行为物品集合元素数量的乘积开方。下面举例说明如何计算用户之间的兴趣相似度,下图是用户行为的例子,A、B、C、D为用户,a、b、c、d、e为物品。
推荐系统实践(项亮)学习笔记二:基于用户行为数据的基于邻域的协同过滤算法_第1张图片
使用jaccard公式计算用户之间的兴趣相似度如下:
w A B = 1 / 4 , w A C = 1 / 4 , w A D = 1 / 5 , w B C = 0 , w B D = 1 / 4 , w C D = 1 / 4 w_{AB}=1/4, w_{AC}=1/4, w_{AD}=1/5, w_{BC}=0, w_{BD}=1/4, w_{CD}=1/4 wAB=1/4,wAC=1/4,wAD=1/5,wBC=0,wBD=1/4,wCD=1/4
使用余弦相似度计算用户A和其他用户的兴趣相似度如下:
在这里插入图片描述
推荐系统实践(项亮)学习笔记二:基于用户行为数据的基于邻域的协同过滤算法_第2张图片
w B C = 0 , w B D = 1 / 6 , w C D = 1 / 6 w_{BC}=0, w_{BD}=1/\sqrt6, w_{CD}=1/\sqrt6 wBC=0,wBD=1/6 ,wCD=1/6
在用户非常多的情况下,需要对两两用户都计算相似度,时间复杂度很高,为 O ( ∣ U ∣ ∗ ∣ U ∣ O(|U|*|U| O(UU)。实际上很多用户之间并没有对同样的物品产生过行为,即很多 ∣ N ( u ) ∩ N ( v ) ∣ = 0 |N(u)\cap N(v)|=0 N(u)N(v)=0,我们可以首先计算出 ∣ N ( u ) ∩ N ( v ) ∣ ≠ 0 |N(u)\cap N(v)|\ne0 N(u)N(v)̸=0的用户对 ( u , v ) (u,v) (u,v),然后再对这种情况除以分母 ∣ U ( u ) ∣ ∣ U ( v ) ∣ \sqrt{|U(u)||U(v)|} U(u)U(v)
为此,可以建立下图所示的从物品到用户的倒排表,对于每个物品保存对该物品产生过行为的用户列表。令稀疏矩阵 C [ u ] [ v ] = ∣ N ( u ) ∩ N ( v ) ∣ C[u][v]=|N(u)\cap N(v)| C[u][v]=N(u)N(v),通过扫描倒排表中每个物品对应的用户列表,将用户列表中的两两用户对应的 C [ u ] [ v ] C[u][v] C[u][v]加1,最终得到所有用户之间不为0的 C [ u ] [ v ] C[u][v] C[u][v]
推荐系统实践(项亮)学习笔记二:基于用户行为数据的基于邻域的协同过滤算法_第3张图片
得到用户之间的兴趣相似度之后,基于用户的协同过滤算法会给用户推荐和他兴趣最相似的K个用户喜欢的物品,通过下式计算在这些物品中用户u对物品i的感兴趣程度:
在这里插入图片描述
这里 S ( u , K ) S(u,K) S(u,K)表示和用户 u u u兴趣相似度最高的 K K K个用户集合, N ( i ) N(i) N(i)表示对物品 i i i有过行为的用户集合,则这里用户 v v v的所属集合为:和用户 u u u兴趣相似度最高的 K K K个用户中对物品 i i i有过行为的用户集合,用户 v v v的数量越多, p ( u , i ) p(u,i) p(u,i)越大 w u v w_{uv} wuv表示用户 u u u和用户 v v v的兴趣相似度, w u v w_{uv} wuv越大, p ( u , i ) p(u,i) p(u,i)越大 r v i r_{vi} rvi表示从历史行为数据中得到的用户 v v v对物品 i i i的兴趣, r v i r_{vi} rvi越大, p ( u , i ) p(u,i) p(u,i)越大。注意这里的 r v i r_{vi} rvi一般根据用户不同的行为类型会赋予不同的兴趣,如一般认为用户浏览网页和收藏网页的行为表明其对此网页的兴趣程度不同,用户对当前物品的评分不同表明用户的兴趣程度不同;当只有一种用户行为(如喜欢/不喜欢)时, r v i r_{vi} rvi可以设置为常数1。
UserCF只有一个重要的参数 K K K,即为每个用户选出 K K K个和他兴趣相似度最高的用户,然后将这些用户感兴趣的、目标用户还没有过行为的物品推荐给目标用户。UserCF算法通过离线实验在MovieLens数据集上的评测结果如下:
推荐系统实践(项亮)学习笔记二:基于用户行为数据的基于邻域的协同过滤算法_第4张图片
从上表可以看出,随着 K K K的增大,基于用户的协同过滤算法在给目标用户推荐时参考的其他用户的数量增大,算法准确率和召回率先增大后基本保持平稳;随着 K K K的增大,推荐结果趋向于热门的物品,物品流行度增大,覆盖度降低。
在这里插入图片描述
random算法每次随机挑选10个用户没有产生过行为的物品推荐给当前用户,mostpopular算法则按照物品的流行度给用户推荐他没有产生过行为的物品中最热门的10个物品。作为非个性化推荐的两个算法,mostpopular算法的准确率和召回率远高于random,但覆盖度非常低,物品流行度很高;random算法的准确率和召回率很低,但覆盖度很高,流行度很低。
对比UserCF和mostpopular,usercf的准确率和召回率提高了接近一倍,覆盖率远高于mostpopular,流行度也低于mostpopular。在所有指标上优于mostpopular。

  • 用户兴趣相似度计算的改进
    在上述利用余弦相似度对两两用户计算兴趣相似度的时候,热门物品和冷门物品的权重是相同的。然而,相比热门物品,两个用户对冷门物品采取过相同的行为更能说明他们兴趣的相似度。因此,John S. Breese1998年在论文“empirical analysis of predictive algorithms for collaborative filtering”中,使用基于物品流行度的惩罚项限制了热门物品对于用户兴趣相似度计算过程的影响,提出了使用如下公式计算用户的兴趣相似度:
    推荐系统实践(项亮)学习笔记二:基于用户行为数据的基于邻域的协同过滤算法_第5张图片
    基于上述用户相似度公式的算法称为UserCF-IIF(UserCF-Inverse Item Frequence),实验表明UserCF-IIF在各项性能上略优于UserCF,说明在计算用户兴趣相似度时考虑物品的流行度可以提升推荐结果的质量。
    在这里插入图片描述

基于物品的协同过滤算法

  • 基础算法
    基于用户协同过滤算法的缺点:
    (1)随用户数目的增多,用户兴趣相似度矩阵的计算时间复杂度和空间复杂度的增长与用户数近似于平方关系
    (2)基于用户的协同过滤算法很难对推荐结果作出解释
    由于上述UserCF存在的缺点,2003年亚马逊在论文“Amazon.com recommendations: item-to-item collaborative filtering”中提出了基于物品的协同过滤算法。基于物品的协同过滤算法(ItemCF)给用户推荐那些和他们之前喜欢的物品相似的物品,不过,ItemCF算法并不是利用物品的内容属性计算物品之间的相似度(利用物品内容属性计算物品相似度的推荐算法称为基于内容的推荐),而是通过分析用户的行为记录计算物品之间的相似度
    基于物品的协同过滤算法主要分为两步:
    (1)根据用户的行为记录计算物品之间的相似度
    (2)根据物品的相似度和用户的历史行为给用户生成推荐列表
    我们用下式计算物品 i i i和物品 j j j的相似度:
    在这里插入图片描述
    这里 N ( I ) N(I) N(I) N ( j ) N(j) N(j)分别表示喜欢物品 i i i和物品 j j j的用户数,如果两个物品共同被很多用户喜欢,那么这两个物品的相似度会比较高。
    和UserCF算法类似,用ItemCF算法计算物品相似度时,可以首先建立用户-物品倒排表(即对每个用户建立一个包含他喜欢的物品的列表),然后对于每个用户,将他物品列表中的物品两两在共现矩阵中加1。
    推荐系统实践(项亮)学习笔记二:基于用户行为数据的基于邻域的协同过滤算法_第6张图片
    上图是一个计算物品相似度的简单例子。最左边是输入的用户行为记录,每一行表示一个用户感兴趣的物品集合;对于每个物品集合,我们将里面的物品两两加1,得到一个矩阵;将这些矩阵相加得到最右边的C矩阵,其中 C [ i ] [ j ] C[i][j] C[i][j]记录了同时喜欢物品 i i i j j j的用户数;最后将C矩阵归一化可以得到物品之间的余弦相似度矩阵 W W W
    在得到物品相似度之后,ItemCF通过下式计算用户 u u u对一个物品 j j j的兴趣:
    在这里插入图片描述
    这里 N ( u ) N(u) N(u)是用户 u u u喜欢的物品的集合, S ( j , K ) S(j,K) S(j,K)是和物品 j j j相似度最高的 K K K个物品的集合, w i j w_{ij} wij是物品 j j j i i i的相似度, r u i r_{ui} rui是用户 u u u对物品 i i i的兴趣。注意这里的 r u i r_{ui} rui一般根据用户不同的行为类型会赋予不同的兴趣,如一般认为用户浏览网页和收藏网页的行为表明其对此网页的兴趣程度不同,用户对当前物品的评分不同表明用户的兴趣程度不同;当只有一种用户行为(如喜欢/不喜欢)时, r u i r_{ui} rui可以设置为常数1。
    ItemCF在MovieLens数据及上不同 K K K值下离线实验的评测结果如下:
    推荐系统实践(项亮)学习笔记二:基于用户行为数据的基于邻域的协同过滤算法_第7张图片
    选择合适的 K K K值非常重要;随着K值的增加,结果流行度会逐渐提高,但当K增加到一定程度,流行度就不再有明显变化;K增加会降低系统的覆盖率。
  • 用户活跃度对物品相似度的影响
    上面在计算物品相似度时会出现一个问题:由于热门物品可能会出现在大多数人的喜欢列表中,所以即使是两个关系不大的热门物品,计算出来的物品相似度也很高。因此,John S. Breese1998年在论文“empirical analysis of predictive algorithms for collaborative filtering”中提出了ItemCF-IUF(Inverse User Frequency),使用基于用户活跃度的惩罚项限制了活跃用户对于物品相似度计算过程的影响,提出了使用如下公式计算物品的相似度:
    推荐系统实践(项亮)学习笔记二:基于用户行为数据的基于邻域的协同过滤算法_第8张图片
    在这里插入图片描述
    实验表明ItemCF-IUF在准确率和召回率上和ItemCF相近,但ItemCF-IUF明显提高了推荐系统的覆盖率,降低了推荐系统的流行度,改进了ItemCF的综合性能。
  • 物品相似度的归一化
    Karypis在研究中(Evaluation of Item-based Top-N Recommendation Algorithms)发现将ItemCF的物品相似度矩阵按最大值归一化,可以提高推荐的准确率。
    推荐系统实践(项亮)学习笔记二:基于用户行为数据的基于邻域的协同过滤算法_第9张图片

UserCF和ItemCF的综合比较

推荐系统实践(项亮)学习笔记二:基于用户行为数据的基于邻域的协同过滤算法_第10张图片

你可能感兴趣的:(推荐系统,推荐系统,推荐系统实践,协同过滤,基于邻域)