推荐系统实践笔记——第二章_利用用户行为数据

目录

一、用户行为数据简介

二、用户行为分析

三、实验设计

四、基于邻域的算法

五、隐语义模型(参考LiuQQu的博客,版权声明:本文为CSDN博主「LiuQQu」的原创文章)

六、基于图的模型(参考LiuQQu的博客,版权声明:本文为CSDN博主「LiuQQu」的原创文章)


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

一、用户行为数据简介

用户行为在推荐系统中一般分两种,一种是显性反馈行为,一种是隐性反馈行为。显性反馈行为包括用户明确对物品表示喜好的行为,隐性反馈行为包括那些不能明确反应用户喜好的行为,最具代表性的隐性反馈行为就是页面浏览行为。

二、用户行为分析

互联网数据分布都满足长尾分布,在英文单词的词频研究中发现,将单词的出现频率按照由高到低排列,则每个单词出现的频率和它在热门排行榜中排名的常数次幂成反比,很多研究人员发现在行为数据中也蕴含着这种规律。

令fu(k)为对k个物品产生过行为的用户数,令fi(k)为被k个用户产生过行为的物品数。那么,fu(k)和fi(k)都满足长尾分布。

                                                                                  

一般认为,新用户倾向于浏览热门物品,因为他们对网站不熟悉,只能点击首页热门物品,而老用户逐渐开始浏览冷门物品,下图表明用户越活跃,越倾向于浏览冷门的物品。

仅仅基于用户行为数据设计的推荐算法一般称为协同过滤算法,包括基于邻域的方法,隐语义模型,基于图的随机游走算法。其中基于邻域的算法包含:

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

具体算法原理及代码见算法原理及代码

三、实验设计

1.数据集

改文章采用的数据集是GroupLens提供的MovieLens数据集(数据集地址),本章选择的是中等大小的数据集,该数据集包括6000多用户对4000多部电影的100万条评分。

2.实验设计

协同过滤算法的离线实验一般如下设计。

首先,将用户的数据集按照均匀分布随机分成M份(本章M=8),挑选一份作为测试集,将剩下的M-1份作为训练集。

然后,在训练集上建立用户兴趣模型,并在测试集上进行测试,统计出相应的评测指标。

为了保证评测指标并不是过拟合的结果,需要进行M次实验,并且每次都使用不同的测试集,然后将M次实验测出的评测指标的平均值作为最终的评测指标。

3.评测指标

对用户u推荐N个物品(记为R(u)),令用户u在测试集上喜欢的物品集合为T(u),然后可以通过准确率/召回率评测推荐算法的精度:

                                                          

                                                         

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

覆盖率反映了推荐算法发掘长尾的能力,覆盖率越高,说明推荐算法越能够将长尾中的物品推荐给用户。

                                              

最后我们还需要评测推荐的新颖度,这里推荐列表中物品的平均流行度度量推荐结果的新颖度。如果推荐出的物品都很热门,说明新颖度较低,否则说明推荐结果比较新颖。

def Popularity(train, test, N):
    item_popularity = dict()
    for user, items in train.items():
        for item in items.keys()
            if item not in item_popularity:
                item_popularity[item] = 0
            item_popularity[item] += 1
    ret = 0
    n = 0
    for user in train.keys():
        rank = GetRecommendation(user, N)
        for item, pui in rank:
            ret += math.log(1 + item_popularity[item])
            n += 1
    ret /= n * 1.0
    return ret

四、基于邻域的算法

UserCF和IemCF的综合比较。

 

五、隐语义模型(参考LiuQQu的博客,版权声明:本文为CSDN博主「LiuQQu」的原创文章)

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

对于某个用户,首先得到他的兴趣分类,然后从分类中挑选他可能喜欢的物品。

总结一下,这个基于兴趣分类的方法大概需要解决3个问题。

(1)如何给物品进行分类?

(2)如何确定用户对哪些类的物品感兴趣,以及感兴趣的程度?

