协同过滤推荐算法:UserCF、ItemCF

目录

一、协同过滤算法

二、基于邻域的算法:UserCF、ItemCF

三、UserCF、ItemCF的改进


一、协同过滤推荐算法

协同过滤算法是指基于用户行为数据设计的推荐算法,主要包括:

1.基于邻域的算法:UserCF(基于用户的协同过滤算法)、ItemCF(基于物品的协同过滤算法)

2.隐语义模型:LFM(基于矩阵分解的推荐算法)

3.基于图的随机游走算法:PersonalRank

本文主要讲解基于邻域的推荐算法UserCF、ItemCF


二、基于邻域的算法:UserCF、ItemCF

1.UserCF的核心思想是:给用户推荐和他兴趣相似的其他用户喜欢的物品,算法主要包括两个步骤:

<1>.找到和目标用户兴趣相似的用户集合; 

要找到和目标用户兴趣相似的用户,就必须回答:什么样的用户兴趣相似?如何衡量两个用户兴趣相似的程度?
在生活中我们知道,如果两个人都买了《推荐系统实战》这本书,说明两个人对推荐系统都感兴趣,如果两个人的书单一模一样,则两个人对书籍的兴趣爱好就特别相似。UserCF就是利用这用用户的行为的相似计算兴趣的相似度。

a.利用Jaccard公式计算                                              b.余弦相似度                                                         

W\mathrm{\left ( u,v \right )}= \frac{\left | N(u)\bigcap N(v) \right |}{\left | N(u)\bigcup N(v) \right |}                                      W\mathrm{ \left (u,v \right )}= \frac{\left | N(u)\bigcap N(v) \right |}{\sqrt{\left | N(u) \right |\left | N(v) \right |}}

上面两个式子是用来计算用户相似度的常用方法,其中Wuv:用户u和用户v的相似度;N(u):用户u产生过行为(喜欢)的物品的集合;|N(u)|:用户u产生过行为的物品的个数

例如:若用户U1购买了a,b,c,用户U2购买了a,b,c,e,f,,用户U3购买了a,e,则(U1,U2),(U2,U3)的相似度分别为:

W\mathrm{\left ( U1,U2 \right )}=\frac{\left | \left \{ a,b,c \right \} \bigcap \left \{ a,b,c,e,f \right \} \right |}{ \sqrt{ \left | \left \{ a,b,c \right \} \right | \left | \left \{ a,b,c,e,f \right \}\right | } }= \frac{\left | \left \{ a,b,c \right \} \right |}{\sqrt{3*5}}= \frac{3}{\sqrt{15}}               W\mathrm{\left (U1,U3 \right )}= \frac{1}{\sqrt{6}}

有了用户相似度计算方法,我们就可计算每个用户和目标用户u的相似度,然后对这些相似度进行排序,得到和用户u兴趣相似的k个用户的集合S(u,k)

<2>.找到用户集合中其他用户喜欢的且目标用户没有听说过的物品推荐给目标用户

给用户推荐与其兴趣相似的K个用户喜欢的物品,我们首先要找到K个用户喜欢而用户没有接触过的物品,前后计算用户对该物品的感兴趣程度,根据感兴趣程度对物品进行排序,然后推荐给用户感兴趣程度较高的物品,在UserCF中衡量用户对某物品的感兴趣程度使用以下公式:

P\left ( u,i \right )= \sum_{v\in S\left ( u,k \right ) \bigcap N\left ( i \right )}W\left ( u,v \right )*r\left ( v,i \right )

其中P(u,i)表示用户u对物品i的喜欢程度;N(i)表示喜欢物品i的用户集合;r(v,i)用户v对用户i的是否产生过行为(对于评分系统,可以表示v对i的评分)。

以上面用户U1,U2,U3为例,k取2,U1没有对物品e,f产生过行为:
S(U1,2) = {U2,U3};N(f) = {U2} ;N(e) = {U1,U2}

\bg_red \bg_white P(U1,e) = \sum_{ v\in \left \{ U1,U2 \right \} \bigcap \left \{ U1,U2 \right \}}^{ \right ) } W\left ( U1,v \right )*r\left ( v,e \right )

                = W\left ( U1,U2 \right )*r\left ( U2,e \right )+W\left ( U1,U3 \right )*r\left ( U3,e \right )

                = \frac{3}{\sqrt{15}}*1+\frac{1}{\sqrt{6}}*1

P\left ( U1,f \right )=\frac{3}{\sqrt{15}}

如果要给用户U1只推荐一个物品,由于P(U1,e)>P(u1,f),推荐物品e。

