初探推荐系统-02

基于领域的算法

基于领域的算法是推荐系统中最基本的算法,它主要分为两大类:

  • 基于用户的协同过滤算法
  • 基于物品的协同过滤算法

基于用户的协同过滤

基于用户的协同过滤是推荐系统中最古老的算法,不夸张的说,这个算法的诞生标志了推荐系统的诞生。该算法在1992年被提出,并应用于邮件过滤系统,1994年被GroupLens用于新闻过滤。在此之后知道2000年,该算法都是推荐系统领域最著名的算法。

基础算法

基于用户的协同过滤算法主要包括两个步骤:

  1. 找到和目标用户兴趣相似的用户集合
  2. 找到这个集合中的用户喜欢的,但是目标用户没有听说过的物品推荐给目标用户

在这里插入图片描述

为了找到和目标用户兴趣相似的用户集合,我们需要通过相似度算法计算各个用户之间的相似度。

假设现在有4个用户,他们的购买行为分别为:

用户标识购买物品列表
u1a、b、d、e
u2a、c
u3b、c、d
u4a、c、d、e

使用杰卡德相似系数来计算他们之间的相似度
J ( A , B ) = ∣ N ( u ) ⋂ N ( v ) ∣ ∣ N ( u ) ∪ N ( v ) ∣ J(A, B)=\frac{|N(u) \bigcap N(v)|}{|N(u) \cup N(v)|} J(A,B)=N(u)N(v)N(u)N(v)
拿u2举例,u2和各个用户之间的相似度为:
J ( u 1 , u 2 ) = { a } { a 、 b 、 c 、 d 、 e } = 1 5 = 0.2 J(u_1, u_2)=\frac{\{a\}}{\{a、b、c、d、e\}}=\frac{1}{5}=0.2 J(u1,u2)={abcde}{a}=51=0.2

J ( u 2 , u 3 ) = { c } { a 、 b 、 c 、 d } = 1 4 = 0.25 J(u_2, u_3)=\frac{\{c\}}{\{a、b、c、d\}}=\frac{1}{4}=0.25 J(u2,u3)={abcd}{c}=41=0.25

J ( u 2 , u 4 ) = { a 、 c } { a 、 c 、 d 、 e } = 2 4 = 0.5 J(u_2, u_4)=\frac{\{a、c\}}{\{a、c、d、e\}}=\frac{2}{4}=0.5 J(u2,u4)={acde}{ac}=42=0.5

知道用户之间的相似度后,我们就可以去寻找和目标用户最相似的K个用户了。但找到这K个用户后,我们这K个用户的物品可能会非常多,我们的推荐列表装不下,因此如何定义这些物品的优先级呢?

在这里插入图片描述

这时候就需要一个公式来衡量用户对物品可能得感兴趣程度:
p ( u , i ) = ∑ v ∈ S ( u , K ) ∩ N ( i ) w u v r v i = ∑ v ∈ 最相似的 K 个用户 ∩ 有购买过 i 的用户 w u v r v i p(u, i)=\sum_{v \in S(u, K) \cap N(i)} w_{u v} r_{v i}=\sum_{v \in 最相似的K个用户 \cap 有购买过i的用户} w_{u v} r_{v i} p(u,i)=vS(u,K)N(i)wuvrvi=v最相似的K个用户有购买过i的用户wuvrvi

  • p(u,i):表示用户u对物品i的感兴趣程度

  • S(u,K):表示和用户u兴趣最相似的K个用户

  • N(i):表示对物品i有过行为的用户集合

  • w_uv:表示用户u和用户v的兴趣相似度

  • r_ui:表示用户v对物品i的兴趣 —— 因为用户的购买行为是一个单一行为,所以这里的r的取值都为1和0(买就是1,不买就是0)。

简单来说,这个公式就是针对物品i,我们在K个用户中找出对物品i有过行为的用户列表,之后累加这些用户和目标用户之间的相似度

