推荐系统实践总结

本文的思维导图如下:

1、什么是推荐系统

在这个时代,无论是信息消费者还是信息生产者都遇到了很大的挑战:作为信息消费者,如何从大量信息中找到自己感兴趣的信息是一件非常困难的事情;作为信息生产者, 如何让自己生产的信息脱颖而出,受到广大用户的关注,也是一件非常困难的事情。推荐系统就是解决这一矛盾的重要工具。推荐系统的任务就是联系用户和信息,一方面帮助用户发现对自己有价值的信息,另一方面让信息能够展现在对它感兴趣的用户面前,从而实现信息消费者和信息 生产者的双赢。和搜索引擎不同的是,推荐系统不需要用户提供明确的需求,而是通过分析用户的历史行为给用 户的兴趣建模,从而主动给用户推荐能够满足他们兴趣和需求的信息。

个性化推荐的成功应用需要两个条件。第一是存在信息过载,因为如果用户可以很容易地从所有物品中找到喜欢的物品,就不需要个性化推荐了。第二是用户大部分时候没有特别明确的需求,因为用户如果有明确的需求,可以直接通过搜索引擎找到感兴趣的物品。

一个完整的推荐系统一般存在3个参与方:用户、物品提供者和提供推荐系统的网站。以图书推荐为例, 首先,推荐系统需要满足用户的需求,给用户推荐那些令他们感兴趣的图书。其次,推荐系统要让各出版社的书都能够被推荐给对其感兴趣的用户,而不是只推荐几个大型出版社的书。最后, 好的推荐系统设计,能够让推荐系统本身收集到高质量的用户反馈,不断完善推荐的质量,增加 用户和网站的交互,提高网站的收入。因此在评测一个推荐算法时,需要同时考虑三方的利益, 一个好的推荐系统是能够令三方共赢的系统。

好的推荐系统不仅仅能够准确预测用户的行为,而且能够扩展用户的视野,帮助用户发现那些他们可能会感兴趣,但却不那么容易发现的东西。同时,推荐系统还要能够帮助商家将 那些被埋没在长尾中的好商品介绍给可能会对它们感兴趣的用户。

2、推荐系统实验方法

推荐系统中,主要有3种评测推荐效果的实验方法,即离线实验(offline experiment)、用户调查(user study)和在线实验(online experiment)。

2.1 离线实验

离线实验的方法一般由如下几个步骤构成:
(1) 通过日志系统获得用户行为数据,并按照一定格式生成一个标准的数据集;
(2) 将数据集按照一定的规则分成训练集和测试集;
(3) 在训练集上训练用户兴趣模型,在测试集上进行预测;
(4) 通过事先定义的离线指标评测算法在测试集上的预测结果。

从上面的步骤可以看到,推荐系统的离线实验都是在数据集上完成的,也就是说它不需要一个实际的系统来供它实验,而只要有一个从实际系统日志中提取的数据集即可。这种实验方法的 好处是不需要真实用户参与,可以直接快速地计算出来,从而方便、快速地测试大量不同的算法。它的主要缺点是无法获得很多商业上关注的指标,如点击率、转化率等,而找到和商业指标非常相关的离线指标也是很困难的事情。

2.2 用户调查

用户调查是推荐系统评测的一个重要工具,很多离线时没有办法评测的与用户主观感受有关的指标都可以通过用户调查获得。在用户调查中,有一些需要注意的事项:
(1)成本控制:用户调查成本很高,需要用户花大量 时间完成一个个任务,并回答相关的问题。有些时候,还需要花钱雇用测试用户。因此,大多 数情况下很难进行大规模的用户调查,而对于参加人数较少的用户调查,得出的很多结论往往 没有统计意义。因此,我们在做用户调查时,一方面要控制成本,另一方面又要保证结果的统计.
意义。
(2)双盲实验:即不要让实验人员和用户事先知道测试的目标,以免用户的回答和实验人员的测试受主观成分的影响。
(3)相同分布:测试用户需要尽量保证测试用户的分布和真实用户的分布相同,比如男女各半,以及年龄、活跃度的分布都和真实用户分布尽量相同。

用户调查的优缺点也很明显。它的优点是可以获得很多体现用户主观感受的指标,相对在线实验风险很低,出现错误后很容易弥补。缺点是招募测试用户代价较大,很难组织大规模的测试 用户,因此会使测试结果的统计意义不足。此外,在很多时候设计双盲实验非常困难,而且用户 在测试环境下的行为和真实环境下的行为可能有所不同,因而在测试环境下收集的测试指标可能在真实环境下无法重现。

2.3 在线实验

在完成离线实验和必要的用户调查后,可以将推荐系统上线做AB测试,将它和旧的算法进行比较。
AB测试是一种很常用的在线评测算法的实验方法。它通过一定的规则将用户随机分成几组,并对不同组用户采取不同的算法,然后通过统计不同组用户的各种不同的评测指标比较不同算法的好坏。
AB测试的优点是可以公平获得不同算法实际在线时的性能指标,包括商业上关注的指标。 AB测试的缺点主要是周期比较长,必须进行长期的实验才能得到可靠的结果。因此一般不会用 AB测试测试所有的算法,而只是用它测试那些在离线实验和用户调查中表现很好的算法。其次, 一个大型网站的AB测试系统的设计也是一项复杂的工程。

一般来说,一个新的推荐算法最终上线,需要完成上面所说的3个实验。
1)首先,需要通过离线实验证明它在很多离线指标上优于现有的算法。
2)然后,需要通过用户调查确定它的用户满意度不低于现有的算法。
3)最后,通过在线的AB测试确定它在我们关心的指标上。

3、评测指标

本节将介绍各种推荐系统的评测指标。这些评测指标可用于评价推荐系统各方面的性能。这 些指标有些可以定量计算,有些只能定性描述,有些可以通过离线实验计算,有些需要通过用户 调查获得,还有些只能在线评测。

3.1 用户满意度

用户作为推荐系统的重要参与者,其满意度是评测推荐系统的最重要指标。但是,用户满意度没有办法离线计算,只能通过用户调查或者在线实验获得。
在在线系统中,用户满意度主要通过一些对用户行为的统计得到。比如在电子商务网站中,用户如果购买了推荐的商品,就表示他们在一定程度上满意。因此,我们可以利用购买率度量用 户的满意度。此外,有些网站会通过设计一些用户反馈界面收集用户满意度。比如在视频网站中,都有对推荐结果满意或者不满意的反馈按钮,通过统计两种按钮的单击情况就可以度量系统的用户满意度。更一般的情况下,我们可以用点击率、用户停留时间和转化率等指标度量用户的满意度。