(3)对于一个给定的类,选择哪些属于这个类的物品推荐给用户,以及如何确定这些物品在一个类中的权重?

对于第一个问题:如何给物品进行分类?

简单解决方案是找编辑给物品分类,编辑给出的分类仍然具有以下缺点:

a、编辑的意见不能代表各种用户的意见。

b、编辑很难控制分类的粒度。

c、编辑很难给一个物品多个分类。

d、编辑很难给出多维度的分类。

e、编辑很难决定一个物品在某一个分类中的权重。

研究人员提出:为什么我们不从数据出发,自动地找到那些类,然后进行个性化推荐?于是,隐含语义分析技术(latent variable analysis)出现了。隐含语义分析技术因为采取基于用户行为统计的自动聚类,较好地解决了上面提出的5个问题。

a、编辑的意见不能代表各种用户的意见,但隐含语义分析技术的分类来自对用户行为的统计,代表了用户对物品分类的看法。隐含语义分析技术和ItemCF在物品分类方面的思想类似,如果两个物品被很多用户同时喜欢,那么这两个物品就很有可能属于同一个类。
b、编辑很难控制分类的粒度,但隐含语义分析技术允许我们指定最终有多少个分类,这个数字越大,分类的粒度就会越细,反正分类粒度就越粗。
c、编辑很难给一个物品多个分类,但隐含语义分析技术会计算出物品属于每个类的权重,因此每个物品都不是硬性地被分到某一个类中。
d、编辑很难给出多维度的分类,但隐含语义分析技术给出的每个分类都不是同一个维度的,它是基于用户的共同兴趣计算出来的,如果用户的共同兴趣是某一个维度,那么LFM给出的类也是相同的维度。
e、编辑很难决定一个物品在某一个分类中的权重,但隐含语义分析技术可以通过统计用户行为决定物品在每个类中的权重,如果喜欢某个类的用户都会喜欢某个物品,那么这个物品在这个类中的权重就可能比较高。

相关方法:pLSA、LDA、隐含类别模型(latent class model)、隐含主题模型(latent topic model)、矩阵分解(matrix factorization

LFM通过如下公式计算用户u对物品i的兴趣:

这个公式中pu,k 和qi,k 是模型的参数,其中pu,k 度量了用户u的兴趣和第k个隐类的关系,而qi,k 度量了第k个隐类和物品i之间的关系。

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

对负样本采样时应该遵循以下原则。

(1)对每个用户,要保证正负样本的平衡(数目相似)。

(2)对每个用户采样负样本时,要选取那些很热门,而用户却没有行为的物品。

很热门而用户却没有行为更加代表用户对这个物品不感兴趣。因为对于冷门的物品,用户可能是压根没在网站中发现这个物品,所以谈不上是否感兴趣。
隐语义模型和基于领域的方法的比较

六、基于图的模型(参考LiuQQu的博客,版权声明:本文为CSDN博主「LiuQQu」的原创文章)

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

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

(1)两个顶点之间的路径数;

(2)两个顶点之间路径的长度;

(3)两个顶点之间的路径经过的顶点。

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

(1)两个顶点之间有很多路径相连;

(2)连接两个顶点之间的路径长度都比较短;

(3)连接两个顶点之间的路径不会经过出度比较大的顶点。

基于随机游走的PersonalRank算法

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

                                    

虽然PersonalRank算法可以通过随机游走进行比较好的理论解释,但该算法在时间复杂度上有明显的缺点。因为在为每个用户进行推荐时,都需要在整个用户物品二分图上进行迭代,直到整个图上的每个顶点的PR值收敛。这一过程的时间复杂度非常高,不仅无法在线提供实时推荐,甚至离线生成推荐结果也很耗时。

解决PersonalRank时间复杂度很高的方案:(1)减少迭代次数,在收敛之前就停止。这样会影响最终的精度,但一般来说影响不会特别大。(2)从矩阵论出发,重新设计算法。
 

 

发布了16 篇原创文章 · 获赞 1 · 访问量 7902
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览