《推荐系统实践》 第二章 利用用户行为数据 读书笔记

用户的行为不是随机的,而是蕴含着很多模式。
代码参考:qcymkxyc/RecSys/main/chapter2/

用户行为数据简介

日志:汇总原始日志生成描述用户行为的会话日志。
用户行为在个性化推荐系统一般分两种-显性反馈和隐性反馈行为。显性反馈行为包括用户明确表示对物品喜好的行为。隐性反馈行为指的是哪些不能明确反应用户喜好的行为。最具代表性的隐性反馈就是页面浏览行为。
在这里插入图片描述
在这里插入图片描述

互联网用户行为有很多种,比如浏览网页,购买商品,评论,评分等。下图给出一种表示方式,将一个用户行为表示为6部分,即产生行为的用户和行为的对象、行为的种类、产生行为的上下文、行为的内容和权重。
在这里插入图片描述

比较有代表性的数据集:
在这里插入图片描述
在这里插入图片描述

用户行为分析

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

长尾分布:
在这里插入图片描述

长尾分布其实很早就被统计学家注意到了。1932年,哈佛大学的语言学家Zipf在研究英文单词的词频时发现,如果将单词出现的频率按照由高到低排列,则每个单词出现的频率和它在热门排行榜中排名的常数次幂成反比。这个分布称为Zipf定律。这个现象表明,在英文中大部分词的词频其实很低,只有很少的词被经常使用。

在这里插入图片描述
在这里插入图片描述

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

不同活跃度的用户喜欢的物品的流行度差别:新用户倾向浏览热门的物品,老用户会逐渐开始浏览冷门的物品。

仅仅基于用户行为数据设计的推荐算法一般称为协同过滤算法,学术界对协同过滤算法提出了很多方法,比如基于领域的方法、隐语义模型、基于图的随机游走算法等。最著名的是基于领域的方法,主要包括:

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

下面几节将首先介绍上面两种算法,然后再简单介绍隐语义模型和基于图的模型。

实验设计和算法评测

数据集

采用GroupLens提供的MoviewsLens数据集介绍和评测的各种算法。本章着重研究隐反馈数据集中的topN推荐问题,因此忽略了数据集中的评分记录,TopN推荐的任务时预测用户会不会对某部电影评分,而不是预测用户在准备对某部电影评分内的前提下给电影评多少分

实验设计

在这里插入图片描述

评测指标

在这里插入图片描述

在这里插入图片描述

召回率描述有多少比例的用户-物品评分记录包含在最终的推荐列表中,而准确率描述最终的推荐列表中有多少比例是发生过的用户-物品评分记录。

在这里插入图片描述

除了评测推荐算法的精度,本章还计算了算法的覆盖率,覆盖率反映了推荐算法发掘长尾的能力,覆盖率越高,说明推荐算法越能够将长尾中的物品推荐给用户。这里,我们采用最简单的覆盖率定义:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

基于领域的推荐算法
基于用户的协同过滤出算法

1992那年被提出,并应用于邮件过滤系统,1994年被GroupLens用于新闻过滤。

1.基础算法

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

在这里插入图片描述
相似度伪代码

 def UserSimilarity(train):
    W = dict()
    for u in train.keys():
	    for v in train.keys():
	        if u == v:
	            continue
	        W[u][v] = len(train[u] & train[v])
	        W[u][v] /= math.sqrt(len(train[u]) * len(train[v]) * 1.0)
return W

在这里插入图片描述

def UserSimilarity(train):
    # build inverse table for item_users
    item_users = dict()
    for u, items in train.items():
        for i in items.keys():
            if i not in item_users:
                item_users[i] = set()
            item_users[i].add(u)

    #calculate co-rated items between users
    C = dict()
    N = dict()
    for i, users in item_users.items():
        for u in users:
            N[u] += 1
            for v in users:
                if u == v:
                    continue
        C[u][v] += 1

    #calculate finial similarity matrix W
    W = dict()
    for u, related_users in C.items():
        for v, cuv in related_users.items():
            W[u][v] = cuv / math.sqrt(N[u] * N[v])
   return W