3.2 预测准确度

预测准确度度量一个推荐系统或者推荐算法预测用户行为的能力。这个指标是最重要的推荐系统离线评测指标。
在计算该指标时需要有一个离线的数据集,该数据集包含用户的历史行为记录。然后,将该数据集通过时间分成训练集和测试集。最后,通过在训练集上建立用户的行为和兴趣模型预测用户在测试集上的行为,并计算预测行为和测试集上实际行为的重合度作为预测准确度。
预测准确度指标有分为以下几种:

评分预测
预测用户对物品评分的行为称为评分预测,在评分预测中,预测准确度一般通过均方根误差RMSE 和 平均绝对误差MAE计算,对于测试集中的一个用户u和物品i,令rui是用户u对物品i的实际评分,而rˆui 是推荐算法给出的预测评分,那么RMSE的定义为:

MAE采用绝对值计算预测误差,它的定义为:

topN推荐
网站在提供推荐服务时,一般是给用户一个个性化的推荐列表,这种推荐叫做TopN推荐。TopN推荐的预测准确率一般通过准确率(precision)/召回率(recall)度量。
令R(u)是根据用户在训练集上的行为给用户作出的推荐列表,而T(u)是用户在测试集上的行为列表。那么,推荐结果的召回率定义为:

推荐结果的准确率定义为:

3.3 覆盖率

覆盖率(coverage)描述一个推荐系统对物品长尾的发掘能力。覆盖率有不同的定义方法,最简单的定义为推荐系统能够推荐出来的物品占总物品集合的比例。假设系统的用户集合为U,推荐系统给每个用户推荐一个长度为N的物品列表R(u)。那么推荐系统的覆盖率可以通过下面的公式计算:

此外,从上面的定义也可以看到,热门排行榜的推荐覆盖率是很低的,它只会 推荐那些热门的物品,这些物品在总物品中占的比例很小。一个好的推荐系统不仅需要有比较高的用户满意度,也要有较高的覆盖率。

但是上面的定义过于粗略。覆盖率为100%的系统可以有无数的物品流行度分布。为了更细致地描述推荐系统发掘长尾的能力,需要统计推荐列表中不同物品出现次数的分布。如果所有的 物品都出现在推荐列表中,且出现的次数差不多,那么推荐系统发掘长尾的能力就很好。因此, 可以通过研究物品在推荐列表中出现次数的分布描述推荐系统挖掘长尾的能力。如果这个分布比 较平,那么说明推荐系统的覆盖率较高,而如果这个分布较陡峭,说明推荐系统的覆盖率较低。 在信息论和经济学中有两个著名的指标可以用来定义覆盖率。第一个是信息熵:

第二个指标是基尼系数(Gini Index):

3.4 多样性

为了满足用户广泛的兴趣,推荐列表需要能够覆盖用户不同的兴 趣领域,即推荐结果需要具有多样性。多样性推荐列表的好处用一句俗话表述就是“不在一棵树 上吊死”。尽管用户的兴趣在较长的时间跨度中是一样的,但具体到用户访问推荐系统的某一刻, 其兴趣往往是单一的,那么如果推荐列表只能覆盖用户的一个兴趣点,而这个兴趣点不是用户这 个时刻的兴趣点,推荐列表就不会让用户满意。反之,如果推荐列表比较多样,覆盖了用户绝大 多数的兴趣点,那么就会增加用户找到感兴趣物品的概率。因此给用户的推荐列表也需要满足用户广泛的兴趣,即具有多样性。
多样性描述了推荐列表中物品两两之间的不相似性。因此,多样性和相似性是对应的。假设s(i, j) ∈[0,1] 定义了物品i和j之间的相似度,那么用户u的推荐列表R(u)的多样性定义如下:

而推荐系统的整体多样性可以定义为所有用户推荐列表多样性的平均值:

3.5 新颖性

新颖的推荐是指给用户推荐那些他们以前没有听说过的物品。在一个网站中实现新颖性的最简单办法是,把那些用户之前在网站中对其有过行为的物品从推荐列表中过滤掉。比如在一个视 频网站中,新颖的推荐不应该给用户推荐那些他们已经看过、打过分或者浏览过的视频。
评测新颖度的最简单方法是利用推荐结果的平均流行度,因为越不热门的物品越 可能让用户觉得新颖。因此,如果推荐结果中物品的平均热门程度较低,那么推荐结果就可能有比较高的新颖性。

3.6 惊喜度

惊喜度(serendipity)是最近这几年推荐系统领域最热门的话题。如果推荐结果和用户的历史兴趣不相似,但却让用户觉得满意,那么就可以说推荐结果的惊喜度很高,而推荐的新颖性仅仅取决于用户是否听说过这个推荐结果。提高推荐惊喜度需要提高推荐结果的用户满意度,同时降低推荐结果和用户历史兴趣的相似度。

3.7 信任度

度量推荐系统的信任度只能通过问卷调查的方式,询问用户是否信任推荐系统的推荐结果。
提高推荐系统的信任度主要有两种方法。首先需要增加推荐系统的透明度(transparency), 而增加推荐系统透明度的主要办法是提供推荐解释。只有让用户了解推荐系统的运行机制,让用 户认同推荐系统的运行机制,才会提高用户对推荐系统的信任度。其次是考虑用户的社交网络 信息,利用用户的好友信息给用户做推荐,并且用好友进行推荐解释。这是因为用户对他们的 好友一般都比较信任,因此如果推荐的商品是好友购买过的,那么他们对推荐结果就会相对比较信任。

3.8 实时性

在很多网站中,因为物品(新闻、微博等)具有很强的时效性,所以需要在物品还具有时效 性时就将它们推荐给用户。
推荐系统的实时性包括两个方面。首先,推荐系统需要实时地更新推荐列表来满足用户新的 行为变化。实时性的第二个方面是推荐系统需要能够将新加入系统的物品推荐给用户。这主要考验了推 荐系统处理物品冷启动的能力。

3.9 健壮性

健壮性(即robust,鲁棒 性)指标衡量了一个推荐系统抗击作弊的能力。算法健壮性的评测主要利用模拟攻击。首先,给定一个数据集和一个算法,可以用这个算法 给这个数据集中的用户生成推荐列表。然后,用常用的攻击方法向数据集中注入噪声数据,然后 利用算法在注入噪声后的数据集上再次给用户生成推荐列表。最后,通过比较攻击前后推荐列表 的相似度评测算法的健壮性。如果攻击后的推荐列表相对于攻击前没有发生大的变化,就说明算 法比较健壮。

3.10 商业目标

很多时候,网站评测推荐系统更加注重网站的商业目标是否达成,而商业目标和网站的盈利模式是息息相关的。