精度指标不和参数k成线性关系,对k也不是特别敏感,只要选定在一定范围内,就可以获得不同的精度。k越大则UserCF推荐结果就越热门(流行度越大),覆盖率越低

2.ItemCF的核心思想是:给用户推荐和其过去感兴趣的物品相似的物品,算法主要包括两个步骤:

<1>.计算物品之间的相似度

每个用户的兴趣都局限在某几个方面,如果两个物品属于一个用户的兴趣列表,那么两个物品可能就属于有限的几个领域,而如果物品属于很多用户的兴趣列表,那么他们就可能属于同一个领域,因而有很大的相似度。因此ItemUser利用下面公式计算物品之间的相似度:

W\mathrm{ \left (ij \right )}= \frac{\left | N(i)\bigcap N(j) \right |}{\sqrt{\left | N(i) \right |\left | N(j) \right |}}

其中,W(i,j)表示物品i,j之间的相似度;N(i)表示喜欢物品i的用户集合,|N(i)|表示喜欢物品i的用户的个数

还是以上面  用户U1购买了a,b,c,用户U2购买了a,b,c,e,f,,用户U3购买了a,e 举例说明:
a:U1,U2 ,U3   b:U1,U2   c:U1,U2   e:U2,U3   f:U2

W\mathrm{ \left (a,b \right )}= \frac{\left | \left \{ U1,U2,U3 \right \}\bigcap \left \{ U1,U2 \right \} \right |}{\sqrt{\left | \left \{ U1,U2 ,U3\right \} \right |\left | \left \{ U1,U2 \right \} \right |}}= \frac{ \left \{ \left | U1,U2 \right | \right \}}{ \sqrt{3*2}}= \frac{2}{\sqrt{6}}

W\mathrm{ \left (b,e \right )}=\frac{1}{\sqrt{4}}       W\mathrm{ \left (a,c \right )}= \frac{2}{\sqrt{6}}       W\mathrm{ \left (c,e \right )}= \frac{1}{\sqrt{4}}      W\mathrm{ \left (a,e \right )}= \frac{2}{\sqrt{6}}      

 W\mathrm{ \left (f,e \right )}= \frac{1}{\sqrt{2}}       W\mathrm{ \left (a,f \right )}= \frac{1}{\sqrt{3}}      W\mathrm{ \left (b,f \right )}= \frac{1}{\sqrt{2}}      W\mathrm{ \left (c,f \right )}= \frac{1}{\sqrt{2}}

<2>计算用户U对一个物品的兴趣

P\left ( u,j \right )= \sum_{i\in S\left ( j,k \right ) \bigcap N\left ( u \right )}W\left ( j,i \right )*r\left ( u,i \right )

其中P(u,j)表示用户u对j的兴趣,S(j,k)表示和物品就最相似的k个物品,N(u)表示用户产生过行为的物品集合,r(u,i)用户v对用户i的是否产生过行为(对于评分系统,可以表示u对i的评分)。

以上面例子说明,给用户U1推荐物品,K取3,用户U1没有对e,f产生过行为:
S(e,3) = {a,f,b(c)},   S(f,3) = {e,b,c}

P\left ( U1,e \right )= \sum_{i\in S\left ( e,3 \right ) \bigcap N\left ( U1 \right )}W\left ( e,i \right )*r\left ( U1,i \right )                      P\left ( U1,f \right )= \sum_{i\in S\left ( f,3 \right ) \bigcap N\left ( U1 \right )}W\left ( f,i \right )*r\left ( U1,i \right )

                 = \sum_{i\in \left \{ a,f,b \right \} \bigcap \left \{ a,b,c \right \}}W\left ( e,i \right )*r\left ( U1,i \right )                                       = \sum_{i\in \left \{ e,b,c \right \} \bigcap \left \{ a,b,c \right \}}W\left ( f,i \right )*r\left ( U1,i \right )

                 = W\left ( e,a \right )*1+W\left ( e,b \right )*1= \frac{2}{\sqrt{6}}+\frac{1}{\sqrt{4}}                           = W\left ( f,b \right )*1+W\left ( f,c \right )*1= \frac{1}{\sqrt{2}}+\frac{1}{\sqrt{2}}

如果要给用户U1只推荐一个物品,由于P(U1,e)<P(U1,f),推荐物品f。

精度不和k成线性关系,选择合适的k比较重要

3.UserCF和ItemCF的比较

从三个方面对UserCF,ItemCF进行比较
<1>个性化程度:
    UserCF推荐结果着重于和用户兴趣相似的小群体的热点,推荐更加社会化,反映了用户所在兴趣群体中物品的热门程度。
    ItemCF着重于维护用户的历史兴趣,推荐更加个性化,反映了用户自己的兴趣传承。
