wuxiaosi0 2019-12-29
基于用户的的协同过滤算法是推荐统统最古老的算法,简称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
user | item |
---|---|
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的推荐更社会化,反映了用户所在的小型兴趣群体中物品的热门程度。
UserCF适用于用户较少的场景,时效性较强且用户个性兴趣不太明显的领域。当用户有新行为时,它不一定能够实时更新用户的推荐结果。并且无法给出令用户信服的推荐解释。
(PS:(???)觉得作者文章还不错的话,请点一下推荐哦!万分感谢!)