推荐系统入门系列—协同过滤算法详解


协同过滤简单来说是利用某兴趣相投、拥有共同经验之群体的喜好来推荐用户感兴趣的信息。具体的又分为基于用户的协同过滤(User Collaboration Filter)和基于商品的协同过滤(Item Collaboration Filter)

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

基本思想

基于用户的协同过滤推荐的基本原理是,根据所有用户对物品的偏好,发现与当前用户口味和偏好相似的‘“邻居” 用户群,并推荐近邻所偏好的物品。

在一般的应用中是采用计算“K近邻”的算法;基于这K个邻居的历史偏好信息,为当前用户进行推荐。

如下图所示:
推荐系统入门系列—协同过滤算法详解

用户c喜欢物品喜欢物品ACD,用户a喜欢物品喜欢物品AC,通过算法计算发现也用户a与用户c十分相似,于是猜测用户a也喜欢物品D,于是将D物品推送给用户a。

例子

(1)基本数据:假设用户对电影的评分情况如下,称之为评分矩阵

用户/电影 电影1 电影2 电影3 电影4 电影5 电影6
A 1 5 3
B 3 3
C 5 10
D 10 5
E 5 1
F 5 3 1

(2)根据评分矩阵计算用户相似度

我们采用最常见的余弦相似度进行计算相似度,设多维向量a^=(a1,a2,a3,a4)b^=(b1,b2,b3,b4)\hat a = (a_1,a_2,a_3,a_4……),\hat b = (b_1,b_2,b_3,b_4……),则其余弦相似度为:
cos<a^,b^>=a1b1+a2b2++anbna12+a22+an2b12+b22+bn2 cos<\hat a, \hat b > = \frac{a_1b_1 + a_2 b_2 + \ldots + a_n b_n}{\sqrt{a_1^2 + a_2^2 + \ldots a_n^2} \sqrt{b_1^2 + b_2^2 + \ldots b_n^2}}
根据这个公式,可以计算出用户A 用户C,用户A、用户B 之间的相似度为:
cos<A,C>=0.08cos<A,B>=0 cos<A,C> = 0.08 \\ cos<A,B> = 0
计算所有的用户之间的相似度,进而得到用户相似度矩阵

A B C D E F
A 1 0 0.08 0.15 0.93 0.43
B 0 1 0 0.32 0 0.6
C 0.08 0 1 0.4 0 0.15
D 0.15 0.32 0.4 1 0 0
E 0.93 0 0 0 1 0.5
F 0.43 0.6 0.15 0 0.5 1

(3)根据评分矩阵、用户相似度矩阵得到推荐列表(推荐未看过的电影)

UserCF算法会基于评分矩阵、用户相似度矩阵给用户推荐和他兴趣最相似的K个用户喜欢的物品。如下的公式度量了UserCF算法中用户uu对物品ii的感兴趣程度:
p(u,i)=vS(u,K)N(i)wuvrvi p(u,i) = \sum_{v\in{S(u,K)\cap N(i)}} w_{uv}r_{vi}
其中,S(u,K) 为和用户 u 兴趣最接近的 K 个用户, N( i ) 为对物品 i 有过行为的用户集合, wuvw_{uv} 为用户 u 和用户 v 的兴趣相似度, rvir_{vi}为用户 v 对物品 i 的兴趣。

在电影推荐例子中,假设我们要给用户A推荐电影,我们首先找到KK个与用户A相似,并且对电影ii 评分的 用户集合vv。然后对这些用户集合中的每一个用户vv 进行如下计算: ( 用户 u 和相似用户 v 的相似程度wuvw_{uv} ) X ( 用户 v 对商品 i 的喜爱程度 r_{vi} ) 然后将乘积结果累加作为 u 对 i 的感兴趣程度。

如:我们要确定用户A对电影2的兴趣程度,先确定v={B,F}v=\{B,F\},所以:
p(A,2)=wABrB2+wAFrF2=03+0.435=2.15 p(A,电影2) = w_{AB}r_{B电影2} + w_{AF}r_{F电影2} = 0*3 + 0.43*5 = 2.15
不难发现,其数值就等于 相似度矩阵的第A行评分矩阵第 电影2 列 内积的结果。

推广一下,用户u对物品i的评分数值就等于 相似度矩阵的第u行评分矩阵第 i 列 内积的结果。

所以,推荐列表 = 相似度矩阵 X 评分矩阵

