文章目录
1. 概述
如下图所示,我们可以看出,推荐引擎利用特殊的信息过滤技术,将不同的物品或内容推荐给可能对它们感兴趣的用户。
推荐引擎根据不同依据如下分类:
1、根据其是不是为不同的用户推荐不同的数据,分为
- 基于大众行为(网站管理员自行推荐,或者基于系统所有用户的反馈统计计算出的当下比较流行的物品)
- 个性化推荐引擎(帮你找志同道合,趣味相投的朋友,然后在此基础上实行推荐);
2、根据其数据源,分为
- 基于人口统计学的推荐(用户年龄或性别相同判定为相似用户),
- 基于内容的推荐(物品具有相同关键词和Tag,没有考虑人为因素)
- 基于协同过滤的推荐(发现物品,内容或用户的相关性推荐,分为三个子类,下文阐述)
2. 基于人口统计学的推荐
基于人口统计学的推荐机制(Demographic-based Recommendation)是一种最易于实现的推荐方法,它只是简单的根据系统用户的基本信息发现用户的相关程度,然后将相似用户喜爱的其他物品推荐给当前用户,下图给出了这种推荐的工作原理。
从图中可以很清楚的看到,
- 首先,系统对每个用户都有一个用户 Profile 的建模,其中包括用户的基本信息,例如用户的年龄,性别等等;
- 然后,系统会根据用户的 Profile 计算用户的相似度,可以看到用户 A 的 Profile 和用户 C 一样,那么系统会认为用户 A 和 C 是相似用户,在推荐引擎中,可以称他们是”邻居”;
- 最后,基于”邻居”用户群的喜好推荐给当前用户一些物品,图中将用户 A 喜欢的物品 A 推荐给用户 C。
基于人口统计学的推荐机制的好处在于:
- 因为不使用当前用户对物品的喜好历史数据,所以对于新用户来讲没有”冷启动(Cold Start)”的问题。
- 这个方法不依赖于物品本身的数据,所以这个方法在不同物品的领域都可以使用,它是领域独立的(domain-independent)。
那么这个方法的缺点和问题是什么呢?
- 这种基于用户的基本信息对用户进行分类的方法过于粗糙,尤其是对品味要求较高的领域,比如图书,电影和音乐等领域,无法得到很好的推荐效果。可能在一些电子商务的网站中,这个方法可以给出一些简单的推荐。
- 另外一个局限是,这个方法可能涉及到一些与信息发现问题本身无关却比较敏感的信息,比如用户的年龄等,这些用户信息不是很好获取。
3. 基于内容的推荐
基于内容的推荐是在推荐引擎出现之初应用最为广泛的推荐机制,它的核心思想是根据推荐物品或内容的元数据,发现物品或者内容的相关性,然后基于用户以往的喜好记录,推荐给用户相似的物品。下图给出了基于内容推荐的基本原理。
图中给出了基于内容推荐的一个典型的例子,电影推荐系统,
- 首先我们需要对电影的元数据有一个建模,这里只简单的描述了一下电影的类型;
- 然后通过电影的元数据发现电影间的相似度,因为类型都是”爱情,浪漫”电影 A 和 C 被认为是相似的电影(当然,只根据类型是不够的,要得到更好的推荐,我们还可以考虑电影的导演,演员等等);
- 最后实现推荐,对于用户 A,他喜欢看电影 A,那么系统就可以给他推荐类似的电影 C。
这种基于内容的推荐机制的好处在于
- 它能很好的建模用户的口味,能提供更加精确的推荐。
但它也存在以下几个问题:
- 需要对物品进行分析和建模,推荐的质量依赖于对物品模型的完整和全面程度。在现在的应用中我们可以观察到关键词和标签(Tag)被认为是描述物品元数据的一种简单有效的方法。
- 物品相似度的分析仅仅依赖于物品本身的特征,这里没有考虑人对物品的态度。
- 因为需要基于用户以往的喜好历史做出推荐,所以对于新用户有”冷启动”的问题。
虽然这个方法有很多不足和问题,但它还是成功的应用在一些电影,音乐,图书的社交站点,有些站点还请专业的人员对物品进行基因编码,比如潘多拉,在一份报告中说道,在潘多拉的推荐引擎中,每首歌有超过 100 个元数据特征,包括歌曲的风格,年份,演唱者等等。
4. 基于协同过滤的推荐
协同过滤(Collaborative Filtering)作为推荐算法中最经典的类型,包括在线的协同和离线的过滤两部分。所谓在线协同,就是通过在线数据找到用户可能喜欢的物品,而离线过滤,则是过滤掉一些不值得推荐的数据,比比如推荐值评分低的数据,或者虽然推荐值高但是用户已经购买的数据。
协同过滤的模型一般为m个物品,n个用户的数据,只有一部分用户和部分数据之间是有评分数据的,其它部分评分是空白,此时我们要用已有的部分稀疏数据来预测那些空白的物品和数据之间的评分关系,找到最高评分的物品推荐给用户。
一般来说,协同过滤推荐分为三种类型。第一种是基于用户(user-based)的协同过滤,第二种是基于项目(item-based)的协同过滤,第三种是基于模型(model based)的协同过滤。
- 基于用户(user-based)的协同过滤主要考虑的是用户和用户之间的相似度,只要找出相似用户喜欢的物品,并预测目标用户对对应物品的评分,就可以找到评分最高的若干个物品推荐给用户。
- 基于项目(item-based)的协同过滤和基于用户的协同过滤类似,只不过这时我们转向找到物品和物品之间的相似度,只有找到了目标用户对某些物品的评分,那么我们就可以对相似度高的类似物品进行预测,将评分最高的若干个相似物品推荐给用户。比如你在网上买了一本机器学习相关的书,网站马上会推荐一堆机器学习,大数据相关的书给你,这里就明显用到了基于项目的协同过滤思想。
- 基于模型(model based)的协同过滤是目前最主流的协同过滤类型了,我们的一大堆机器学习算法也可以在这里找到用武之地。
我们可以简单比较下基于用户的协同过滤和基于项目的协同过滤:
- 基于用户的协同过滤需要在线找用户和用户之间的相似度关系,计算复杂度肯定会比基于基于项目的协同过滤高。但是可以帮助用户找到新类别的有惊喜的物品。因为基于项目的协同过滤,由于考虑的物品的相似性一段时间不会改变,因此可以很容易的离线计算,准确度一般也可以接受,但是推荐的多样性来说,就很难带给用户惊喜了。
- 一般对于小型的推荐系统来说,基于项目的协同过滤肯定是主流。但是如果是大型的推荐系统来说,则可以考虑基于用户的协同过滤,当然更加可以考虑我们的第三种类型,基于模型的协同过滤。
4.1 基于用户的协同过滤算法
概念:
首先用一个词就能很好的解释什么叫做基于用户的协同过滤算法:【臭味相投】。虽然是贬义词,但也说明了,具有类似特征的人群,他们喜欢的东西很多也是一样的。因此,在推荐系统中,假设要为A用户推荐物品,可以通过寻找他的“邻居”——与A具有相似兴趣的用户。把那些用户喜欢的,而A用户却不曾听说的东西推荐给A。
基于用户(User-Based)的协同过滤算法首先要根据用户历史行为信息,寻找与新用户相似的其他用户;同时,根据这些相似用户对其他项的评价信息预测当前新用户可能喜欢的项。
相似度算法
那么问题来了,我们如何判断A用户与哪些用户相似呢?关键就是根据用户过去的行为轨迹,计算用户相似度。
目前较多的相似度算法有:
下面使用两个例子来理解基于用户的协同过滤算法
通过例子理解
例子1:
使用pearson系数来衡量用户之间的相似度:
下图为pearson系数的计算公式。其中,i表示项,例如商品;
I
u
I_u
Iu表示用户u评价的项集;
I
v
I_v
Iv表示用户v评价的项集;
r
u
,
i
r_{u,i}
ru,i表示用户u对项i的评分;
r
v
,
i
r_{v,i}
rv,i表示用户v对项i的评分;
r
ˉ
u
\bar r_u
rˉu表示用户u的平均评分;
r
ˉ
v
\bar r_v
rˉv表示用户v的平均评分。
另外,pearsin系数计算用户u对未评分商品的预测分值。首先根据相似度计算,寻找用户u的邻居集N∈U,其中N表示邻居集,U表示用户集。然后,结合用户评分数据集,预测用户u对项i的评分,计算公式如下所示:
另外, 不同的相似度计算方法对应的“用户对未评分商品的预测分值”的计算方式不同。
假设有如下电子商务评分数据集,预测用户C对商品4的评分。
表中?表示评分未知。根据基于用户的协同过滤算法步骤,计算用户C对商品4的评分,其步骤如下所示。
(1)寻找用户C的邻居
从数据集中可以发现,只有用户A和用户D对商品4评过分,因此候选邻居只有2个,分别为用户A和用户D。用户A的平均评分为4,用户C的平均评分为3.667,用户D的平均评分为3。
根据皮尔逊相关系数公式:
红色区域计算C用户与A用户,用户C和用户A的相似度为:
蓝色区域计算C用户与D 用户的相似度为:
(2)预测用户C对商品4的评分
根据上述评分预测公式,计算用户C对商品4的评分,如下所示:
例子2:
使用Jaccard系数来计算用户相似度。Jaccard公式为我们提供了简单地计算两用户兴趣相似度的方法:
其中, N(u)表示用户u感兴趣的物品集合,N(v)表示用户v感兴趣的物品集合
解释一下这个公式,分母是两个集合的绝对值相乘,分子是集合的交集的绝对值,集合绝对值是这个集合中元素的个数。假设A用户喜欢{a,b,d},B用户喜欢{a,c},则他俩相似度计算如下:
Jaccard对应的“用户对物品的兴趣度”的计算公式如下:
S(u, K)是与用户u兴趣最接近的K个用户的集合, N(i)是对物品i有过行为的用户集合,既然要判断u对物品i的兴趣程度,当然是要从兴趣最接近的K个用户中挑出对i有过行为的,所以取交集。
w
u
v
w_{uv}
wuv是用户u和用户v的兴趣相似度,
r
v
i
r_{vi}
rvi代表用户v对物品i的兴趣,因为使用的是单一行为的隐反馈数据,所以另其等于1。
倒排法
当用户很多时,每两个用户之间的相似度的计算量是很大的,因为很多用户其实完全没有共同喜好的。这么多无意义的计算会给我们增加很大的开销,所以我们应该先做一个预处理,把有关联的用户筛选出来,只计算这些有关联的用户的兴趣相似度。倒排法有效的为我们解决了这个问题:
首先将用户–物品表转化为物品–用户表(倒排表)
根据倒排表画出相似度矩阵(比如倒排表第一行说明AB BC AC有关联,就在矩阵中置1,第二行说明AC有关联,又加1变为了2)
矩阵中为0的我们就不需要去计算它们的兴趣相似度了。
用户B对物品b和d没有过行为,我们来计算用户B对物品b和d的感兴趣程度。
- 计算用户B 与用户A 和用户C的用户相似度(因为用户B与用户D没有关联,所以不计算用户B与用户D的相似度):
S ( B , A ) = ∣ { a , c } { a , b , d } ∣ ∣ { a , c } ∣ ∣ { a , b , d } ∣ = 1 2 ∗ 3 = 1 6 ≈ 0.41 S(B,A) = \frac{|\{a,c\}\{a,b,d\}|}{\sqrt{|\{a,c\}||\{a,b,d\}|}} = \frac{1}{\sqrt{2*3}} = \frac{1}{\sqrt6}\approx 0.41 S(B,A)=∣{a,c}∣∣{a,b,d}∣∣{a,c}{a,b,d}∣=2∗31=61≈0.41
S ( B , C ) = ∣ { a , c } { a , b } ∣ ∣ { a , c } ∣ ∣ { a , b } ∣ = 1 2 ∗ 2 = 1 4 = 0.5 S(B,C)= \frac{|\{a,c\}\{a,b\}|}{\sqrt{|\{a,c\}||\{a,b\}|}}= \frac{1}{\sqrt{2*2}} = \frac{1}{\sqrt4}=0.5 S(B,C)=∣{a,c}∣∣{a,b}∣∣{a,c}{a,b}∣=2∗21=41=0.5 - 计算B对物品b的兴趣度:
p ( B , b ) = 0.5 ∗ 1 + 0.41 ∗ 1 = 0.91 p(B,b) = 0.5 *1 + 0.41*1=0.91 p(B,b)=0.5∗1+0.41∗1=0.91 - 计算B对物品d的兴趣度:
p ( B , d ) = 0.5 ∗ 0 + 0.41 ∗ 1 = 0.41 p(B,d) = 0.5*0+0.41*1=0.41 p(B,d)=0.5∗0+0.41∗1=0.41
这样,依次类推,就可以计算出其他未知的评分。得到用户对物品的兴趣度后,对所有物品进行P(u,i)计算兴趣度后进行降序,取前N个物品推荐给用户。
看似很完美了,其实还有个问题
试问:我和XXX都买了英语六级教程,那能说明咱们兴趣一样吗?不一定吧,买六级只是考试必备,对大部分人而言是一种无奈的操作。。。因此,我们要精确判断两人兴趣一样,不应该拿这些热门的物品做决策。冷门的产品更能说明问题。比如,我和XXX都买了java教程,那么应该就能说明我们有共同的兴趣了。所以有了一个更精确的公式:
4.2 基于项目\物品的协同过滤算法
以用户为基础的协同推荐算法随着用户数量的增多,计算的时间就会变长,所以在2001年Sarwar提出了基于项目的协同过滤推荐算法(Item-based Collaborative Filtering Algorithms)。以项目为基础的协同过滤方法有一个基本的假设“能够引起用户兴趣的项目,必定与其之前评分高的项目相似”,通过计算项目之间的相似性来代替用户之间的相似性。
基于项目(Item-Based)的协同过滤算法与User-Based协同过滤算法不一样的是,Item-Based协同过滤算法计算Item之间的相似度,从而预测用户评分。也就是说该算法可以预先计算Item之间的相似度,这样就可提高性能。
基于项目的协同过滤算法就是给用户推荐那些和他们之前喜欢的物品相似的物品。
不过, ItemCF算法并不利用物品的内容属性计算物品之间的相似度,它主要通过分析用户的行为记录计算物品之间的相似度。该算法认为,物品A和物品B具有很大的相似度是因为喜欢物品A的用户大都也喜欢物品B。
仍然采用一个例子来理解算法思想:
该例子采用Jaccard系数来计算物品之间的相似度,Jaccard相似度计算公式如下图所示:
N(i)表示喜欢i物品的用户集合,N(j)表示喜欢j物品的用户集合。Wij其实就是说明:喜欢i物品的用户中有多少也喜欢j物品,从而得出i和j的相似度。
但是如果物品j是热门商品呢?前面我们说过,以热门商品做决策是不科学的,因此我们应该降低j的权重,所以得出改进的公式:
喜欢j的人越多,分母越大,相似度会更低。
Jaccard相似度计算公式对应的用户u对物品j的感兴趣程度计算公式如下图:
此公式与上面基于用户的公式非常相像。S(j,K)表示与j物品最相似的k个物品的集合。N(u)表示用户喜欢的物品集合。
W
j
i
W_{ji}
Wji表示物品之间的相似度。
r
u
i
r_{ui}
rui是用户u对物品i的兴趣。(对于隐反馈数据集,如果用户u对物品i有过行为,即可令
r
u
i
r_{ui}
rui=1。)
倒排法
跟上面一样,我们要过滤出物品i和j完全没关系的,不做不必要的计算。因为上面详细解释过,这里就粗略的画一下结果图,省略了中间那个物品对用户的图。
计算物品a与其他物品的相似度:
w
a
,
b
=
∣
{
A
,
B
,
C
}
∩
{
A
,
C
}
∣
∣
{
A
,
B
,
C
}
∣
∣
{
A
,
C
}
∣
=
2
6
≈
0.82
w_{a,b} = \frac{|\{A,B,C\}\cap\{A,C\}|}{\sqrt{|\{A,B,C\}||\{A,C\}|}}=\frac{2}{\sqrt6} \approx0.82
wa,b=∣{A,B,C}∣∣{A,C}∣∣{A,B,C}∩{A,C}∣=62≈0.82
w
a
,
c
=
∣
{
A
,
B
,
C
}
∩
{
B
}
∣
∣
{
A
,
B
,
C
}
∣
∣
{
B
}
∣
=
1
3
≈
0.58
w_{a,c} = \frac{|\{A,B,C\}\cap\{B\}|}{\sqrt{|\{A,B,C\}||\{B\}|}}=\frac{1}{\sqrt3} \approx 0.58
wa,c=∣{A,B,C}∣∣{B}∣∣{A,B,C}∩{B}∣=31≈0.58
w
a
,
d
=
∣
{
A
,
B
,
C
}
∩
{
A
}
∣
∣
{
A
,
B
,
C
}
∣
∣
{
A
}
∣
=
1
3
≈
0.58
w_{a,d} = \frac{|\{A,B,C\}\cap\{A\}|}{\sqrt{|\{A,B,C\}||\{A\}|}}=\frac{1}{\sqrt3} \approx 0.58
wa,d=∣{A,B,C}∣∣{A}∣∣{A,B,C}∩{A}∣=31≈0.58
计算出
w
i
,
j
w_{i,j}
wi,j之后,就可以计算
p
u
,
j
p_{u,j}
pu,j,盗一张《推荐系统实践》的图,形象的解释下。下面的用户对于《C++ Primer中文版》和《编程之美》这两本书的兴趣程度分别为1.3和0.9,然后这两本书与另外五本书的相似度分别如图中所示,则计算出该用户对这五本数的感兴趣程度分别为0.91,0.97,0.45,0.78,0.54。这样就可以根据该程度来对该用户进行推荐。
另一种解法:
其中,Pa为新用户对已有产品的向量,T为物品的共现矩阵,得到的P`a为新用户对每个产品的兴趣度。
那么就可以理解上述公式的i∈N(u)∩S(j,K),我们在下面的例子中详细讲解。
举例:现有用户的访问的记录如下图所示,
他的共现矩阵为:
通过公式计算相似度:
以此类推得到相似度的共现矩阵:
此时若有新用户E,访问的a,b,d三个物品,那么可以看做向量P:
那么P`为矩阵相乘:
此时得到了对于用户E,c和e两个物品的兴趣度是相同的。
关于何时使用userCF,何时使用itemCF,可以看一下这个讨论。
一般说来,如果item数目不多,比如不超过十万,而且不显著增长的话,就用item-based 好了。
为何?如@wuzh670所说,如果item数目不多+不显著增长,说明item之间的关系在一段时间内相对稳定(对比user之间关系),对于实时更新item-similarity需求就降低很多,推荐系统效率提高很多,故用item-based会明智些。
反之,当item数目很多,建议用user-base。
当然,实践中具体情况具体分析。如下图所示(摘自项亮的《推荐系统实践》一书):
这就是为什么新闻网站一般使用UserCF,而图书、电商网站一般使用ItemCF
- 首先回顾一下UserCF算法和ItemCF算法的推荐原理。UserCF给用户推荐那些和他有共同兴 趣爱好的用户喜欢的物品,而ItemCF给用户推荐那些和他之前喜欢的物品类似的物品。从这个算 法的原理可以看到,UserCF的推荐结果着重于反映和用户兴趣相似的小群体的热点,而ItemCF 的推荐结果着重于维系用户的历史兴趣。换句话说,UserCF的推荐更社会化,反映了用户所在的小型兴趣群体中物品的热门程度,而ItemCF的推荐更加个性化,反映了用户自己的兴趣传承。
- 在新闻网站中,用户的兴趣不是特别细化,绝大多数用户都喜欢看热门的新闻。个性化新闻推荐更加强调抓住 新闻热点,热门程度和时效性是个性化新闻推荐的重点,而个性化相对于这两点略显次要。因 此,UserCF可以给用户推荐和他有相似爱好的一群其他用户今天都在看的新闻,这样在抓住热 点和时效性的同时,保证了一定程度的个性化。同时,在新闻网站中,物品的更新速度远远快于新用户的加入速度,而且 对于新用户,完全可以给他推荐最热门的新闻,因此UserCF显然是利大于弊。
- 但是,在图书、电子商务和电影网站,比如亚马逊、豆瓣、Netflix中,ItemCF则能极大地发 挥优势。首先,在这些网站中,用户的兴趣是比较固定和持久的。一个技术人员可能都是在购买 技术方面的书,而且他们对书的热门程度并不是那么敏感,事实上越是资深的技术人员,他们看 的书就越可能不热门。此外,这些系统中的用户大都不太需要流行度来辅助他们判断一个物品的 好坏,而是可以通过自己熟悉领域的知识自己判断物品的质量。因此,这些网站中个性化推荐的 任务是帮助用户发现和他研究领域相关的物品。因此,ItemCF算法成为了这些网站的首选算法。 此外,这些网站的物品更新速度不会特别快,一天一次更新物品相似度矩阵对它们来说不会造成 太大的损失,是可以接受的。同时,从技术上考虑,UserCF需要维护一个用户相似度的矩阵,而ItemCF需要维护一个物品 相似度矩阵。从存储的角度说,如果用户很多,那么维护用户兴趣相似度矩阵需要很大的空间, 同理,如果物品很多,那么维护物品相似度矩阵代价较大。
4.3 基于模型的协同过滤算法
基于模型的协同过滤作为目前最主流的协同过滤类型,其相关算法可以写一本书了,当然我们这里主要是对其思想做有一个归类概括。我们的问题是这样的m个物品,m个用户的数据,只有部分用户和部分数据之间是有评分数据的,其它部分评分是空白,此时我们要用已有的部分稀疏数据来预测那些空白的物品和数据之间的评分关系,找到最高评分的物品推荐给用户。
对于这个问题,用机器学习的思想来建模解决,主流的方法可以分为:用关联算法,聚类算法,分类算法,回归算法,矩阵分解,神经网络,图模型以及隐语义模型来解决。下面我们分别加以介绍。
用关联算法做协同过滤:
一般我们可以找出用户购买的所有物品数据里频繁出现的项集活序列,来做频繁集挖掘,找到满足支持度阈值的关联物品的频繁N项集或者序列。如果用户购买了频繁N项集或者序列里的部分物品,那么我们可以将频繁项集或序列里的其他物品按一定的评分准则推荐给用户,这个评分准则可以包括支持度,置信度和提升度等。
常用的关联推荐算法有Apriori,FP Tree和PrefixSpan。如果大家不熟悉这些算法,可以参考刘建平博客中的另外几篇文章:
用聚类算法做协同过滤
用聚类算法做协同过滤就和前面的基于用户或者项目的协同过滤有些类似了。我们可以按照用户或者按照物品基于一定的距离度量来进行聚类。如果基于用户聚类,则可以将用户按照一定距离度量方式分成不同的目标人群,将同样目标人群评分高的物品推荐给目标用户。基于物品聚类的话,则是将用户评分高物品的相似同类物品推荐给用户。
常用的聚类推荐算法有K-Means, BIRCH, DBSCAN和谱聚类,如果大家不熟悉这些算法,可以参考刘建平博客中的另外几篇文章:
用分类算法做协同过滤
如果我们根据用户评分的高低,将分数分成几段的话,则这个问题变成分类问题。比如最直接的,设置一份评分阈值,评分高于阈值的就是推荐,评分低于阈值就是不推荐,我们将问题变成了一个二分类问题。虽然分类问题的算法多如牛毛,但是目前使用最广泛的是逻辑回归。为啥是逻辑回归而不是看起来更加高大上的比如支持向量机呢?因为逻辑回归的解释性比较强,每个物品是否推荐我们都有一个明确的概率放在这,同时可以对数据的特征做工程化,得到调优的目的。目前逻辑回归做协同过滤在BAT等大厂已经非常成熟了。
常见的分类推荐算法有逻辑回归和朴素贝叶斯,两者的特点是解释性很强。如果大家不熟悉这些算法,可以参考刘建平博客中的另外几篇文章:
用回归算法做协同过滤
用回归算法做协同过滤比分类算法看起来更加的自然。我们的评分可以是一个连续的值而不是离散的值,通过回归模型我们可以得到目标用户对某商品的预测打分。
常用的回归推荐算法有Ridge回归,回归树和支持向量回归。如果大家不熟悉这些算法,可以参考刘建平博客中的另外几篇文章:
用矩阵分解做协同过滤
用矩阵分解做协同过滤是目前使用也很广泛的一种方法。由于传统的奇异值分解SVD要求矩阵不能有缺失数据,必须是稠密的,而我们的用户物品评分矩阵是一个很典型的稀疏矩阵,直接使用传统的SVD到协同过滤是比较复杂的。
目前主流的矩阵分解推荐算法主要是SVD的一些变种,比如FunkSVD,BiasSVD和SVD++。这些算法和传统SVD的最大区别是不再要求将矩阵分解为𝑈Σ𝑉𝑇的形式,而变是两个低秩矩阵𝑃𝑇𝑄的乘积形式。
用神经网络做协同过滤
用神经网络乃至深度学习做协同过滤应该是以后的一个趋势。目前比较主流的用两层神经网络来做推荐算法的是限制玻尔兹曼机(RBM)。在目前的Netflix算法比赛中, RBM算法的表现很牛。当然如果用深层的神经网络来做协同过滤应该会更好,大厂商用深度学习的方法来做协同过滤应该是将来的一个趋势。
用图模型做协同过滤
用图模型做协同过滤,则将用户之间的相似度放到了一个图模型里面去考虑,常用的算法是SimRank系列算法和马尔科夫模型算法。对于SimRank系列算法,它的基本思想是被相似对象引用的两个对象也具有相似性。算法思想有点类似于大名鼎鼎的PageRank。而马尔科夫模型算法当然是基于马尔科夫链了,它的基本思想是基于传导性来找出普通距离度量算法难以找出的相似性。
用隐语义模型做协同过滤
隐语义模型主要是基于NLP的,涉及到对用户行为的语义分析来做评分推荐,主要方法有隐性语义分析LSA和隐含狄利克雷分布LDA。
4.4 冷启动问题
冷启动问题:如何在没有大量用户数据的情况下设计个性化推荐系统并且让用户对推荐结果满意从而愿意使用推荐系统。冷启动问题主要分为三类:
- 用户冷启动:用户冷启动主要解决如何给新用户做个性化推荐的问题。
- 系统冷启动:系统冷启动主要解决如何在一个新开发的网站上(还没有用户,也没有用户行为,只有一些物品的信息)设计个性化推荐系统。
- 物品冷启动:物品冷启动主要解决如何将新的物品推荐给可能对它感兴趣的用户这一问题。
对于这3种不同的冷启动问题,有不同的解决方案。一般来说,可以参考如下解决方案。
- 提供非个性化的推荐,非个性化推荐的最简单例子就是热门排行榜。
- 利用用户注册时提供的年龄、性别等数据做粗粒度的个性化。
- 利用用户的社交网络账号登录(需要用户授权),导入用户在社交网站上的好友信息,然后给用户推荐其好友喜欢的物品。
- 要求用户在登录时对一些物品进行反馈,收集用户对这些物品的兴趣信息,然后给用户推荐那些和这些物品相似的物品。一般来说,物品需要具有以下的特点:比较热门、具有代表性和区分性、启动物品集合需要有多样性
- 对于新加入的物品,可以利用内容信息,将它们推荐给喜欢过和它们相似的物品的用户。
- 在系统冷启动时,可以引入专家的知识,通过一定的高效方式迅速建立起物品的相关度表。
5. 《推荐系统实践》项亮 书中的两项内容
这本书可以在github中下载。
在本文的前面几部分中,将协同过滤算法分为了三类:基于用户/项目/模型的协同过滤算法,但是在《推荐系统实践》这本书中,分类有所不同,同样是分为3类,但是分为:
- 基于邻域的协同过滤算法:包含基于用户的协同过滤和基于物品的协同过滤(这两个部分在第四章中已经介绍过了)
- 隐语义模型LFM
- 基于图的模型
下面就来分别介绍一下隐语义模型和基于图的模型。
5.1 隐语义模型LFM
研究发现,两个不同领域的最热门物品之间往往具有比较高的相似度。因为两个热门物品,即使其属于不同领域,也会有很多用户同时对这两个无产生行为。
这个时候,仅仅靠用户行为数据是不能解决这个问题的,因为用户的行为表示这种物品之间应该相似度很高。此时,我们只能依靠引入物品的内容数据解决这个问题,比如对不同领域的物品降低权重等。
首先通过一个例子来理解一下这个模型。
假设用户A的兴趣涉及侦探小说、科普图书以及一些计算机技术书,而用户B的兴趣比较集中在数学和机器学习方面。那么如何给A和B推荐图书呢?
- 对于UserCF,首先需要找到和他们看了同样书的其他用户(兴趣相似的用户),然后给他们推荐那些用户喜欢的其他书。
- 对于ItemCF,需要给他们推荐和他们已经看的书相似的书,比如作者B看了很多关于数据挖掘的书,可以给他推荐机器学习或者模式识别方面的书。
- 还有一种方法,可以对书和物品的兴趣进行分类。对于某个用户,首先得到他的兴趣分类,然后从分类中挑选他可能喜欢的物品。
总结一下,这个基于兴趣分类的方法大概需要解决3个问题。
- 如何给物品进行分类?
- 如何确定用户对哪些类的物品感兴趣,以及感兴趣的程度?
- 对于一个给定的类,选择哪些属于这个类的物品推荐给用户,以及如何确定这些物品在一个类中的权重?
以图书为例,每本书出版时,编辑都会给书一个分类。为了给图书分类,出版界普遍遵循中国图书分类法。但是,即使有很系统的分类体系,编辑给出的分类仍然具有以下缺点:
- 编辑的意见不能代表各种用户的意见。比如,对于《具体数学》应该属于什么分类,有人认为应该属于数学,有些人认为应该属于计算机。从内容看,这本书是关于数学的,但从用户看,这本书的读大部分是做计算机出身的。编辑的分类大部分是从书的内容出发,而不是从书的读者群出发。
- 编辑很难控制分类的粒度。我们知道分类是有不同粒度的,《数据挖掘导论》在粗粒度的分类中可能属于计算机技术,但在细粒度的分类中可能属于数据挖掘。对于不同的用户,我们可能需要不同的粒度
- 编辑很难给一个物品多个分类。有的书不仅属于一个类,而是可能属于很多的类。
- 编辑很难给出多维度的分类。我们知道,分类是可以有很多维度的,比如按照作者分类、按照译者分类、按照出版社分类。
- 编辑很难决定一个物品在某一个分类中的权重。比如编辑可以很容易地决定《数据挖掘导论》属于数据挖掘类图书,但这本书在这类书中的定位是什么样的,编辑就很难给出一个准确的数字来表示。
为了解决上面的问题,研究人员提出:为什么我们不从数据出发,自动地找到那些类,然后进行个性化推荐?于是,隐含语义分析技术(latent variable analysis)出现了。隐含语义分析技术因为采取基于用户行为统计的自动聚类,较好地解决了上面提出的5个问题。
隐含语义分析技术从诞生到今天产生了很多著名的模型和方法,其中和该技术相关且耳熟能详的名词有pLSA、LDA、隐含类别模型(latent class model)、隐含主题模型(latent topic model)、矩阵分解(matrix factorization)。这些技术和方法在本质上是相通的,其中很多方法都可以用于个性化推荐系统。本章将以LFM为例介绍隐含语义分析技术在推荐系统中的应用。
LFM通过如下公式计算用户u对物品i的兴趣:
这个公式中, p u , k p_{u,k} pu,k和 q i , k q_{i,k} qi,k是模型的参数,其中, p u , k p_{u,k} pu,k度量了用户u的兴趣和第k个隐类的关系,而 q i , k q_{i,k} qi,k度量了第k个隐类和物品i之间的关系。
那么,下面的问题就是如何计算这两个参数。要计算这两个参数,需要一个训练集,对于每个用户u,训练集里都包含了用户u喜欢的物品和不感兴趣的物品,通过学习这个数据集,就可以获得上面的模型参数。推荐系统的用户行为分为显性反馈和隐性反馈。
LFM在显性反馈数据(也就是评分数据)上解决评分预测问题并达到了很好的精度。不过本章主要讨论的是隐性反馈数据集,这种数据集的特点是只有正样本(用户喜欢什么物品),而没有负样本(用户对什么物品不感兴趣)。那么,在隐性反馈数据集上应用LFM解决TopN推荐的第一个关键问题就是如何给每个用户生成负样本。
根据研究和实验证明,负样本采样时应该遵循以下原则:
- 对每个用户,要保证正负样本的平衡(数目相似)。
- 对每个用户采样负样本时,要选取那些很热门,而用户却没有行为的物品。
一般认为,很热门而用户却没有行为更加代表用户对这个物品不感兴趣。因为对于冷门的物品,用户可能是压根没在网站中发现这个物品,所以谈不上是否感兴趣。
经过采样,可以得到一个用户—物品集
k
{
(
u
,
i
)
}
k\{(u,i)\}
k{(u,i)},其中如果(u, i)是正样本,则有
r
u
i
=
1
r_{ui}=1
rui=1,否则有
r
u
i
=
0
r_{ui}=0
rui=0。然后,需要优化如下的损失函数来找到最合适的参数p和q:
这里,
λ
∣
∣
p
u
∣
∣
2
+
λ
∣
∣
q
i
∣
∣
2
\lambda||p_u||^2 + \lambda||q_i||^2
λ∣∣pu∣∣2+λ∣∣qi∣∣2是用来防止过拟合的正则化项,λ可以通过实验获得。要最小化上面的损失函数,可以使用随机梯度下降法的算法。该算法是最优化理论里最基础的优化算法,它首先通过求参数的偏导数找到最速下降方向,然后通过迭代法不断地优化参数。下面介绍优化方法的数学推导:
缺点:
LFM模型在实际使用中有一个困难,那就是它很难实现实时的推荐。经典的LFM模型每次训练时都需要扫描所有的用户行为记录,这样才能计算出用户隐类向量(
p
u
p_u
pu)和物品隐类向量(
q
i
q_i
qi)。而且LFM的训练需要在用户行为记录上反复迭代才能获得比较好的性能。因此,LFM的每次训练都很耗时,一般在实际应用中只能每天训练一次,并且计算出所有用户的推荐结果。从而LFM模型不能因为用户行为的变化实时地调整推荐结果来满足用户最近的行为。
LFM 和 基于邻域的协同过滤方法的对比
LFM | 基于邻域的协同过滤 | |
---|---|---|
理论基础 | LFM具有比较好的理论基础,它是一种学习方法,通过优化一个设定的指标建立最优的模型 | 是一种基于统计的方法,并没有学习过程 |
离线计算的空间复杂度 | LFM在建模过程中,在用户数和物品书很大时也可以很好地节省离线计算的内存 | 需要维护一张离线的相关表。在离线计算相关表的过程中,如果用户/物品数很多,将会占据很大的内存 |
离线计算的时间复杂度 | LFM的时间复杂度要稍微高于UserCF和ItemCF,这主要是因为该算法需要多次迭代。但总体上,这两种算法在时间复杂度上没有质的差别 | - |
在线实时推荐 | LFM不能进行在线实时推荐 | UserCF和ItemCF在线服务算法需要将相关表缓存在内存中,然后可以在线进行实时的预测 |
推荐解释 | LFM无法提供这样的解释,它计算出的隐类虽然在语义上确实代表了一类兴趣和物品,却很难用自然语言描述并生成解释展现给用户 | ItemCF算法支持很好的推荐解释,它可以利用用户的历史行为解释推荐结果 |
5.2 基于图的模型
基于图的模型(graph-based model)是推荐系统中的重要内容。其实,很多研究人员把基于邻域的模型也称为基于图的模型,因为可以把基于邻域的模型看做基于图的模型的简单形式。在研究基于图的模型之前,首先需要将用户行为数据表示成图的形式。
本章讨论的用户行为数据是由一系列二元组组成的,其中每个二元组(u, i)表示用户u对物品i产生过行为。这种数据集很容易用一个二分图表示。
令G(V,E)表示用户物品二分图,其中
V
=
V
U
∪
V
I
V = V_U \cup V_I
V=VU∪VI 由用户顶点集合
V
U
V_U
VU和物品顶点集合
V
I
V_I
VI组成。对于数据集中每一个二元组(u, i),图中都有一套对应的边
e
(
v
u
,
v
i
)
e(v_u,v_i)
e(vu,vi),其中
v
u
v_u
vu是用户u对应的顶点,
v
i
v_i
vi是物品i对应的顶点。
下图是一个简单的用户物品二分图模型,其中圆形节点代表用户,方形节点代表物品,圆形节点和方形节点之间的边代表用户对物品的行为。比如图中用户节点A和物品节点a、b、d相连,说明用户A对物品a、b、d产生过行为。
将用户行为表示为二分图模型后,下面的任务就是在二分图上给用户进行个性化推荐。如果将个性化推荐算法放到二分图模型上,那么给用户u推荐物品的任务就可以转化为度量用户顶点
v
u
v_u
vu和与
v
u
v_u
vu没有边直接相连的物品节点在图上的相关性,相关性越高的物品在推荐列表中的权重就越高。
相关性高的一对顶点一般具有如下特征:
- 两个顶点之间有很多路径相连;
- 连接两个顶点之间的路径长度都比较短;
- 连接两个顶点之间的路径不会经过出度比较大的顶点
例子:
如下图所示,用户A和物品c、e没有边相连,但是用户A和物品c有两条长度为3的路径相连,用户A和物品e有两条长度为3的路径相连。那么,顶点A与e之间的相关性要高于顶点A与c,因而物品e在用户A的推荐列表中应该排在物品c之前,因为顶点A与e之间有两条路径——(A, b, C, e)和(A, d, D, e)。其中,(A, b, C, e)路径经过的顶点的出度为(3, 2, 2, 2),而(A, d, D, e)路径经过的顶点的出度为(3, 2, 3, 2)。因此,(A, d, D, e)经过了一个出度比较大的顶点D,所以(A, d, D, e)对顶点A与e之间相关性的贡献要小于(A, b, C, e)
基于上面3个主要因素,研究人员设计了很多计算图中顶点之间相关性的方法。本节将介绍一种基于随机游走的PersonalRank算法。
假设要给用户u进行个性化推荐,可以从用户u对应的节点
v
u
v_u
vu开始在用户物品二分图上进行随机游走。游走到任何一个节点时,首先按照概率
α
\alpha
α决定是继续游走,还是停止这次游走并从
v
u
v_u
vu节点开始重新游走。
如果决定继续游走,那么就从当前节点指向的节点中按照均匀分布随机选择一个节点作为游走下次经过的节点。这样,经过很多次随机游走后,每个物品节点被访问到的概率会收敛到一个数。
最终的推荐列表中物品的权重就是物品节点的访问概率。
如果将上面的描述表示成公式,可以得到如下公式
6. 推荐系统需要考虑的其他问题
6.1 时间上下文问题
之前提到的推荐系统算法主要集中研究了如何联系用户兴趣和物品,将最符合用户兴趣的物品推荐给用户,但这些算法都忽略了一点,就是用户所处的上下文(context)。这些上下文包括用户访问推荐系统的时间、地点、心情等,对于提高推荐系统的推荐系统是非常重要的。比如,一个卖衣服的推荐系统在冬天和夏天应该给用户推荐不同种类的服装。推荐系统不能因为用户在夏天喜欢过某件T恤,就在冬天也给该用户推荐类似的T恤。
我们这里主要讨论时间上下文,讨论如何将时间信息建模到推荐算法中,从而让推荐系统能够准确预测用户在某个特定时刻及特定地点的兴趣。
时间上下文相关的推荐算法有:最近最热门、时间相关的UserCF和时间相关的ItemCF 等,可以点击本小节标题查看具体的算法内容。
6.2 one-hot编码带来的问题
- 经过one-hot编码以后,不可避免的样本的数据就变得很稀疏。假设淘宝或者京东上的item为100万,如果对item这个维度进行one-hot编码,光这一个维度数据的稀疏度就是百万分之一。
- one-hot编码带来的另一个问题是特征空间变大。以淘宝上的item为例,将item进行one-hot编码以后,样本空间有一个categorical变为了百万维的数值特征,特征空间一下子暴增一百万。
对特征进行组合:
普通的线性模型,我们都是将各个特征独立考虑的,并没有考虑到特征与特征之间的相互关系。但实际上,大量的特征之间是有关联的。对于特征组合来说,业界现在通用的做法主要有两大类:FM系列与Tree系列。
一般的线性模型为:
从上面的式子很容易看出,一般的线性模型压根没有考虑特征间的关联。为了表述特征间的相关性,我们采用多项式模型。在多项式模型中,特征xi与xj的组合用xixj表示。为了简单起见,我们讨论二阶多项式模型。具体的模型表达式如下:
上式中,n表示样本的特征数量,xi表示第i个特征。
与线性模型相比,FM的模型就多了后面特征组合的部分。
FM求解多项式模型可以点击本小节标题进行了解。另外还有个FM的改进:FFM,DeepFM。
7. 混合的推荐机制
在现行的 Web 站点上的推荐往往都不是单纯只采用了某一种推荐的机制和策略,他们往往是将多个方法混合在一起,从而达到更好的推荐效果。关于如何组合各个推荐机制,这里讲几种比较流行的组合方法。
- 加权的混合(Weighted Hybridization): 用线性公式(linear formula)将几种不同的推荐按照一定权重组合起来,具体权重的值需要在测试数据集上反复实验,从而达到最好的推荐效果。
- 切换的混合(Switching Hybridization):前面也讲到,其实对于不同的情况(数据量,系统运行状况,用户和物品的数目等),推荐策略可能有很大的不同,那么切换的混合方式,就是允许在不同的情况下,选择最为合适的推荐机制计算推荐。
- 分区的混合(Mixed Hybridization):采用多种推荐机制,并将不同的推荐结果分不同的区显示给用户。其实,Amazon,当当网等很多电子商务网站都是采用这样的方式,用户可以得到很全面的推荐,也更容易找到他们想要的东西。
- 分层的混合(Meta-Level Hybridization): 采用多种推荐机制,并将一个推荐机制的结果作为另一个的输入,从而综合各个推荐机制的优缺点,得到更加准确的推荐。
8. 推荐系统常用的评估指标
很多提供推荐服务的网站都有一个让用户给物品打分的功能。那么,如果知道了用户对物品的历史评分,就可以从中习得用户的兴趣模型,并预测该用户在将来看到一个他没有评过分的物品时,会给这个物品评多少分。预测用户对物品评分的行为称为评分预测任务。评分预测的预测准确度一般通过均方根误差(RMSE)和平均绝对误差(MAE)计算。
1. RMSE
对于测试集中的一个用户u和物品i,令
r
u
i
r_{ui}
rui是用户u对物品i的实际评分,而
r
^
u
i
\hat r_{ui}
r^ui是推荐算法给出的预测评分,那么RMSE的定义为:
2.MSE
MAE采用绝对值计算预测误差,它的定义为
关于RMSE和MAE这两个指标的优缺点, Netflix认为RMSE加大了对预测不准的用户物品评分的惩罚(平方项的惩罚),因而对系统的评测更加苛刻。研究表明,如果评分系统是基于整数建立的(即用户给的评分都是整数),那么对预测结果取整会降低MAE的误差。
网站在提供推荐服务时,一般是给用户一个个性化的推荐列表,这种推荐叫做TopN推荐。TopN推荐的预测准确率一般通过准确率(precision)/召回率(recall)度量
3.召回率
令R(u)是根据用户在训练集上的行为给用户作出的推荐列表,而T(u)是用户在测试集上的行为列表。那么,推荐结果的召回率定义为:
4.准确率
推荐结果的准确率定义为:
5. 覆盖率
覆盖率(coverage)描述一个推荐系统对物品长尾的发掘能力。覆盖率有不同的定义方法,最简单的定义为推荐系统能够推荐出来的物品占总物品集合的比例。
假设系统的用户集合为U,推荐系统给每个用户推荐一个长度为N的物品列表R(u)。那么推荐系统的覆盖率可以通过下面的公式计算:
从上面的定义可以看到,覆盖率是一个内容提供商会关心的指标。以图书推荐为例,出版社可能会很关心他们的书有没有被推荐给用户。覆盖率为100%的推荐系统可以将每个物品都推荐给至少一个用户。此外,从上面的定义也可以看到,热门排行榜的推荐覆盖率是很低的,它只会推荐那些热门的物品,这些物品在总物品中占的比例很小。一个好的推荐系统不仅需要有比较高的用户满意度,也要有较高的覆盖率。
但是上面的定义过于粗略。覆盖率为100%的系统可以有无数的物品流行度分布。为了更细致地描述推荐系统发掘长尾的能力,需要统计推荐列表中不同物品出现次数的分布。如果所有的物品都出现在推荐列表中,且出现的次数差不多,那么推荐系统发掘长尾的能力就很好。
因此,可以通过研究物品在推荐列表中出现次数的分布描述推荐系统挖掘长尾的能力。如果这个分布比较平,那么说明推荐系统的覆盖率较高,而如果这个分布较陡峭,说明推荐系统的覆盖率较低。在信息论和经济学中有两个著名的指标可以用来定义覆盖率。
第一个是信息熵:
其中,p(i) 是物品i的流行度除以所有物品流行度之和。
第二个指标是基尼系数(Gini Index):
这里,
i
j
i_j
ij是按照物品流行度p()从小到大排序的物品列表中第j个物品。
6.多样性
用户的兴趣是广泛的,在一个视频网站中,用户可能既喜欢看《猫和老鼠》一类的动画片,也喜欢看成龙的动作片。那么,为了满足用户广泛的兴趣,推荐列表需要能够覆盖用户不同的兴趣领域,即推荐结果需要具有多样性。
多样性描述了推荐列表中物品两两之间的不相似性。因此,多样性和相似性是对应的。假设
s
(
i
,
j
)
∈
[
0
,
1
]
s(i,j)\in [0,1]
s(i,j)∈[0,1]定义了物品i和j之间的相似度,那么用户u的推荐列表R(u)的多样性定义如下:
而推荐系统的整体多样性可以定义为所有用户推荐列表多样性的平均值:
另外,关于评分预测任务和TopN任务的讨论:
评分预测一直是推荐系统研究的热点,绝大多数推荐系统的研究都是基于用户评分数据的评分预测。这主要是因为,一方面推荐系统的早期研究组GroupLens的研究主要就是基于电影评分数据MovieLens进行的,其次,Netflix大赛也主要面向评分预测问题。因而,很多研究人员都将研究精力集中在优化评分预测的RMSE上。
对此,亚马逊前科学家Greg Linden有不同的看法。2009年, 他在Communications of the ACM网站发表了一篇文章,指出电影推荐的目的是找到用户最有可能感兴趣的电影,而不是预测用户看了电影后会给电影什么样的评分。因此,To p N推荐更符合实际的应用需求。也许有一部电影用户看了之后会给很高的分数,但用户看的可能性非常小。因此,预测用户是否会看一部电影,应该比预测用户看了电影后会给它什么评分更加重要。
看到这里,你应该会明白,在基于用户的协同过滤算法中的两个例子,第一个例子对应的是评分预测任务,而第二个例子对应的是TopN任务。
参考
- https://developer.ibm.com/zh/articles/1103-zhaoct-recommstudy1/#icomments
- https://www.cnblogs.com/pinard/p/6349233.html
- https://yq.aliyun.com/articles/539247
- https://www.jianshu.com/p/5463ab162a58
- https://zhuanlan.zhihu.com/p/40463528
- https://www.jianshu.com/p/8d90824d52c5
- https://www.jianshu.com/p/62e5171c85bc
- https://www.jianshu.com/p/b80b0e7b041c
- https://www.jianshu.com/p/152ae633fb00
- https://developer.ibm.com/zh/articles/1103-zhaoct-recommstudy1/#icomments
- 项亮,《推荐系统实践》