这里假设我们要对u2用户进行推进,选取K=2,那么和u2最相似的2个用户是u3、u4。用户u2对物品b、d、e都没有过行为。因此我们可以计算一下用户u2对这三个物品可能的感兴趣程度:
p ( u 2 , b ) = w u 2 u 3 = 0.25 p(u_2,b) = w_{u2u3} = 0.25 p(u2,b)=wu2u3=0.25

p ( u 2 , d ) = w u 2 u 3 + w u 2 u 4 = 0.25 + 0.5 = 0.75 p(u_2,d) = w_{u2u3} + w_{u2u4} = 0.25 + 0.5 = 0.75 p(u2,d)=wu2u3+wu2u4=0.25+0.5=0.75

p ( u 2 , e ) = w u 2 u 4 = 0.5 p(u_2,e) = w_{u2u4} = 0.5 p(u2,e)=wu2u4=0.5

排序后用户u2对b、d、e的感兴趣程度分别为 d、e、b,因此如果只有一个推荐栏,那么肯定优先推荐物品d给用户u2。

在这个算法中,有个很重要的参数K,K的选取对userCF算法的性能表现有着比较大的影响。下面是MovieLens数据集中UserCF算法在不同K参数下的性能

在这里插入图片描述

我们可以分析一下参数K对UserCF算法的影响:

  • 准确率和召回率:可以看到,准确率和召回率并不和参数K成线性相关。在上面的实验数据中,K=80的准确率和召回率是最高的。

  • 流行度:可以看到,K越大,推荐物品的流行度就越大。这个也比较合理,因为K越大,说明参与的用户越多,那么推荐结果自然会趋近于全局比较热门的物品

  • 覆盖率:可以看到,K越大,推荐物品的覆盖率越小。覆盖率其实和流行度指标呈负相关的关系,K越大,说明推荐的物品可能都是那些热门商品,覆盖率自然会下降

因此,K的选择也需要进行多次离线实验,最终才可以得到一个比较满意的结果。

对比其他算法

看到上面的实验数据,大家可能会觉的各个指标都好低,UserCF到底靠不靠谱。对此,我们可以对比下一些比较简单的推荐算法的对应指标。

在这里插入图片描述

  • Random:随机给用户推荐物品的算法

  • MostPopular:将平台最热门的K个物品推荐给用户的算法

对比3个算法我们可以看出,Random不用对比,除了覆盖率,其他指标基本碾压。对比MostPopular算法,UserCF的准确率和召回率相对MostPopular高了将近1倍,同时覆盖率也远高于MostPopular。

所以UserCF虽然准确率看上去只有20%+,但是比起什么都不做,乱推荐的效果还是好很多的。

userCF算法的改进

上面的UserCF基础算法有两个比较明显的问题:

  • 算法的时间复杂度是O(U*U),U代表用户的个数。也就是随着用户个数增多,算法所需要的时间也会呈指数型增长
  • 根据基础的UserCF算法,我们发现那些热门的商品会很容易被推荐出去,这并不符合我们的初衷
1、性能优化

算法的真正耗时是我们需要计算各个用户之间的相似度,当用户规模变多,计算量将会非常大。如果仔细分析用户行为数据,我们会发现,对于大多数用户来说,他们之间并没有对同样的物品产生过行为,即
杰卡德相似系数中的分子 : ∣ N ( u 1 ) ∩ N ( u 2 ) ∣ = 0 杰卡德相似系数中的分子: |N(u1) \cap N(u2) | = 0 杰卡德相似系数中的分子:N(u1)N(u2)=0
对于这些用户,他们相似度都是0,而大量的时间都耗在了计算他们相似度上面。

对此,我们可以先建立一个物品到用户的倒排表,记录对物品有过购买行为的用户列表。

在这里插入图片描述

之后遍历物品-用户倒排表。对于每个物品,将对该物品有过行为的用户两两进行标记,登记到用户共同行为矩阵中(这是一个N*N的矩阵,N表示用户的数量)。

