基于用户的的协同过滤算法是推荐统统最古老的算法,简称UserCF。该算法的诞生一定程度上标志着推荐系统的诞生。本文将对UserCF算法原理进行讲解,并且基于Movielens数据集给出实现代码供大家交流学习。
基本原理在一个在线个性化推荐系统中,当一个用户A需要个性化推荐时,先找到和他相似兴趣的其他用户,然后把那些用户喜欢的而用户A没有听说过的物品推荐给用户A。这种方法就称为基于用户的协同过滤算法。该算法主要包括两个步骤:
找到和目标用户兴趣相似的用户集合
找到这个集合中用户喜欢的且目标用户没有听说过的物品推荐给目标用户。
步骤1的关键为计算两个用户之间的兴趣相似度。那么如何度量两个用户的兴趣相似度呢,该算法主要利用用户行为的相似度计算兴趣的相似度。给定用户\(u\)和用户\(v\),令\(N(u)\)表示用户\(u\)曾经有过正反馈的物品集合,\(N(v)\)表示用户\(v\)曾经有过正反馈的物品集合。那么,可通过如下的\(Jaccard\)公式简单计算兴趣相似度:
\[
W_{uv} = \frac{|N(u)\bigcap N(V)|}{|N(u)\bigcup|N(v)}
\]
或者通过余弦相似度:
\[
w_{uv} = \frac{|N(u) \bigcap N(v)|}{\sqrt{|N(u)|| N(v)|}}
\]
下面通过表1.1的用户行为记录为例,举例说明UserCF计算用户兴趣相似度的例子。在该例中,用户A对物品{a, b, d}有过行为,用户B对物品{a,c}有过行为,利用余弦相似度公式计算用户A和用户B的兴趣相似度为:
\[
W_{AB} = \frac{|{a,b,d} \bigcap {a,c}|}{\sqrt{|{a,b,d}|| {a,c}|}}=\frac{1}{\sqrt{6}}
\]
表 1.1
A a,b,d
B a,c
C b,c
D c,d,e
由于对两两用户都计算余弦相似度,时间复杂度太高。可以在\(N(u)\bigcap N(v)=0\)时不计算余弦相似度。为此,可以首先建立物品到用户的倒排表,对于每个物品都保存对该物品产生过行为的用户列表。令稀疏矩阵\(C[u][v]=|N(u) \bigcap N(v)|\)。假设用户u和用户v同时属于倒排表中K个物品对应的用户列表,就有\(C[U][V]=K\)。从而,可以扫描倒排表每个物品对应的用户列表,将用户列表中的两两用户对应的\(C[u][v]\)加1,最终得到所有用户之间不为零\(C[u][v]\)。
得到用户之间的兴趣相似度后,UserCF算法会给用户推荐和他兴趣最相似的K个用户喜欢的物品。如下公式度量了UserCF算法中用户u对物品i的感兴趣程度:
\[
p(u, i)=\sum_{v\in{S(u,K) \bigcap N(i)}}{w_{uv}r_{vi}}
\]
其中,\(S(u,K)\)包含和用户u兴趣最接近的K个用户,N(i)是对物品i有过行为的用户集合,\(w_{uv}\)是用户u和用户v的兴趣相似度,\(r_{vi}\)代表用户v对物品i的兴趣,对于单一行为的隐反馈数据,所有的\(r_{vi}=1\)。
使用\(Jaccard\)公式(或者余弦相似度)计算用户兴趣度,会带来一定的缺陷。考虑这种情况,以图书为例,如果两个用户都曾买过《新华字典》,这丝毫不能说明他们兴趣相似,因为绝大多数中国人小时候都买过。但是如果两个用户都买过《数据挖掘导论》,那可以认为他们的兴趣比较相似,因为只有研究数据挖掘的人才会买这本书。换句话说,两个用户对冷门物品采取过同样的行为更能说明他们兴趣的相似度。因此,John S. Breese在论文中提出了如下公式,根据用户行为计算用户的兴趣相似度:
\[
W_{uv} = \frac{\sum_{i \in {N(u) \bigcap N(v)}}{\frac{1}{\log1+|N(i)|}}} {\sqrt{|N(u)||N(v)|}}
\]
可以看到,该公式通过\(\frac{1}{\log1+|N(i)|}\)惩罚用户u和用户v共同兴趣列表中热门物品对他们相似度的影响。
作者基于MovieLens数据集(隐反馈数据集)实现了该算法,地址详见:UserCF算法实现
小结UserCF 是推荐系统领域较为古老的算法, 1992 年就已经在电子邮件的个性化推荐系统Tapestry 中得到了应用, 1994 年被 GroupLens 用来实现新闻的个性化推荐,后来被著名的文章分享网站 Digg 用来给用户推荐个性化的网络文章。UserCF 给用户推荐那些和他有共同兴趣爱好的用户喜欢的物品,从算法的原理可以看出UserCF 的推荐结果着重于反映和用户兴趣相似的小群体的热点,换句话说, UserCF 的推荐更社会化,反映了用户所在的小型兴趣群体中物品的热门程度。