3.11 总结

本节提到了很多指标,其中有些指标可以离线计算,有些只能在线获得。下表对指标的获得做出了总结。

4、评测维度

上一节介绍了很多评测指标,但是在评测系统中还需要考虑评测维度,比如一个推荐算法, 虽然整体性能不好,但可能在某种情况下性能比较好,而增加评测维度的目的就是知道一个算法 在什么情况下性能最好。这样可以为融合不同推荐算法取得最好的整体性能带来参考。
一般来说,评测维度分为如下3种。
1)用户维度:主要包括用户的人口统计学信息、活跃度以及是不是新用户等。
2)物品维度:包括物品的属性信息、流行度、平均分以及是不是新加入的物品等。
3)时间维度:包括季节,是工作日还是周末,是白天还是晚上等。
如果能够在推荐系统评测报告中包含不同维度下的系统评测指标,就能帮我们全面地了解推 荐系统性能,找到一个看上去比较弱的算法的优势,发现一个看上去比较强的算法的缺点。

本篇的思维导图如下:

1、用户行为数据

用户行为数据在网站上最简单的存在形式就是日志,比如用户在电子商务网站中的网页浏览、购买、点击、评分和评论等活动。
用户行为在个性化推荐系统中一般分两种——显性反馈行为(explicit feedback)和隐性反馈 行为(implicit feedback)。显性反馈行为包括用户明确表示对物品喜好的行为。网站中收集显性反馈的主要方式就是评分和喜欢/不喜欢。隐性反馈行为指的是那些不能明确反应用户喜好 的行为。最具代表性的隐性反馈行为就是页面浏览行为。
按照反馈的明确性分,用户行为数据可以分为显性反馈和隐性反馈,但按照反馈的方向分, 又可以分为正反馈和负反馈。正反馈指用户的行为倾向于指用户喜欢该物品,而负反馈指用户的 行为倾向于指用户不喜欢该物品。在显性反馈中,很容易区分一个用户行为是正反馈还是负反馈, 而在隐性反馈行为中,就相对比较难以确定。

2、用户行为分析

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

2.1 用户活跃度和物品流行度

很多关于互联网数据的研究发现,互联网上的很多数据分布都满足一种称为Power Law3的分布,这个分布在互联网领域也称长尾分布

如果定义物品的流行度K为被K个用户产生过行为,而用户的活跃度K定义为对K个物品产生过行为,那么二者的分布大概如下图所示(横轴代表物品的流行度/用户的活跃度,纵轴代表物品数/用户数):

物品流行度长尾分布

用户活跃度长尾分布

可以看到,不管是物品的流行度还是用户的活跃度,都近似于长尾分布。

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

一般认为,新用户倾向于浏览热门的物品,因为他 们对网站还不熟悉,只能点击首页的热门物品,而老用户会逐渐开始浏览冷门的物品。如果用横坐标表示用户活跃度,纵坐标表示具有某个活跃度的所有用户评过分的物品的平均流行度。图中曲线呈明显下 降的趋势,这表明用户越活跃,越倾向于浏览冷门的物品。

仅仅基于用户行为数据设计的推荐算法一般称为协同过滤算法。学术界对协同过滤算法进行了深入研究,提出了很多方法,比如基于邻域的方法(neighborhood-based)、隐语义模型 (latent factor model)、基于图的随机游走算法(random walk on graph)等。在这些方法中, 最著名的、在业界得到最广泛应用的算法是基于邻域的方法,而基于邻域的方法主要包含下
面两种算法。
1、基于用户的协同过滤算法:这种算法给用户推荐和他兴趣相似的其他用户喜欢的物品。
2、 基于物品的协同过滤算法: 这种算法给用户推荐和他之前喜欢的物品相似的物品。

3、基于邻域的算法

基于邻域的算法是推荐系统中最基本的算法,该算法不仅在学术界得到了深入研究,而且在 业界得到了广泛应用。基于邻域的算法分为两大类,一类是基于用户的协同过滤算法,另一类是 基于物品的协同过滤算法。现在我们所说的协同过滤,基本上就就是指基于用户或者是基于物品的协同过滤算法,因此,我们可以说基于邻域的算法即是我们常说的协同过滤算法。

3.1 基于用户的协同过滤算法(UserCF)

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

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

这里,步骤1的关键是计算两个用户的兴趣相似度,协同过滤算法主要利用行为的相似度计算兴趣的相似度。给定用户u和用户v,令N(u)表示用户u曾经有过正反馈的物品集合,令N(v) 为用户v曾经有过正反馈的物品集合。那么我们可以通过以下两种方法计算用户的相似度:

基于Jaccard公式

基于余弦相似度

余弦相似度为什么是上面这种写法呢,因为这里,我们并不是用的用户对物品的评分,而是用的0-1表示,所以对两个集合做交集,相当于进行了点乘。如果我们的矩阵是用户对物品的评分,那么计算余弦相似度的时候可以利用用户的具体评分而不是0-1值。

如果简单的基于余弦相似度,显得过于粗糙,以图书为例,如果两个用户都曾经买过《新华字典》,这丝毫不能说明他们兴趣相似, 因为绝大多数中国人小时候都买过《新华字典》。但如果两个用户都买过《数据挖掘导论》,那可 以认为他们的兴趣比较相似,因为只有研究数据挖掘的人才会买这本书。换句话说,两个用户对冷门物品采取过同样的行为更能说明他们兴趣的相似度,因此,我们可以基于物品的流行度对热门物品进行一定的惩罚:

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

其中,S(u, K)包含和用户u兴趣最接近的K个用户,N(i)是对物品i有过行为的用户集合,wuv 是用户u和用户v的兴趣相似度,rvi代表用户v对物品i的兴趣.

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

UserCF在一些网站(如Digg)中得到了应用,但该算法有一些缺点。首先, 随着网站的用户数目越来越大,计算用户兴趣相似度矩阵将越来越困难,其运算时间复杂度和空间复杂度的增长和用户数的增长近似于平方关系。其次,基于用户的协同过滤很难对推荐结果作出解释。因此,著名的电子商务公司亚马逊提出了另一个算法——基于物品的协同过滤算法。
基于物品的协同过滤算法(简称ItemCF)给用户推荐那些和他们之前喜欢的物品相似的物品。 比如,该算法会因为你购买过《数据挖掘导论》而给你推荐《机器学习》。不过,ItemCF算法并不利用物品的内容属性计算物品之间的相似度,它主要通过分析用户的行为记录计算物品之间的相似度。该算法认为,物品A和物品B具有很大的相似度是因为喜欢物品A的用户大都也喜欢物品 B。

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