拿上面这张图来举例,我们建立一个4*4的矩阵W,然后遍历倒排表,对于物品a,有A、B两个用户有过行为。因此我们令W[A][B]=1,W[B][A]=1,其他物品也以此类推。

在建立完矩阵W后,我们只要对矩阵W中值为1的两个用户计算相似度即可,其他的用户相似度都为0。就可以很大程度的减少计算的时间复杂度

2、优化热门商品频繁被推荐的问题

为什么在这个算法中热门商品会被频繁推荐呢。举个例子,《新华字典》很多人都会买,如果两个用户都购买了《新华字典》,并不能说明这两个人兴趣相似,这里《新华字典》就属于热门商品。

在这里插入图片描述

为了降低热门物品带来的影响,我们可以将调整一下用户的兴趣相似度算法:
w u v = ∑ i ∈ N ( v ) ∩ N ( v ) 1 log ⁡ l + ∣ N ( i ) ∣ ∣ N ( u ) ∣ ∣ N ( v ) ∣ w_{u v}=\frac{\sum_{i \in N(v) \cap N(v)} \frac{1}{\log \mathrm{l}+|N(i)|}}{\sqrt{|N(u)||N(v)|}} wuv=N(u)∣∣N(v) iN(v)N(v)logl+N(i)1
其中N(i)表示物品i被消费过的次数。可以看出,N(i)越大,分子就越小。因此,这个公式对那些热门的物品进行了惩罚,这样在计算用户之间的兴趣相似度时,可以尽量降低热门物品带来的影响

基于物品的协同过滤

基于物品的协同过滤算法是目前业界应用最多的算法,亚马逊网、Netflix、Hulu、Youtube的推荐算都是该算法。

基础算法

基于物品的协同过滤算法主要包括两个步骤:

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

和基于内容的推荐算法不同,ItemCF计算物品相似度时采用的是用户行为数据,而不是物品本身的标签/特征。

在这里插入图片描述

ItemCF中物品之间的相似度可以通过以下公式来定义:
w i j = ∣ N ( i ) ⋂ N ( j ) ∣ ∣ N ( i ) ∣ w_{i j}=\frac{|N(i) \bigcap N(j)|}{|N(i)|} wij=N(i)N(i)N(j)
其中N(i)表示喜欢物品i的用户集合,分子表示同时喜欢物品i和物品j的用户数。因此,上面这个公式其实就可以理解为喜欢物品i的用户中有多少比例的用户也喜欢物品j

计算出物品之间的相似度后,我们可以通过以下公式计算用户u对一个物品j的兴趣:
p u j = ∑ i ∈ N ( u ) ∩ S ( j , K ) w j i r u i p_{u j}=\sum_{i \in N(u) \cap S(j, K)} w_{j i} r_{u i} puj=iN(u)S(j,K)wjirui

  • p(u,i):表示用户u对物品i的感兴趣程度

  • S(j,K):表示和物品j最相似的K个物品集合

  • N(u):表示用户喜欢的物品集合

  • w_ji:表示物品i和物品j的相似度

  • r_ui:表示用户v对物品i的兴趣 —— 因为用户的购买行为是一个单一行为,所以这里的r的取值都为1和0(买就是1,不买就是0)。

这个公式的含义是,和用户历史上感兴趣的物品越相似的物品,越有可能获得比较高的排名。

下面是MovieLens使用ItemCF在离线实验的结果:

在这里插入图片描述

可以看出,在K=10时,准确率和召回率是最高的。在实际场景中,K的最优取值也需要多次训练得出。

ItemCF 算法的改进

ItemCF有三个问题:

  • 物品太多时,需要大量的时间计算
  • 热门物品带来的影响
  • 活跃用户带来的影响
1、性能优化

和UserCF一样,我们可以建立一个用户-物品的倒排表。之后创建一个N*N的矩阵C(N表示物品数量),之后遍历用户-物品倒排表,对于每个用户,将他物品列表中的物品两两在矩阵C中加1