用户/电影 电影1 电影2 电影3 电影4 电影5 电影6
A 2.9 2.2 11.0 3.9 0.8 1.2
B 3.2 6.0 1.8 0 4.6 0.6
C 9.1 0.8 0.9 0.2 2.0 10.2
D 11.2 1.0 0.8 0.5 6.0 4.0
E 0.9 2.5 11.2 3.8 0 0.5
F 1.2 6.8 7.7 1.8 1.8 2.5

由于用户已经对电影中的一些商品有过行为,所以还要把这些电影给滤除掉。

推荐系统入门系列—协同过滤算法详解
得到最终的推荐列表

1 2 3 4 5 6
A 2.2 0.8 1.2
B 3.2 1.8 0 0.6
C 0.8 0.9 0.2 2.0
D 1.0 0.8 0.5 4.0
E 0.9 2.5 0 0.5
F 1.2 1.8 1.8

其数值代表的意义是用户对电影的感兴趣程度。

UserCF 改进

对于一些热门的商品例如《新华字典》,许多用户都可能会有购买行为,但是不能说明买过这本书的兴趣就相同。但是都买了相对冷门点的《统计学习方法》的人,就很可能有相似的兴趣。

为了改进这个问题,假设 N(i) 为喜欢物品 i 的用户数,则可以改用下面的公式计算相似度:
wuv=iN(u)N(v)1log(1+N(i))N(u)N(v) w_{uv} = \frac{\sum_{i\in{N(u)\cap N(v)}} \frac{1}{\log(1+|N(i)|)}}{\sqrt{|N(u)||N(v)|}}
上面的式子中 1log(1+N(i))\frac{1}{\log(1+|N(i)|)} 惩罚了用户 u 和用户 v 共同兴趣列表中热门物品对他们相似度的影响。

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

基本思想

基于物品的协同过滤推荐的基本原理与基于用户的类似,只是使用所有用户
对物品的偏好,发现物品和物品之间的相似度,然后根据用户的历史偏好信息,将类似的物品推荐给用户。

如下图所示:

推荐系统入门系列—协同过滤算法详解

用户c喜欢物品喜欢物品A,通过算法计算发现物品A与物品C十分相似,于是猜测用户c也喜欢物品C,于是将C物品推送给用户c。

例子

计算过程与UserCF非常相似,区别在于计算时把UserCF的评分矩阵转置

电影/用户 A B C D E F
电影1 1 5 10
电影2 3 5
电影3 5 5 3
电影4 3 1
电影5 3 5
电影6 10

再计算商品与商品之间的相似度得到商品之间的相似度矩阵

最后的推荐列表 = 商品之间的相似度矩阵 X 评分矩阵转置

ItemCF 改进

由于活跃用户可能会广泛的购买各种类别商品,因此对物品相似度的贡献要小于不活跃用户。本节计算相似度的方法同样可以改用下面的方法:
wij=uN(i)N(j)1log1+N(u)N(i)N(j) w_{ij} = \frac{\sum_{u \in N(i) \bigcap N(j)}\frac{1}{\log{1}+|N(u)|}}{\sqrt{|N(i)||N(j)|}}
这个公式只是对活跃用户做的一种软性惩罚,但对于很多过于活跃的用户,在实际计算中一般直接忽略他的兴趣列表,而不将其纳入到相似度计算的数据集中。

归一化

如果将 ItemCF 的相似度矩阵按最大值归一化,可以提高推荐的准确率。如果已经得到了物品相似度矩阵 w ,那么可以用如下公式得到归一化之后的相似度矩阵 w’ :
wij=wijmaxiwij w_{ij}' = \frac{w_{ij}}{\max\limits_i w_{ij}}
归一化的好处不仅仅在于增加推荐的准确度,它还可以提高推荐的覆盖率和多样性。

UserCF 与 ItemCF 对比

同样是协同过滤,在基于用户和基于项目两个策略中应该如何选择呢?

在实际应用中,存在两种情况:(1) 电商、电影、音乐网站,用户数量远大于物品数量。(2)新闻网站,物品(新闻文本)数量可能大于用户数量。

角度 ltem-CF User-CF
应用场景 物品的个数是远远小于用户的数量的,而且物品的个数和相似度相对比较稳定。适用于非社交推荐 物品的个数大于用户的个数,且物品的更新程度很快,相似度依然不稳定。适用与社交推荐
精确度 发现长尾物品,精度就会小于UserCF 精度高与Item_CF
系统多样性 多样性推荐较强 多样性推荐较弱
推荐偏好 UserCF注重社会化 ItemCF注重个性化

参考文献:
推荐系统(一)】协同过滤之基于领域的方法(UserCF,ItemCF)
推荐系统UserCF和ItemCF