ItemCF的第一步是计算物品之间的相似度,在网站中,我们经常看到这么一句话:Customers Who Bought This Item Also Bought,那么从这句话的定义出发,我们可以用下面的公式定义物品相似度:

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

这里由于还是0-1的原因,我们的余弦相似度可以写成上面的形式。但是,是不是每个用户的贡献都相同呢? 假设有这么一个用户,他是开书店的,并且买了当当网上80%的书准备用来自己卖。那么, 他的购物车里包含当当网80%的书。假设当当网有100万本书,也就是说他买了80万本。从前面 对ItemCF的讨论可以看到,这意味着因为存在这么一个用户,有80万本书两两之间就产生了相似度。这个用户虽然活跃,但是买这些书并非都是出于自身的兴趣,而且这些书覆 盖了当当网图书的很多领域,所以这个用户对于他所购买书的两两相似度的贡献应该远远小于一个只买了十几本自己喜欢的书的文学青年。因此,我们要对这样的用户进行一定的惩罚,John S. Breese在论文1中提出了一个称为IUF(Inverse User Frequence),即用户活跃度对数的 倒数的参数,他也认为活跃用户对物品相似度的贡献应该小于不活跃的用户,他提出应该增加IUF参数来修正物品相似度的计算公式:

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

这里N(u)是用户喜欢的物品的集合,S(j,K)是和物品j最相似的K个物品的集合,wji是物品j和i 的相似度,rui是用户u对物品i的兴趣。

3.3 UserCF和ItemCF的比较

首先我们提出一个问题,为什么新闻网站一般使用UserCF,而图书、电商网站一般使用ItemCF呢?
首先回顾一下UserCF算法和ItemCF算法的推荐原理。UserCF给用户推荐那些和他有共同兴 趣爱好的用户喜欢的物品,而ItemCF给用户推荐那些和他之前喜欢的物品类似的物品。从这个算 法的原理可以看到,UserCF的推荐结果着重于反映和用户兴趣相似的小群体的热点,而ItemCF 的推荐结果着重于维系用户的历史兴趣。换句话说,UserCF的推荐更社会化,反映了用户所在的小型兴趣群体中物品的热门程度,而ItemCF的推荐更加个性化,反映了用户自己的兴趣传承。
在新闻网站中,用户的兴趣不是特别细化,绝大多数用户都喜欢看热门的新闻。个性化新闻推荐更加强调抓住 新闻热点,热门程度和时效性是个性化新闻推荐的重点,而个性化相对于这两点略显次要。因 此,UserCF可以给用户推荐和他有相似爱好的一群其他用户今天都在看的新闻,这样在抓住热 点和时效性的同时,保证了一定程度的个性化。同时,在新闻网站中,物品的更新速度远远快于新用户的加入速度,而且 对于新用户,完全可以给他推荐最热门的新闻,因此UserCF显然是利大于弊。

但是,在图书、电子商务和电影网站,比如亚马逊、豆瓣、Netflix中,ItemCF则能极大地发 挥优势。首先,在这些网站中,用户的兴趣是比较固定和持久的。一个技术人员可能都是在购买 技术方面的书,而且他们对书的热门程度并不是那么敏感,事实上越是资深的技术人员,他们看 的书就越可能不热门。此外,这些系统中的用户大都不太需要流行度来辅助他们判断一个物品的 好坏,而是可以通过自己熟悉领域的知识自己判断物品的质量。因此,这些网站中个性化推荐的 任务是帮助用户发现和他研究领域相关的物品。因此,ItemCF算法成为了这些网站的首选算法。 此外,这些网站的物品更新速度不会特别快,一天一次更新物品相似度矩阵对它们来说不会造成 太大的损失,是可以接受的。同时,从技术上考虑,UserCF需要维护一个用户相似度的矩阵,而ItemCF需要维护一个物品 相似度矩阵。从存储的角度说,如果用户很多,那么维护用户兴趣相似度矩阵需要很大的空间, 同理,如果物品很多,那么维护物品相似度矩阵代价较大。

下表是对二者的一个全面的比较:

4、隐语义模型

隐语义模型是最近几年推荐系统领域最为热门的研究话题,它的核心思想是通过隐含特征 (latent factor)联系用户兴趣和物品。
使用隐语义模型的基本思路是:对于某个用户,首先得到他的兴趣分类,然后从分类中挑选他可能喜欢的物品。那么这个方法大概需要解决三个问题:
1、 如何给物品进行分类?
2、 如何确定用户对哪些类的物品感兴趣,以及感兴趣的程度?
3、 对于一个给定的类,选择哪些属于这个类的物品推荐给用户,以及如何确定这些物品在一个类中的权重?

隐含语义分析技术从诞生到今天产生了很多著名的模型和方法,其中和该技术相关且耳熟能 详的名词有pLSA、LDA、隐含类别模型(latent class model)、隐含主题模型(latent topic model)、 矩阵分解(matrix factorization)。这些技术和方法在本质上是相通的,其中很多方法都可以用于 个性化推荐系统。我们将以LFM为例介绍隐含语义分析技术在推荐系统中的应用。
LFM通过如下公式计算用户u对物品i的兴趣:

这个公式中 pu,k 和 qi,k 是模型的参数,其中 pu,k 度量了用户u的兴趣和第k个隐类的关系,而 qi,k 度量了第k个隐类和物品i之间的关系。那么,下面的问题就是如何计算这两个参数。
对最优化理论或者机器学习有所了解的读者,可能对如何计算这两个参数都比较清楚。这两 个参数是从数据集中计算出来的。要计算这两个参数,需要一个训练集,对于每个用户u,训练 集里都包含了用户u喜欢的物品和不感兴趣的物品,通过学习这个数据集,就可以获得上面的模型参数。我们可以通过最小化下面的损失函数来得到最合适的p和q:

上面的式子中,后面的两项是为了防止过拟合的正则化项,求解上面的式子可以使用随机梯度下降来得到,这里就不再赘述。

LFM模型在实际使用中有一个困难,那就是它很难实现实时的推荐。经典的LFM模型 每次训练时都需要扫描所有的用户行为记录,这样才能计算出用户隐类向量(pu)和物品隐类向 量(qi)。而且LFM的训练需要在用户行为记录上反复迭代才能获得比较好的性能。

5、基于图的模型