在这里插入图片描述

如上图,最终计算出矩阵C之后,我们想要计算物品a和物品d的相似度,需要计算共同喜欢物品a和物品d的用户数,就可以很容易得出来,也就是2。

2、优化热门商品频繁被推荐的问题

热门物品经常被大部分用户消费,因此在计算两个物品之间相似度时,热门物品经常会和很多物品相似。对于这个问题,我们可以将计算物品相似度的算法改成:
w i j = ∣ N ( i ) ∩ N ( j ) ∣ ∣ N ( i ) ∣ ∣ N ( j ) ∣ w_{i j}=\frac{|N(i) \cap N(j)|}{\sqrt{|N(i)||N(j)|}} wij=N(i)∣∣N(j) N(i)N(j)
和基础算法相比,它的分母做了些改变。原先是N(i),现在加入了N(j)作为惩罚性。这意味着,如果j是热门物品,那么N(j)就会很大,分母变大,整体相似度就会变小。(分母的是交集,比如a、b、c和c、d,最终得到4)

3、用户活跃度对物品相似度的影响

在ItemCF算法中,活跃的用户也会对物品相似度计算带来影响。举个例子,比如在当当网上,有个用户是开书店的,所以他买了当当网上80%的书。那么,这80%的书就两两之间产生了相似度(因为他们被同一个用户购买过)。

但是很明显,这个用户购买这些书并不是出于兴趣。所以就给我们计算物品之间相似度时带来干扰。对于这种情况,我们可以进一步再优化下物品的相似度公式,对那些活跃用户进行惩罚:
w i j = ∑ u ∈ N ( i ) ∩ N ( j ) 1 log ⁡ 1 + ∣ N ( u ) ∣ ∣ N ( i ) ∣ ∣ N ( j ) ∣ w_{i j}=\frac{\sum_{u \in N(i) \cap N(j)} \frac{1}{\log 1+|N(u)|}}{\sqrt{|N(i)||N(j)|}} wij=N(i)∣∣N(j) uN(i)N(j)log1+N(u)1
其中N(u)表示用户u消费过的物品数量,也就是用户u消费的用户数量越多,分子越小,整体相似度就会下降。

4、物品相似度的归一化

有研究发现,如果将ItemCF的相似度矩阵按最大值归一化,可以提高推荐的准确率。我们可以采用下面的公式对物品相似度进行归一化:
w i j = w i j max ⁡ j w i j w_{i j}=\frac{w_{i j}}{\max _{j} w_{i j}} wij=maxjwijwij

  • w_ij:物品i和物品j的相似度
  • 分子: 物品i和物品j的相似度
  • 分母: 取物品j和其他物品最大的相似度作为分母

那么为什么需要进行归一化呢。

还是为了降低热门物品带来的影响。比如某视频网站,有动画片和纪录片分类,一般动画片看的人比较多,纪录片看的人比较少。因此动画片之间相似度往往会比纪录片之间的相似度高。

举个例子,假设现在有两类物品,A类物品之间的相似度都是0.6,B类物品之间的相似度都是0.5,A类物品和B类物品之间的相似度是0.2。有个用户买了一个A类物品和一个B类物品。那么通过ItemCF算法,因为A类物品之间的相似度比较高,那么推荐时,A类物品就会排在前面。

在这里插入图片描述

**如果做完归一化之后,A类物品之间的相似度会变成1,B类物品之间的相似度也会变成1。这样,推荐时A类物品和B类物品就能有相同的排名。**总的来说,归一化的目的还是对热门物品进行一点惩罚,提高冷门物品被推荐出去的概率。

下面是做了归一化前后的离线实验数据对比,可以看出,做了相似度归一化后,准确率和召回率有了一些提升,覆盖率有了比较大的提升。

在这里插入图片描述