<2>可解释性:ItemCF可以利用用户的历史行为给推荐结果提供推荐解释,UserCF很难对推荐结果作出解释
<3>相似度矩阵的更新:互联网中物品的相似度相对于用户的兴趣一般比较稳定,UserCF中用户相似度矩阵相比ItemCF中物品相似度矩阵更新更频繁

实际在互联网中使用ItemCF比较多。UserCF多用于新闻推荐,热门程度和时效性是新闻推荐的两个中点,UserCF可以给用户推荐和有相似爱好的一群其他用户都在看的新闻,这样抓住热点和时效性的同时,又保证了一定的个性化。


三、UserCF、ItemCF的改进

1.考虑物品的热门程度和用户的活跃度

<1>User-IIF

User-IIF认为两个用户对冷门物品采取过同样的行为更能说明他们兴趣的相似度,使用以下公式计算用户的相似度

W\mathrm{ \left (u,v \right )}= \frac{ \sum_{i\in N(u) \bigcap N(v) } \frac{1}{ \log (1+ \left | N(i) \right |) } }{\sqrt{\left | N(u) \right |\left | N(v) \right |}}   ,其中|N(i)|表示对物品i产生过行为的用户的数量

惩罚了用户u和用户v共同兴趣列表中热门物品对他们相似度的影响

<2>Item-IUF

Item-IUF认为活跃用户对物品相似度的贡献应小于不活跃用户,使用以下公式计算物品的相似度

W\mathrm{ \left (i,j \right )}= \frac{ \sum_{u\in N(i) \bigcap N(j) } \frac{1}{ \log (1+ \left | N(u) \right |) } }{\sqrt{\left | N(i) \right |\left | N(j) \right |}}   ,其中|n(u)表示用户u产生过行为的物品的个数

2.考虑时间因素

上面的算法都没有考虑时间因素,时间因素对推荐系统的准确率有一定的影响

<1>时间上下文相关的UserCF算法:

前面的UserCF算法认为用户对相同的物品产生过行为,则他们兴趣比较相似,显然如果两个用户同时对同一物品产生行为,则我们认为他们有更大的相似性。例如用户U1在18年1月购买了《推荐系统实战》,用户U2在18年2月购买了《推荐系统实战》,用户U3在15年1月购买了《推荐系统实战》,则我们认为U1和U2的兴趣相似度大于U1和U3。

在计算用户相似度的时候加上时间因素,使用下面公式:

W\mathrm{ \left (u,v \right )}= \frac{ \sum_{i\in N(u) \bigcap N(v) } \frac{1}{ 1+ \alpha * \left| T\mathrm{ui} -T\mathrm{vi} \right | } }{\sqrt{\left | N(u) \right |\left | N(v) \right |}}

其中Tui表示用户u对物品i产生行为的时间,\frac{1}{\alpha*\left | T\mathrm{ui} -T\mathrm{vi}\right |}可用任意随|Tui-Tvi|递减的且大于0的函数代替

找到和当前用户u兴趣相似的用户后,这组用户最近的兴趣相比之前的兴趣更加接近用户u当前的兴趣,可使用以下公式计算P(u,i)

P\left ( u,i \right )= \sum_{v\in S\left ( u,k \right ) \bigcap N\left ( i \right )}W\left ( u,v \right )*r\left ( v,i \right )*\frac{1}{1+\alpha \left ( T\mathrm{0}-T\mathrm{vi} \right )}   ,其中T0表示当前时间

<2>时间上下文相关的ItemCF算法:

通常用户在很短时间内喜欢的物品更有相似性,在计算物品相似度时加上时间因素,使用下面公式:

W\mathrm{ \left (i,j \right )}= \frac{ \sum_{u\in N(i) \bigcap N(j) } \frac{1}{ 1+ \alpha * \left| T\mathrm{ui} -T\mathrm{uj} \right | } }{\sqrt{\left | N(i) \right |\left | N(j) \right |}}

用户近期行为相比之前行为更能体现用户当前的兴趣,可使用以下公式计算P(u,i)

P\left ( u,i \right )= \sum_{j\in S\left ( i,k \right ) \bigcap N\left ( u \right )}W\left ( i,j \right )*r\left ( u,j \right )*\frac{1}{1+\alpha \left ( T\mathrm{0}-T\mathrm{uj} \right )}

参考书籍:《推荐系统实战》、《Python机器学习算法》          

猜你喜欢

转载自blog.csdn.net/hhjhh76/article/details/81781707