用户行为很容易用二分图表示,因此很多图的算法都可以用到推荐系统中。
令G(V,E)表示用户物品二分图,其中V VU VI 由用户顶点集合VU 和物品顶点集合VI 组成。对于数据集中每一个二元组(u, i),图中都有一套对应的边 e(vu ,vi ) ,其中 vu∈VU 是用户u 对应的顶点∈vi VI 是物品i对应的顶点。下图是一个简单的用户物品二分图模型,其中圆形节 3 点代表用户,方形节点代表物品,圆形节点和方形节点之间的边代表用户对物品的行为。比如图 中用户节点A和物品节点a、b、d相连,说明用户A对物品a、b、d产生过行为。

在得到二分图之后,推荐的任务就变为度量用户顶点 vu和与vu没有边直接相连的物品节点在图上的相关性,相关性越高的物品在推荐列表中的权重就越高。图中两个顶点的相关性主要取决于下面三个因素:
1、 两个顶点之间的路径数;
2、 两个顶点之间路径的长度;
3、 两个顶点之间的路径经过的顶点。

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

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

本章的思维导图如下:

1、冷启动问题简介

如何在没有大量用户数据的情况下设计个性化推荐系统并且让用户对推荐结果满意从而愿意使用推荐系统, 就是冷启动的问题。冷启动问题主要分为三类:
1)用户冷启动:用户冷启动主要解决如何给新用户做个性化推荐的问题。
2)系统冷启动:系统冷启动主要解决如何在一个新开发的网站上(还没有用户,也没有用户行为,只有一些物品的信息)设计个性化推荐系统。
3)物品冷启动:物品冷启动主要解决如何将新的物品推荐给可能对它感兴趣的用户这一问题。

对于这3种不同的冷启动问题,有不同的解决方案。一般来说,可以参考如下解决方案。
1)提供非个性化的推荐,非个性化推荐的最简单例子就是热门排行榜。
2)利用用户注册时提供的年龄、性别等数据做粗粒度的个性化
3)利用用户的社交网络账号登录(需要用户授权),导入用户在社交网站上的好友信息,然后给用户推荐其好友喜欢的物品。
4)要求用户在登录时对一些物品进行反馈,收集用户对这些物品的兴趣信息,然后给用户推荐那些和这些物品相似的物品。
5)对于新加入的物品,可以利用内容信息,将它们推荐给喜欢过和它们相似的物品的用户。
6)在系统冷启动时,可以引入专家的知识,通过一定的高效方式迅速建立起物品的相关度表。

2、利用用户注册信息

用户的注册信息分3种。
1)人口统计学信息 ,包括年龄、性别、职业、民族、学历和居住地。
2)用户兴趣的描述,有一些网站会让用户用文字描述他们的兴趣。
3)从其他网站导入的用户站外行为数据,比如一些来自豆瓣或新浪微博的行为数据和社交网络数据
基于用户注册信息的推荐算法其核心问题是计算每种特征的用户喜 欢的物品。也就是说,对于每种特征f,计算具有这种特征的用户对各个物品的喜好程度p(f, i)。p( f ,i) 可以简单地定义为物品i在具有f的特征的用户中的热门程度:

其中 N(i) 是喜欢物品i的用户集合,U( f ) 是具有特征f的用户集合。 上面这种定义可以比较准确地预测具有某种特征的用户是否喜欢某个物品。但是,在这种定义下,往往热门的物品会在各种特征的用户中都具有比较高的权重。也就是说具有比较高的 N(i) 的物品会在每一类用户中都有比较高的 p( f ,i) 。给用户推荐热门物品并不是推荐系统的主要任 务,推荐系统应该帮助用户发现他们不容易发现的物品。因此,我们可以将 p( f ,i) 定义为喜欢物品i的用户中具有特征f的比例:

这里使用α的目的是解决系数问题,比如一个物品只被一个用户喜欢过,而这个用户刚好就有特征f,那么有 p( f ,i) =1.但是这种情况没有统计意义,因此我们为分母加上一个比较大的数,可以避免这样的物品产生比较大的权重。

3、选择合适的物品启动用户的兴趣

解决用户冷启动问题的另一个方法是在新用户第一次访问推荐系统时,不立即给用户展示推荐结果,而是给用户推荐一些物品,让用户反馈他们对这些物品的兴趣,然后根据用户反馈提供个性化推荐。一般来说,能够来启动用户兴趣的物品需要具有以下的特点:
比较热门:如果要让用户对一个物品进行反馈,前提是用户知道这个物品是什么东西。
具有代表性和区分性:启动用户兴趣的物品不能是大众化或老少咸宜的,因为这样的物品 对用户的兴趣没有区分性。
启动物品集合需要有多样性:在冷启动时,我们不知道用户的兴趣,而用户兴趣的可能 性非常多,为了匹配多样的兴趣,我们需要提供具有很高覆盖率的启动物品集合,这些物品能覆盖几乎所有主流的用户兴趣。

4、利用物品的内容信息

物品冷启动需要解决的问题是如何将新加入的物品推荐给对它感兴趣的用户。物品冷启动在 新闻网站等时效性很强的网站中非常重要。一般来说,物品的内容可以通过向量空间模型1表示,该模型会将物品表示成一个关键词向 量。如果物品的内容是一些诸如导演、演员等实体的话,可以直接将这些实体作为关键词。但如 果内容是文本的形式,则需要引入一些理解自然语言的技术抽取关键词。下图展示了从文本生 成关键词向量的主要步骤。对于中文,首先要对文本进行分词,将字流变成词流,然后从词流中检测出命名实体(如人名、地名、组织名等),这些实体和一些其他重要的词将组成关键词集合,最后对关键词进行排名,计算每个关键词的权重,从而生成关键词向量。

对于物品d,它的内容表示成一个关键词向量如下:

其中,ei 就是关键词,wi 是关键词对应的权重。如果物品是文本,我们可以用信息检索领域著 名的TF-IDF公式计算词的权重:

如果物品是电影,可以根据演员在剧中的重要程度赋予他们权重。向量空间模型的优点是简单,缺点是丢失了一些信息,比如关键词之间的关系信息。不过在绝大多数应用中,向量空间模型对于文本的分类、聚类、相似度计算已经可以给出令人满意的结果。
在给定物品内容的关键词向量后,物品的内容相似度可以通过向量之间的余弦相似度计算:

得到物品的相似度之后,可以利用ItemCF算法的思想,给用户推荐和他历史上 喜欢的物品内容相似的物品。

一般来说,基于物品的内容信息进行推荐,忽视了用户行为,从而也忽视了物品的流行度以及用户行为中所包含的规律,所以它的精度比较低,但结果的新颖度却比较高,因为它可能推荐出用户所没有听说过的物品。但有时,基于物品内容的推荐的精度可能超过协同过滤算法,如果用户的行为强 烈受某一内容属性的影响,那么内容过滤的算法还是可以在精度上超过协同过滤算法的。不过这 种强的内容特征不是所有物品都具有的,而且需要丰富的领域知识才能获得,所以很多时候内容 过滤算法的精度比协同过滤算法差。