UserCF和IemCF比较

  • UserCF的推荐结果着重于反映和用户兴趣相似的小群体的热点,趋向社会化。—— 比如新闻网站中。用户的兴趣不是特别细化,很少有用户只看某一两个领域的新闻,因为这些领域不一定每天都有新闻。大多数用户都喜欢看热门的新闻。对于这种场景,我们就可以使用UserCF,去找和用户兴趣相似的用户看的新闻推荐给用户。
  • ItemCF的推荐结果着重于维系用户的历史兴趣。趋向个性化。—— 比如电商平台或者电影网站中,则更适合用ItemCF。因为在这些网站中,用户的兴趣是比较固定和持久的,一个技术人员可能都是在购买技术方面的书,而且他们对书的热门程度并不是那么敏感,事实上越是资深的技术人员,他们看的书就越可能不热门。因此,ItemCF可以从他们本身的兴趣出发,给他们推荐商品。

除了应用场景外,其他方面也有着差异:

在这里插入图片描述

隐语义模型

隐语义模型它是近几年推荐系统领域最为热门的研究话题。

隐语义模型整体来说也很简单:

  1. 对于某个用户,得到他对哪一类物品感兴趣
  2. 从他感兴趣的分类中挑选他可能喜欢的物品

对于这两个步骤,一般有3个问题需要解决:

  1. 如何给物品分类?
  2. 如何确认用户对哪一类的物品感兴趣,以及感兴趣的程度?
  3. 如何确定物品在某一类中的权重是多少?

对于如何给物品分类这个问题,最古老的做法就是通过人为编辑给物品打标签,然后分类。但这种方法不仅费时费力,而且还有一些缺点:

  1. 编辑进行分类时往往有局限性,不能代表各类用户的观点。如比《具体数学》这本书,有些人可能认为是属于数学分类,有些人认为是属于计算机分类。因为从内容上看,这本书是讲数学的,但是读这本书的大部分都是用户。而编辑做分类时往往会因为内容是讲数学的而分类到数学里面去。
  2. 编辑很难控制分类的粒度。比如《数据挖掘导论》这本书,粗粒度来讲它是属于计算机技术,细粒度来说可能属于数据挖掘分类。对于不同的用户,他可能需要不同的粒度。比如对一个初学者来说,可以粗粒度的给他做推荐,但对于一个资深的研究人员来说,就需要细分到他的具体领域去给他做推荐。
  3. 编辑很难确定一个物品在类中的权重。比如《深入理解Java虚拟机》和《Java并发编程实战》这两本书都可以属于Java语言分类,这两本书在该类中哪个权重更大一些很难定义。

随着近几年机器学习技术的不断发展,就有研究人员提出,我们为什么不从数据本身出发,自动对物品进行分类,然后给用户做推荐呢?

于是隐语义技术就出现了,它是通过分析用户行为数据,基于机器学习中的聚类算法,自动对物品进行分类。基于算法进行分类,有以下好处:

  1. 因为分类是基于用户行为数据得出来的,因此分类的结果能完全代表用户的。比如如果两个物品同时被很多用户喜欢,那么即使他们在内容上相差很远,我们依旧可以将它们当成一个类
  2. 算法可以允许我们指定要划分出多少个分类,也就是我们可以动态控制分类的粒度。想要粗粒度,指定类的数量就少一些。想要细粒度,指定类的数量就多一些。
  3. 经过算法分析,我们可以知道对于一个指定用户,各个物品在类中应该占多大的权重,同时将权重大的物品推荐给该用户。

LFM主要通过以下公式来计算用户u对物品i的兴趣:
Preference ⁡ ( u , i ) = r u i = p u T q i = ∑ k = 1 K p u , k q i , k \operatorname{Preference}(u, i)=r_{u i}=p_{u}^{T} q_{i}=\sum_{k=1}^{K} p_{u, k} q_{i, k} Preference(u,i)=rui=puTqi=k=1Kpu,kqi,k
假设我们想将物品分为K类,那么:
p u , k : 表示用户 u 对第 k 类物品的感兴趣程度 p_{u, k}:表示用户u对第k类物品的感兴趣程度 pu,k:表示用户u对第k类物品的感兴趣程度