在这里插入图片描述
在这里插入图片描述
得到用户之间的兴趣相似度后,UserCF算法会给用户推荐和他兴趣最相似的K个用户喜欢的物品。如下的公式度量了UserCF算法中用户u对物品i的感兴趣程度:

在这里插入图片描述

def Recommend(user, train, W):
    rank = dict()
    interacted_items = train[user]
    for v, wuv in sorted(W[u].items, key=itemgetter(1), \
        reverse=True)[0:K]:
        for i, rvi in train[v].items:
            if i in interacted_items:
                #we should filter items user interacted before
                continue
            rank[i] += wuv * rvi
    return rank

在这里插入图片描述

下表通过MovieLens数据集上的离线实验来评测基础算法的性能。UserCF只有一个重要的参数K,即为每个用户选出K个和他兴趣最相似的用户,然后推荐那K个用户感兴趣的物品。因此离线实验测量了不同K值下UserCF算法的性能指标。

在这里插入图片描述在这里插入图片描述

在这里插入图片描述

2.用户相似度计算的改进

改进余弦相似度公司提高UserCF推荐性能
在这里插入图片描述
User-IIF算法
在这里插入图片描述
在这里插入图片描述

3.实际在线系统使用UserCF的例子

相比后面要讨论的基于物品的协同过滤算法(ItemCF), UserCF在目前的实际应用中使用并不多。其中最著名的使用者是Digg,它在2008年对推荐系统进行了新的尝试(参见Digg的官方博客http://about.digg.com/blog/digg-recommendation-engine-updates,关于Digg的推荐算法的详细设计参见http://vimeo.com/1242909?pg=embed&sec=1242909处的访谈)。Digg使用推荐系统的原因也是信息过载,它的研究人员经过统计发现,每天大概会有15 000篇新的文章,而每个用户的精力是有限的,而且兴趣差别很大。因此Digg觉得应该通过推荐系统帮用户从这么多篇文章中找到真正令他们感兴趣的内容,同时使每篇文章都有机会被展示给用户。

Digg的推荐系统设计思路如下。用户在Digg中主要通过“顶”和“踩”(如2-8所示,最左侧的两个手形按钮就是“顶”和“踩”的按钮)两种行为表达自己对文章的看法。当用户顶了一篇文章,Digg就认为该用户对这篇文章有兴趣,而且愿意把这篇文章推荐给其他用户。然后,Digg找到所有在该用户顶文章之前也顶了这一篇文章的其他用户,然后给他推荐那些人最近顶的其他文章。从这里的简单描述可以看到,Digg使用的是UserCF算法的简化版本。

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

item-based collaborative filtering算法是目前业界应用最多的算法。

1.基础算法

基于用户的协同过滤算法在一些网站(如Digg )中得到了应用,但该算法有一些缺点。

  • 随着网站的用户数目越来越大,计算用户兴趣相似度矩阵将越来越困难,其运算时间复杂度和空间复杂度的增长和用户数的增长近似于平方关系。

  • 基于用户的协同过滤很难对推荐结果作出解释。

因此,著名的电子商务公司亚马逊提出了另一个算法—基于物品的协同过滤算法。

基于物品的协同过滤算法(简称ItemCF )给用户推荐那些和他们之前喜欢的物品相似的物品。

比如,该算法会因为你购买过《数据挖掘导论》而给你推荐《机器学习》。不过,ItemCF算法并不利用物品的内容属性计算物品之间的相似度,它主要通过分析用户的行为记录计算物品之间的相似度。该算法认为,物品A和物品B具有很大的相似度是因为喜欢物品A的用户大都也喜欢物品B。

基于物品的协同过滤算法主要分为两步:

  1. 计算物品之间的相似度。
  2. 根据物品的相似度和用户的历史行为给用户生成推荐列表。

喜欢物品i的用户中有多少比例的用户也喜欢物品j,可以用下面的公式定义物品的相似度:
在这里插入图片描述从上面的定义可以看到,在协同过滤中两个物品产生相似度是因为它们共同被很多用户喜欢,也就是说每个用户都可以通过他们的历史兴趣列表给物品“贡献”相似度。这里面蕴涵着一个假设,就是每个用户的兴趣都局限在某几个方面,因此如果两个物品属于一个用户的兴趣列表,那么这两个物品可能就属于有限的几个领域,而如果两个物品属于很多用户的兴趣列表,那么它们就可能属于同一个领域,因而有很大的相似度

和UserCF算法类似,用ItemCF算法计算物品相似度时也可以首先建立用户-物品倒排表(即对每个用户建立一个包含他喜欢的物品的列表),然后对于每个用户,将他物品列表中的物品两两在共现矩阵C中加1。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

在这里插入图片描述
在这里插入图片描述

ItemCF-IUF算法:
在这里插入图片描述
在这里插入图片描述

3.物品相似度的归一化

在这里插入图片描述
那么,对于两个不同的类,什么样的类其类内物品之间的相似度高,什么样的类其类内物品相似度低呢?**一般来说,热门的类其类内物品相似度一般比较大。如果不进行归一化,就会推荐比较热门的类里面的物品,而这些物品也是比较热门的。**因此,推荐的覆盖率就比较低。相反,如果进行相似度的归一化,则可以提高推荐系统的覆盖率。

在这里插入图片描述

UserCF和ItemCF的综合比较

UserCF是推荐系统领域较为古老的算法,1992年就已经在电子邮件的个性化推荐系统Tapestry中得到了应用,1994年被GroupLens①用来实现新闻的个性化推荐,后来被著名的文章分享网站Digg用来给用户推荐个性化的网络文章。ItemCF则是相对比较新的算法,在著名的电子商务网站亚马逊和DVD租赁网站Netflix中得到了广泛应用。

首先回顾一下UserCF算法和ItemCF算法的推荐原理。UserCF给用户推荐那些和他有共同兴趣爱好的用户喜欢的物品,而ItemCF给用户推荐那些和他之前喜欢的物品类似的物品。从这个算法的原理可以看到,UserCF的推荐结果着重于反映和用户兴趣相似的小群体的热点,而ItemCF的推荐结果着重于维系用户的历史兴趣。换句话说,UserCF的推荐更社会化,反映了用户所在的小型兴趣群体中物品的热门程度,而ItemCF的推荐更加个性化,反映了用户自己的兴趣传承。
在这里插入图片描述
同时,从技术上考虑,**UserCF需要维护一个用户相似度的矩阵,而ItemCF需要维护一个物品相似度矩阵。**从存储的角度说,如果用户很多,那么维护用户兴趣相似度矩阵需要很大的空间,同理,如果物品很多,那么维护物品相似度矩阵代价较大。

UserCF和ItemCF优缺点对比

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
首先要指出的是,离线实验的性能在选择推荐算法时并不起决定作用。首先应该满足严品的需求,比如如果需要提供推荐解释,那么可能得选择ItemCF算法。其次,需要看实现代价,比如若用户太多,很难计算用户相似度矩阵,这个时候可能不得不抛弃UserCF算法。最后,离线指标和点击率等在线指标不一定成正比。而且,这里对比的是最原始的UserCF和ItemCF算法,这两种算法经过优化后,做中得到的离线性能是近视的。

为什么ItemCF算法覆盖率和新颖度都不高

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

隐语义模型

LFM(latent factor model)最早在文本挖掘领域被提出用于找到文本的隐含语义。相关的名词有LSI、pLSA、LDA和Topic Model。本节将对隐含语义模型在Top-N推荐中的应用进行详细介绍,并通过实际的数据评测该模型。

基础算法

核心思想是通过隐含特征联系用户兴趣和物品。
比如给图书分类会遇到如下问题:
在这里插入图片描述
在这里插入图片描述

采用基于用户行为统计的自动聚类,可以解决以上问题
在这里插入图片描述
隐含语义分析技术从诞生到今天产生了很多著名的模型和方法,其中和该技术相关且耳熟能详的名词有pLSA、LDA、隐含类别模型(latent class model)、隐含主题模型(latent topic model)、矩阵分解(matrix factorization )。这些技术和方法在本质上是相通的,其中很多方法都可以用于个性化推荐系统。本章将以LFM(latent factor model)隐语义模型为例介绍隐含语义分析技术在推荐系统中的应用。

在这里插入图片描述
对最优化理论或者机器学习有所了解的读者,可能对如何计算这两个参数都比较清楚。这两个参数是从数据集中计算出来的。要计算这两个参数,需要一个训练集,对于每个用户u,训练集里都包含了用户u喜欢的物品和不感兴趣的物品,通过学习这个数据集,就可以获得上面的模型参数。

推荐系统的用户行为分为显性反馈和隐性反馈。LFM在显性反馈数据(也就是评分数据)上解决评分预测问题并达到了很好的精度。不过本章主要讨论的是隐性反馈数据集,这种数据集的特点是只有正样本(用户喜欢什么物品),而没有负样本(用户对什么物品不感兴趣)

那么,在隐性反馈数据集上应用LFM解决TopN推荐的第一个关键问题就是如何给每个用户生成负样本。

对于这个问题,Rong Pan在文章中进行了深入探讨。他对比了如下几种方法。

  • 对于一个用户,用他所有没有过行为的物品作为负样本。
  • 对于一个用户,从他没有过行为的物品中均匀采样出一些物品作为负样本。
  • 对于一个用户,从他没有过行为的物品中采样出一些物品作为负样本,但采样时,保证每个用户的正负样本数目相当。
  • 对于一个用户,从他没有过行为的物品中采样出一些物品作为负样本,但采样时,偏重采样不热门的物品。

对于第一种方法,它的明显缺点是负样本太多,正负样本数目相差悬殊,因而计算复杂度很高,最终结果的精度也很差。对于另外3种方法,Rong Pan在文章中表示第三种好于第二种,而第二种好于第四种。

后来,通过2011年的KDD Cup的Yahoo! Music推荐系统比赛,我们发现对负样本采样时应该遵循以下原则。

  • 对每个用户,要保证正负样本的平衡(数目相似)。
  • 对每个用户采样负样本时,要选取那些很热门,而用户却没有行为的物品。

一般认为,很热门而用户却没有行为更加代表用户对这个物品不感兴趣。因为对于冷门的物品,用户可能是压根没在网站中发现这个物品,所以谈不上是否感兴趣。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

其次,我们通过实验对比了LFM在TopN推荐中的性能。在LFM中,重要的参数有4个:

  • 隐特征的个数F;
  • 学习速率alpha;
  • 正则化参数lambda;
  • 负样本/正样本比例ratio。

通过实验发现,ratio参数对LFM的性能影响最大。因此,固定F=100、alpha=0.02.lambda=0.01,然后研究负样本/正样本比例ratio对推荐结果性能的影响。

在这里插入图片描述

基于LFM实际系统的例子

雅虎首页个性化设计方案

但是,LFM模型在实际使用中有一个困难,那就是它很难实现实时的推荐。**经典的LFM模型每次训练时都需要扫描所有的用户行为记录,这样才能计算出用户隐类向量(pa)和物品隐类向量(qt)。而且LFM的训练需要在用户行为记录上反复迭代才能获得比较好的性能。因此,LFM的每次训练都很耗时,一般在实际应用中只能每天训练一次,并且计算出所有用户的推荐结果。从而LFM模型不能因为用户行为的变化实时地调整推荐结果来满足用户最近的行为。**在新闻推荐中,冷启动问题非常明显。每天都会有大量新的新闻。这些新闻会在很短的时间内获得很多人的关注,但也会在很短的时间内失去用户的关注。因此,它们的生命周期很短,而推荐算法需要在它们短暂的生命周期内就将其推荐给对它们感兴趣的用户。所以,实时性在雅虎的首页个性化推荐系统中非常重要。为了解决传统LFM不能实时化,而产品需要实时性的矛盾,雅虎的研究人员`提出了一个解决方案。

在这里插入图片描述

LFM和基于领域的方法的比较
  • 理论基础 LFM具有比较好的理论基础,它是一种学习方法,通过优化一个设定的指标建立最优的模型。基于邻域的方法更多的是一种基于统计的方法,并没有学习过程。
  • 离线计算的空间复杂度 基于邻域的方法需要维护一张离线的相关表。在离线计算相关表的过程中,如果用户/物品数很多,将会占据很大的内存。假设有M个用户和N个物品,在计算相关表的过程中,我们可能会获得一张比较稠密的临时相关表(尽管最终我们对每个物品只保留K个最相关的物品,但在中间计算过程中稠密的相关表是不可避免的),那么假设是用户相关表,则需要O(MM)的空间,而对于物品相关表,则需要O(NN)的空间。而LFM在建模过程中,如果是F个隐类,那么它需要的存储空间是O(F*(M+N)),这在M和N很大时可以很好地节省离线计算的内存。在Netflix Prize中,因为用户数很庞大( 40多万),很少有人使用UserCF算法(据说需要30 GB左右的内存),而LFM由于大量节省了训练过程中的内存(只需要4 GB),从而成为Netflix Prize中最流行的算法。
  • 离线计算的时间复杂度 假设有M个用户、N个物品、K条用户对物品的行为记录。那么,UserCF计算用户相关表的时间复杂度是O(N*(KIN)2),而ItemCF计算物品相关表的时间复杂度是O(M*(K/My2)。而对于LFM,如果用F个隐类,迭代S次,那么它的计算复杂度是O(K * F S)。那么,如果K/N > FS,则代表UserCF的时间复杂度低于LFM,如果K/M>F*S,则说明ItemCF的时间复杂度低于LFM。在一般情况下,LFM的时间复杂度要稍微高于UserCF和ItemCF,这主要是因为该算法需要多次迭代。但总体上,这两种算法在时间复杂度上没有质的差别
  • 在线实时推荐 UserCF和ItemCF在线服务算法需要将相关表缓存在内存中,然后可以在线进行实时的预测。以ItemCF算法为例,一旦用户喜欢了新的物品,就可以通过查询内存中的相关表将和该物品相似的其他物品推荐给用户。因此,一旦用户有了新的行为,而且该行为被实时地记录到后台的数据库系统中,他的推荐列表就会发生变化。而从LFM的预测公式可以看到,LFM在给用户生成推荐列表时,需要计算用户对所有物品的兴趣权重,然后排名,返回权重最大的N个物品。那么,在物品数很多时,这一过程的时间复杂度非常高,可达O(MNF)。因此,LFM不太适合用于物品数非常庞大的系统,如果要用,我们也需要一个比较快的算法给用户先计算一个比较小的候选列表,然后再用LFM重新排名。另一方面,LFM在生成一个用户推荐列表时速度太慢,因此不能在线实时计算,而需要离线将所有用户的推荐结果事先计算好存储在数据库中。因此,LFM不能进行在线实时推荐,也就是说,当用户有了新的行为后,他的推荐列表不会发生变化。
  • 推荐解释 ItemCF算法支持很好的推荐解释,它可以利用用户的历史行为解释推荐结果。但LFM无法提供这样的解释,它计算出的隐类虽然在语义上确实代表了一类兴趣和物品,却很难用自然语言描述并生成解释展现给用户。

基于图的模型

本节重点讨论如何将用户行为用图表示,并利用图的算法给用户进行个性化推荐

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

在这里插入图片描述
在这里插入图片描述

基于图的推荐算法

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

度量图中两个顶点之间的相关性主要取决下面三个因素

  • 两个顶点之间的路径数;
  • 两个顶点之间路径的长度;
  • 两个顶点之间的路径经过的顶点。

而相关性高的一对顶点一般具有如下特征:

  • 两个顶点之间有很多路径相连;
  • 连接两个顶点之间的路径长度都比较短;
  • 连接两个顶点之间的路径不会经过出度比较大的顶点。
    在这里插入图片描述

研究人员设计了很多计算图中顶点相关的方法,本节将介绍一种基于随机游走的PersonalRank算法。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值