本篇的思维导图如下:

1、UGC标签简介

标签应用一般分为两种:一种是让作者或者专家给物品打标签;另一种是让普通用户给物品打标签,也就是UGC(User Generated Content,用 户生成的内容)的标签应用。我们本篇主要讨论UGC的标签应用。

标签系统中的推荐问题主要有以下两个:
1)如何利用用户打标签的行为为其推荐物品(基于标签的推荐)?
2)如何在用户给物品打标签时为其推荐适合该物品的标签(标签推荐)?

本节,我们主要介绍基于标签的推荐问题

2、基于标签的推荐

2.1 一个最简单的算法

拿到了用户标签行为数据,相信大家都可以想到一个最简单的个性化推荐算法。这个算法的描述如下所示。
1) 统计每个用户最常用的标签。
2) 对于每个标签,统计被打过这个标签次数最多的物品。
3) 对于一个用户,首先找到他常用的标签,然后找到具有这些标签的最热门物品推荐给这个用户。

对于上面的算法,用户u对物品i的兴趣公式如下:

这里,B(u)是用户u打过的标签集合,B(i)是物品i被打过的标签集合,nu,b是用户u打过标签b 的次数,nb,i是物品i被打过标签b的次数。

2.2 基于TFIDF的算法改进

前面这个公式倾向于给热门标签对应的热门物品很大的权重,因此会造成推荐热门的物品给 用户,从而降低推荐结果的新颖性。另外,这个公式利用用户的标签向量对用户兴趣建模,其中 每个标签都是用户使用过的标签,而标签的权重是用户使用该标签的次数。这种建模方法的缺点 是给热门标签过大的权重,从而不能反应用户个性化的兴趣。

因此我们可以从两个方面对上式进行修正:
1)首先,我们对热门标签进行一定的惩罚,得到下式:

这里,分母记录了标签b被多少个不同的用户使用过。

2)然后,我们还可以对热门物品进行惩罚:

这里,后面的分母记录了物品i被多少个不同的用户打过标签。

2.3 标签扩充

在前面的算法中,用户兴趣和物品的联系是通过 B(u) ∩ B(i) 中的标签建立的。但是,对于新用户或者新物品,这个集合( B(u) ∩ B(i) )中的标签数量会很少。为了提高推荐的准确率,我们 可能要对标签集合做扩展,比如若用户曾经用过“推荐系统”这个标签,我们可以将这个标签的 相似标签也加入到用户标签集合中,比如“个性化”、“协同过滤”等标签。
标签扩展的本质是对每个标签找到和它相似的标签,也就是计算标签之间的相似度。最简单的相似度可以是同义词。如果认为同一个物品上的不同标签具有某种相似度,那么当两个标签同时出现在很多物品的 标签集合中时,我们就可以认为这两个标签具有较大的相似度。对于标签b,令N(b)为有标签b的 物品的集合,n_{b,i}为给物品i打上标签b的用户数,我们可以通过如下余弦相似度公式计算标签 b和标签b'的相似度:

2.4 标签清理

标签需要清理主要有两个原因:
1)不是所有标签都能反应用户的兴趣
2)标签清理的另一个重要意义在于将标签作为推荐解释

标签清理的主要方法有:
1)去除词频很高的停止词
2)去除因词根不同造成的同义词
3)去除因分隔符造成的同义词

2.5 基于图的推荐算法

首先,我们需要将用户打标签的行为表示到一张图上。我们知道,图是由顶点、边和边上的 权重组成的。而在用户标签数据集上,有3种不同的元素,即用户、物品和标签。因此,我们需 要定义3种不同的顶点,即用户顶点、物品顶点和标签顶点。然后,如果我们得到一个表示用户u 给物品i打了标签b的用户标签行为(u,i,b),那么最自然的想法就是在图中增加3条边,首先需要在用户u对应的顶点v(u)和物品i对应的顶点v(i)之间增加一条边(如果这两个顶点已经有边相连,那 么就应该将边的权重加1),同理,在v(u)和v(b)之间需要增加一条边,v(i)和v(b)之间也需要边相连接。
下图是一个简单的用户—物品—标签图的例子。该图包含3个用户(A、B、C)、3个物品(a、 b、c)和3个标签(1、2、3)。在定义出用户—物品—标签图后,我们可以用基于随机游走的PersonalRank算法计算所有物品节点相对于当前用户节点在图上的相关性,然后按照相关性从大到小的排序,给用户推荐排名最高的N个物品。

本篇的思维导读如下所示:

1、什么是上下文

本章之前提到的推荐系统算法主要集中研究了如何联系用户兴趣和物品,将最符合用户兴趣的物品推荐给用户,但这些算法都忽略了一点,就是用户所处的上下文(context)。这些上下文包括用户访问推荐系统的时间、地点、心情等,对于提高推荐系统的推荐系统是非常重要的。比如,一个卖衣服的推荐系统在冬天和夏天应该给用户推荐不同种类的服装。推荐系统不能因为用户在夏天喜欢过某件T恤,就在冬天也给该用户推荐类似的T恤。
我们这里主要讨论时间上下文,并简单介绍一下地点上下文,讨论如何将时间信息和地点信息建模到推荐算法中,从而让推荐系统能够准确预测用户在某个特定时刻及特定地点的兴趣。

2、时间上下文

2.1 时间效应

时间是一种重要的上下文信息,对用户兴趣有着深入而广泛的影响。一般认为,时间信息对用户兴趣的影响表现在以下几个方面。
1)用户兴趣是变化的
2)物品也是有生命周期的
3)季节效应

2.2 系统时间特性分析

在给定时间信息后,推荐系统从一个静态系统变成了一个时变的系统,而用户行为数据也变成了时间序列。研究一个时变系统,需要首先研究这个系统的时间特性。包含时间信息的用户行为数据集由一系列三元组构成,其中每个三元组(u,i,t)代表了用户u在时刻t对物品i产生过行为。我们可以研究的时间特性如下:
数据集每天独立用户数的增长情况
系统的物品变化情况:比如物品的平均在线天数,如果一个物品在某天被至少一个用户产生过行为,就定义该物品在 这一天在线。因此,我们可以通过物品的平均在线天数度量一类物品的生存周期。
用户访问情况:我们可以统计用户的平均活跃天数,同时也可以统计相隔T天来系统的用户的重合度。
相隔T天系统物品流行度向量的平均相似度:取系统中相邻T天的两天,分别计算这两天 的物品流行度,从而得到两个流行度向量。然后,计算这两个向量的余弦相似度,如果相似度大,说明系统的物品在相隔T天的时间内没有发生大的变化,从而说明系统的时效 性不强,物品的平均在线时间较长。