q i , k : 表示物品 i 在第 k 类物品中的权重 q_{i, k}:表示物品i在第k类物品中的权重 qi,k:表示物品i在第k类物品中的权重

这个可能还是有些抽象,假设现在有4个用户,对5个物品的购买行为如下(1表示购买过,0表示没买过):

i1i2i3i4i5
u110100
u201011
u301001
u400100

上面的这份数据我们可以看成一个 4 * 5 的矩阵。现在我们想将物品分成3个类别,那么通过矩阵分解,我们就可以得到下面面这两个矩阵:

在这里插入图片描述

这就是整个公式要表达的意思。现在r_ui是一个函数,p_u和q_i是函数的参数。我们想要用r_ui来预测用户对物品的感兴趣程度。为了保证预测的效果最好,必须和我们已知的用户真实行为数据越接近越好,也就是:

在这里插入图片描述

看到这里,熟悉机器学习的同学可能会想起最优解问题。是的,我们可以通过机器学习的方法来求出r_ui的最优解,首先还是先定义代价函数:
C = ∑ ( u , i ) ∈ K ( r u i − r ^ u i ) 2 = ∑ ( u , i ) ∈ K ( r u i − ∑ k = 1 K p u , k q i , k ) 2 + λ ∥ p u ∥ 2 + λ ∥ q i ∥ 2 C=\sum_{(u, i) \in K}\left(r_{u i}-\hat{r}_{u i}\right)^{2}=\sum_{(u, i) \in K}\left(r_{u i}-\sum_{k=1}^{K} p_{u, k} q_{i, k}\right)^{2}+\lambda\left\|p_{u}\right\|^{2}+\lambda\left\|q_{i}\right\|^{2} C=(u,i)K(ruir^ui)2=(u,i)K(ruik=1Kpu,kqi,k)2+λpu2+λqi2

后面的 λ ∥ p u ∥ 2 + λ ∥ q i ∥ 2 是为了防止过拟合加入的正则项 后面的 \lambda\left\|p_{u}\right\|^{2}+\lambda\left\|q_{i}\right\|^{2} 是为了防止过拟合加入的正则项 后面的λpu2+λqi2是为了防止过拟合加入的正则项

要最小化上面的代价函数,我们可以是用梯度下降法来求解。上面定义的代价函数中有两组参数p_uk,q_ik,求梯度下降法时我们需要对他们分别求偏导:
∂ C ∂ p u k = − 2 q i k + 2 λ p v k \frac{\partial C}{\partial p_{u k}}=-2 q_{i k}+2 \lambda p_{v k} pukC=2qik+2λpvk

∂ C ∂ q i k = − 2 p u k + 2 λ q i k \frac{\partial C}{\partial q_{i k}}=-2 p_{u k}+2 \lambda q_{i k} qikC=2puk+2λqik
之后将两个参数沿着下降最快的方向推进:
p u k = p u k + α ( q i k − λ p u k ) p_{u k} =p_{u k}+\alpha\left(q_{i k}-\lambda p_{u k}\right) puk=puk+α(qikλpuk)

q i k = q i k + α ( p u k − λ q i k ) q_{i k} =q_{i k}+\alpha\left(p_{u k}-\lambda q_{i k}\right) qik=qik+α(pukλqik)

最终,我们可以得到我们想要的预测模型(也就是隐语义模型)。

在LFM算法中,重要的参数有4个:

  • 隐特征的个数K (也就是想要分类的数量)
  • 梯度下降学习速率 alpha
  • 正则化参数lambda
  • 负样本/正样本比例,ratio

前面的3个参数很好理解,第四个参数ratio该怎么理解呢。

因为LFM算法的本质还是从用户的兴趣出发,因此最好可以知道用户对哪些物品感兴趣,哪些物品不感兴趣。

  • 感兴趣很好判定,只要用户购买了某物品,我们就认为他大概率对该物品感兴趣,这就是正样本
  • 用户不感兴趣的物品我们定义为负样本。不感兴趣判定是比较模糊的,特别对于购物网站来说,用户没买某个物品不代表用户对该物品不感兴趣

在这种购物网站中,我们就没办法取得负样本,但是根据研究,负样本的数量对LFM的训练效果起着很大的影响。因此,我们一般在训练前会对数据进行一些处理,人为给用户增加一些负样本,一般有以下几种策略:

  1. 对于一个用户,只要他没产生过行为的物品,都作为负样本
  2. 对于一个用户,在他没有产生过行为的物品中,均匀采样中一些作为负样本
  3. 对于一个用户,在他没有产生过行为的物品中,均匀采样中一些作为负样本,同时保证负样本和正样本的数量相当
  4. 对于一个用户,在他没有产生过行为的物品中,均匀采样中一些作为负样本,但是采样时偏重那些不热门的物品

第一种策略明显是最差的,因为这样会产生大量的负样本(一般大部分物品用户都没消费过)。

剩下的3种,目前根据业界的研究,发现第三种效果是最好的,其次是第二种,然后是第四种

后来,根据2011年KDD Cup的Yahoo!Music推荐比赛,我们发现对负样本进行采样时,应该尽量遵循以下原则:

  • 对每个用户,要保证正负样本的平衡
  • 对每个用户,采样他的负样本时,尽量选那些热门的,但是用户没有产生过行为的物品

当然,上面的原则并不适用于所有场景,比如有人基于Netflix MovieLens的数据集做了一个实验,发现随着ratio(负/正样本比例)提高,准确率也在提升,最终ratio=10时达到最好:

在这里插入图片描述

因此,实际训练模型的过程中,还是需要多调整各个参数,多次实验,才能得到更好的模型。

冷启动问题

无论什么推荐算法,它的核心都是数据。如果缺乏数据,几乎所有的推荐算法都无法正常使用。在推荐系统领域,没有数据一般称之为冷启动问题。

常见的会导致冷启动的场景有3个:

  • 用户冷启动:也就是一个用户刚使用我们的网站,我们对他完全不了解,没有他的行为数据,这时该如何给他做推荐?
  • 物品冷启动:当一个物品新加入时,它没有和任何用户有过交互行为,如何将它推荐给用户?
  • 系统冷启动:如何在一个新开发的网站上设计个性化推荐系统,从而系统刚发布就能让用户体验到个性化推荐的效果。

用户冷启动

解决用户冷启动问题有很多种方式:

  • 利用用户注册时提供的年龄、性别等数据进行粗粒度的推荐
  • 利用用户的社交网络账号登陆,获取用户在社交网站上的好友信息(如果得到用户允许的话),基于好友喜欢的物品进行推荐
  • 要求用户登陆时对一些物品进行反馈,收集用户对这些物品的兴趣信息,然后给用户推荐和这些物品相似的物品

总的来说,就是在用户刚加入我们网站时,尽可能的多获取到用户的相关信息。

现在很多网站和app都是这么做的,拿小红书举例:

在这里插入图片描述

在这里插入图片描述

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

可以看到,作为一个新用户,我们刚使用小红书时,小红花会让我们填写许多信息。基于这些信息,小红书就可以很快就给我们生成针对我们的个性化推荐内容了。

不要小看这些用户注册信息,根据研究,哪怕最基本的年龄、性别、国家,都可以带来不错的推荐效果,有推荐领域的研究人员对不同算法做了实验:

  • MostPopular 给用户推荐最热门的歌手
  • GenderMostPopular 给用户推荐对于和他同性别的用户塔热门的歌手,这里我们将用户分成男女两类
  • AgeMostPopular 给用户推荐对于和他同一个年龄段的用户最热门的歌手,这里我们将 10岁作为一个年龄段,将用户按照不同的年龄段分类
  • CountryMostPopular 给用户推荐对于和他同一个国家的用户最热门的歌手
  • DemographicMostPopular 给用户推荐对于和他同性别、年龄段、国家的用户最热门的 歆手