2.3 推荐系统的实时性

实现推荐系统的实时性除了对用户行为的存取有实时性要求,还要求推荐算法本身具有实时性,而推荐算法本身的实时性意味着:
1)实时推荐系统不能每天都给所有用户离线计算推荐结果,然后在线展示昨天计算出来的 结果。所以,要求在每个用户访问推荐系统时,都根据用户这个时间点前的行为实时计 算推荐列表。
2)推荐算法需要平衡考虑用户的近期行为和长期行为,即要让推荐列表反应出用户近期行为所体现的兴趣变化,又不能让推荐列表完全受用户近期行为的影响,要保证推荐列表对用户兴趣预测的延续性。

2.4 推荐结果的时间多样性

那么,如何在不损失精度的情况 下提高推荐结果的时间多样性呢?提高推荐结果的时间多样性需要分两步解决:首先,需要保证推荐系统能够在用户有了新的 行为后及时调整推荐结果,使推荐结果满足用户最近的兴趣;其次,需要保证推荐系统在用户没 有新的行为时也能够经常变化一下结果,具有一定的时间多样性
对于第一步,又可以分成两种情况进行分析。第一是从推荐系统的实时性角度分析。有些推荐系统会每天离线生成针对所有用户的推荐结果,然后在线直接将这些结果展示给用户。这种类型的系统显然无法做到在用户有了新行为后及时调整推荐结果。第二,即使是实时推荐系统,由于使用的算法不同,也具有不同的时间多样性。
那么,如果用户没有行为,如何保证给用户的推荐结果具有一定的时间多样性呢?一般的思路有以下几种。
在生成推荐结果时加入一定的随机性,
记录用户每天看到的推荐结果,然后在每天给用户进行推荐时,对他前几天看到过很多次的推荐结果进行适当地降权。
每天给用户使用不同的推荐算法。

3、时间上下文推荐算法

3.1 最近最热门

在没有时间信息的数据集中,我们可以给用户推荐历史上最热门的物品。那么在获得用户行为的时间信息后,最简单的非个性化推荐算法就是给用户推荐最近最热门的物品了。给定时间T, 物品i最近的流行度 ni (T ) 可以定义为:

3.2 时间上下文相关的ItemCF算法

那么基于时间上下文,我们可以从以下两个方面改进ItemCF算法。
1)物品相似度 : 用户在相隔很短的时间内喜欢的物品具有更高相似度。
2) 在线推荐:用户近期行为相比用户很久之前的行为,更能体现用户现在的兴趣。

首先回顾一下前面提到的基于物品的协同过滤算法,它通过如下公式计算物品的相似度:

而在给用户u做推荐时,用户u对物品i的兴趣p(u,i)通过如下公式计算:

在得到时间信息之后,我们可以通过如下的公式来改进相似度计算:

上面使用的衰减函数可能的形式如下:

除了考虑时间信息对相关表的影响之外,我们也应该考虑时间信息对预测公式的影响,一般来说,用户现在的行为应该和用户最近的行为关系更大,因此可以做如下的修正:

其中, t0 是当前时间。上面的公式表明, tuj 越靠近t0 ,和物品j相似的物品就会在用户u的推荐列表中获得越高的排名。

3.3 时间上下文相关的UserCF算法

与ItemCF一样,我们也可以在以下两个方面利用时间信息改进UserCF算法。
1)用户兴趣相似度:两个用户兴趣相似是因为他们喜欢相同的物品,或者对相同的物品产生过行为。但是,如果两个用户同时喜欢相同的物品,那么这两个用户应该有更大的兴趣相似度。

2)相似兴趣用户的最近行为 :在找到和当前用户u兴趣相似的一组用户后,这组用户最近的兴趣显然相比这组用户很久之前的兴趣更加接近用户u今天的兴趣。也就是说,我们应该给用户推荐和他兴趣相似的用户最近喜欢的物品。

首先回顾一下UserCF的公式,UserCF通过如下公式计算用户u和用户v的兴趣相似度:

其中N(u)是用户u喜欢的物品集合,N(v)是用户v喜欢的物品集合。
在得到用户相似度后,UserCF通过如下公式预测用户对物品的兴趣:

考虑时间因素,我们可以如下修改用户相似度计算,增加一个时间衰减因子,用户u和用户 v对物品i产生行为的时间越远,那么这两个用户的兴趣相似度就会越小。:

同样,如果考虑和用户u兴趣相似用户的最近兴趣,我们可以设计如下公式:

3.4 时间段图模型

在基于时间的图模型中,时间段图模型G(U,SU ,I,SI ,E,w,)也是一个二分图。U是用户节点集合,SU 是用户时间段节点集合。一个用户时间段节点vut∈SU 会和用户u在时刻t喜欢的物品通过边相连。I是物品节点 集合,SI 是物品时间段节点集合。一个物品时间段节点vit∈SI 会和所有在时刻t喜欢物品i的用户 通过边相连。E是边集合,它包含了3种边:(1)如果用户u对物品i有行为,那么存在边 e(vu , vi ) ∈ E ; (2)如果用户u在t时刻对物品i有行为,那么就存在两条边 e(vut , vi ), e(vu , vit ) ∈ E。
下图是一个简单的时间段图模型示例。在这个例子中,用户A在时刻2对物品b产生了行为。 因此,时间段图模型会首先创建4个顶点,即用户顶点A、用户时间段顶点A:2、物品顶点b、物 品时间段顶点b:2。然后,图中会增加3条边,即(A, b)、(A:2, b)、(A, b:2)。这里不再增加(A:2, b:2) 这条边,一方面是因为增加这条边后不会对结果有所改进,另一方面则是因为增加一条边会增加 图的空间复杂度和图上算法的时间复杂度。

这里,我们不再使用PersonalRank算法给用户进行个性化推荐。相应的,我们使用一种称为路径融合算法的方法,通过该算法度量图中两个顶点的相关性。
一般来说,图上两个相关性比较高的顶点一般具有如下特征:
1) 两个顶点之间有很多路径相连;
2) 两个顶点之间的路径比较短;
3)两个顶点之间的路径不经过出度比较大的顶点。

这里实在是不好弄公式,直接截图了:

4、地点上下文信息

除了时间,地点作为一种重要的空间特征,也是一种重要的上下文信息。这里我们不详细介绍了。

本篇的思维导图如下:

1、社交网络数据