最后得到实验结果:

在这里插入图片描述

可以看出,在这些特征里面,国家这个特性对推荐效果的影响最大。当然,我们能拿到越多的用户信息,就能获得越好的推荐效果。

物品冷启动

物品冷启动对算法的影响程度取决于使用了哪种算法:

  • 基于内容的推荐算法:基本不影响。我们只要能挖掘到新加入的物品的特征/标签,通过内容相似,很快新物品就会被推荐给用户。
  • UserCF:不是十分敏感。UserCF的原理是找相似的用户买过的物品推荐给用户,在大多数网站中,推荐列表都不单单是唯一的物品展示列表,因此新物品总会被用户看到,之后不断扩散出去。
  • ItemCF:影响较大。ItemCF是推荐和用户消费过的物品相似的物品给用户,而新物品一开始和所有物品都没有联系,因此很难马上被推荐出去
  • 隐语义模型:影响较大。隐语义模型也是基于用户真实行为数据进行训练的。新加入的物品缺乏相关交互数据,很难被推荐出去。

一般在推荐系统中,往往不会只采用单一的推荐算法。而是结合多种推荐算法来提高推荐效果。

系统冷启动

解决系统冷启动的方法是利用专家知识对物品进行标注。

拿网络电台Pandora举例。Pandora是一个给用户播放音乐的个性化电台应用。因为要通过内容挖掘技术自动分析音乐之间的相似度,是非常困难的,效果也很难令人满意。所以Pandora雇佣了一批动计算机的音乐人进行了一项称为音乐基因的项目。他们听了几万名歌手的歌,并对这些歌的各个维度进行标注。最终,他们使用了400多个特征(Pandora称这些特征为基因)。标注完所有的歌曲后,每首歌都可以表示为一个400维的向量,然后通过常见的向量相似度算法就可以算出这些歌曲的相似度。

利用上下文信息

上面我们介绍了几个推荐算法,但都是基于联系用户兴趣和物品。对于用户所处的上下文缺乏关注。

用户所处的上下文信息包括:

  • 用户访问系统的时间
  • 用户访问系统的地点
  • 用户访问系统时的心情

在很多时候,这些信息对于推荐效果都起着很大的作用。

利用用户访问系统的时间

在推荐系统中,时间是一个非常重要的上下文信息,对用户的兴趣起着深入而广泛的影响。它对用户兴趣的影响可能包括:

  • 用户兴趣是不断变化的:这是显而易见的,比如一个人小时候喜欢看动画片,长大了可能就喜欢看动作片。一个程序员刚入行的时候看的是入门书籍,随着技术水平的提高,他会更倾向于更专业的书籍。
  • 物品也是有生命周期的:这个在新闻类的网站中最为明显,一个过时的新闻相信大部分人都不会感兴趣。购物网站中也有这类现象,比如iPhone 14都出来了,还向用户推荐iphone 10、11,推荐效果肯定不会太好
  • 季节效应:这个在一些随季节变化的物品上最为明显,比如衣服。如果一个购物网站夏天推荐用户外套,冬天推荐短袖,相信这个网站迟早药丸。

利用用户访问系统的地点

用户所在地点对推荐结果的影响主要体现在两个方面:

  • 兴趣本地化:不同地区、国家的人们的兴趣肯定存在一定的差距。所以,根据用户所在地区去做推荐可以得到更好的效果。
  • 活动本地化:一个用户往往大部分时间都在附近地区活动。有研究表明,45%的用户平常活动半径不超过10英里,75%的用户活动半径不超过50英里。因此,基于用户位置的推荐可以尽量将离用户比较近的物品推荐给用户。

用户访问系统时的心情

比如对一个音乐类的推荐网站,不同的心情明显会影响用户想听什么类型的歌。

比如豆瓣电台,你就可以选择当前的场景和心情,它会根据你的选择为你推荐适合的音乐。

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值