自从搜索引擎谷歌诞生后,大家都在讨论互联网的下一个金矿是什么。现在,几乎所有的人都认为那就是社交网络。根据尼尔森2010年的报告,用户在互联网上22%的时间花费在社交网站 和社交媒体上1。Facebook和Twitter作为两种不同类型社交网络的代表,是目前互联网界的宠儿。谷歌公司也不甘落后,连续推出了很多社交网络产品(Buzz和Google Plus)。国内的互联网以新浪微博为代表,也吸引了很多人的眼球。
社交网络数据的来源有下面几个:
电子邮件
用户注册信息:比如公司、学校等
用户的位置数据:IP地址或者GPS数据
论坛和讨论组
即时聊天工具
社交网站

2、社交网络数据简介

一般来说,有3种不同的社交网络数据:
双向确认的社交网络数据:一般通过无向图表示
单向关注的社交网络数据:用户关系是单向的,可以通过有向图表示
基于社区的社交网络数据:比如豆瓣小组

社交网络数据中也存在长尾分布,主要根据用户的入度和出度,用户的入度反映了用户的社会影响力,而用户的出度代表了一个用户关注的用户数。从下图可以看出,一个社交网络中影响力大的用户总是占少数,同时关注很多人的用户占少数,而绝大多数只关注很少的人。

用户入度分布

用户出度分布

3、基于社交网络的推荐

社会化推荐之所以受到很多网站的重视,是源于如下的优点:
好友推荐可以增加推荐的信任度
社交网络可以解决冷启动问题
当然,社会化推荐有时候也有一定的缺点,主要是不一定提高推荐算法的离线精度,因为社交网络中好友关系不是基于共同兴趣产生的,所以用户好友的兴趣往往和用户的兴趣不一致。

3.1 基于邻域的社会化推荐算法

如果给定一个社交网络和一份用户行为数据集。其中社交网络定义了用户之间的好友关系,而用 户行为数据集定义了不同用户的历史行为和兴趣数据。那么我们想到的最简单算法是给用户推荐好友喜欢的物品集合。即用户u对物品i的兴趣pui可以通过如下公式计算。

其中out(u)是用户u的好友集合,如果用户v喜欢物品i,则rvi=1,否则rvi=0。不过,即使都是 用户u的好友,不同的好友和用户u的熟悉程度和兴趣相似度也是不同的。因此,我们应该在推荐 算法中考虑好友和用户的熟悉程度以及兴趣相似度:

这里,wuv 由两部分相似度构成,一部分是用户u和用户v的熟悉程度,另一部分是用户u和用 户v的兴趣相似度。熟悉度可以用用户之间的共同好友比例来度量:

而兴趣相似度可以通过和UserCF类似的方法度量,即如果两个用户 喜欢的物品集合重合度很高,两个用户的兴趣相似度很高。

3.2 基于图的社会化推荐算法

在社交网站中存在两种关系,一种是用户对物品的兴趣关系,一种是用户之间的社交网络关系。用户的社交网络可以表示为社交网络图,用户对物品的行为可以表示为用户物品二分图,而这两种图可以结合成一个图。如下图所示:

在定义完图中的顶点和边后,需要定义边的权重。其中用户和用户之间边的权重可以定义为 用户之间相似度的a 倍(包括熟悉程度和兴趣相似度),而用户和物品之间的权重可以定义为用 户对物品喜欢程度的  b倍。a 和b  需要根据应用的需求确定。如果我们希望用户好友的行为对 推荐结果产生比较大的影响,那么就可以选择比较大的a 。相反,如果我们希望用户的历史行为 对推荐结果产生比较大的影响,就可以选择比较大的 b 。

在定义完图中的顶点、边和边的权重后,我们就可以利用基于随机游走的PersonalRank图排序算法给每个用户生成推荐结果。

本文的思维导图如下:

1、评分预测问题简介

推荐系统中还有另一个重要的问题,称为评分预测问题。例如下面的表格,在表中每个用户都对一些电影给出了评分,比如用 户A给《虎口脱险》评了1分,给《唐山大兄》评了5分,给《少林足球》评了4分,给《大话西 游》评了5分。但是,每个用户都没有对所有电影评分,比如用户A没有给《变形金刚》和《黑 客帝国》评分。那么,当用户浏览网页并看到《变形金刚》和《黑客帝国》时,我们希望能够给 用户一个分数表明我们认为用户是否会喜欢这部电影,而这个分数也可以帮助用户决策是否要看 这部电影,而如何提高这个分数的预测精度就是评分预测要解决的主要问题。

我们一般可以用均方根误差RMSE度量预测的精度:

评分预测的目的就是找到最好的模型最小化测试集的RMSE。

2、平均值预测

最简单的评分预测算法是利用平均值预测用户对物品的评分的。

2.1 全局平均值

最简单的平均值预测方法就是全局平均值,它定义为训练集中所欲评分记录的评分平均值:

2.2 用户评分平均值

预测函数可以定义为用户u在训练集中所有评分的平均值:

2.3 物品评分平均值

预测函数还可以定义为物品i在训练集中接受的所有评分的平均值:

2.4 用户分类对物品分类的平均值

我们可以利用训练集中同类用户对同类物品评分 的平均值预测用户对物品的评分:

3、基于邻域的评分预测

基于用户的邻域算法和基于物品的邻域算法都可以应用到评分预测中。基于用户的邻域算法认为预测一个用户对一个物品的评分,需要参考和这个用户兴趣相似的用户对该物品的评分,即:

基于物品的邻域算法在预测用户u对物品i的评分时,会参考用户u对和物品i相似的其他物品 的评分,即:

4、矩阵分解模型

4.1 传统的SVD分解

4.2 Simon Funk的SVD分解

该模型又被称为Latent Factor Model(简称LFM),从矩阵分解的角度说,如果我们将评分矩阵R分级为两个低维矩阵相乘:

4.3 加入偏置项后的LFM

实际情况下,一个评分系统有些固有属性和用户物品无关,而用户也有些属性和物品无关,物品也有些属性和用户无关。其预测公式如下:

4.4 考虑领域影响的LFM

我们可以将用户历史评分的物品加入LFM模型中,该模型被称为SVD++。
其实很简单,我们将ItemCF的预测算法改成如下公式:

上面的式子有个错误,最后括号里应该没有x了。

5、加入时间信息的预测算法

5.1 基于邻域的模型融合时间信息

5.2 基于矩阵分解的模型融合时间信息

仿照前面的分解,我们将用户-物品-时间三维矩阵如下分解:

6、模型融合

6.1 模型级联融合

6.2 模型加权融合


 

猜你喜欢

转载自blog.csdn.net/Yasin0/article/details/89792908