[推荐算法]UserCF,基于用户的协同过滤算法

UserCF:UserCollaborationFilter,基于用户的协同过滤


算法核心思想:在一个在线推荐系统中,当用户A需要个性化推荐时,可以先找到和他有相似兴趣的其它用户,然后把那些用户喜欢的、而用户A没有听说过的物品推荐给A,这种方法称为基于用户的协同过滤算法。

==>可以看出,这个算法主要包括两步:

一、找到和目标用户兴趣相似的用户集合——计算两个用户的兴趣相似度

二、找到这个集合中的用户喜欢的,且目标用户没有听说过的物品推荐给目标用户——找出物品推荐



下面分别来看如何实现这两步:

一、计算两个用户的兴趣相似度:

给定用户u和用户v,令N(u)表示用户u感兴趣的物品集合,N(v)表示用户v感兴趣的物品集合,那么可以通过Jaccard公式或者通过余弦相似度公式计算:

...Jaccard公式


...余弦相似度公式


举例:下图表示用户A对物品{a,b,d}有过行为,用户B对物品{a,c}有过行为


利用余弦相似度计算可得:

用户A和用户B的兴趣相似度为:


同理,



但是,需要注意的是,这种方法的时间复杂度是O(U^2),因为我们需要计算每一对用户之间的相似度,事实上,很多用户相互之间并没有对同样的物品产生过行为,所以很多时候当分子为0的时候没有必要再去计算分母,所以这里可以优化:即首先计算出|N(u) 并 N(v)| != 0 的用户对(u,v),然后对这种情况计算分母以得到两个用户的相似度。


针对此优化,需要2步:

(1)建立物品到用户的倒查表T,表示该物品被哪些用户产生过行为;

(2)根据倒查表T,建立用户相似度矩阵W:在T中,对于每一个物品i,设其对应的用户为j,k,在W中,更新相应的元素值,w[j][k]=w[j][k]+1,w[k][j]=w[k][j]+1,以此类推,扫描完倒查表T中的所有物品后,就可以得到最终的用户相似度矩阵W,这里的W是余弦相似度中的分子部分,然后将W除以分母可以得到最终的用户兴趣相似度。

[推荐算法]UserCF,基于用户的协同过滤算法_第1张图片


得到用户相似度后,就可以进行第二步了。


二、给用户推荐和他兴趣最相似的K个用户喜欢的物品。

公式如下:


其中,p(u,i)表示用户u对物品i的感兴趣程度,S(u,k)表示和用户u兴趣最接近的K个用户,N(i)表示对物品i有过行为的用户集合,Wuv表示用户u和用户v的兴趣相似度,Rvi表示用户v对物品i的兴趣(这里简化,所有的Rvi都等于1)。

根据UserCF算法,可以算出,用户A对物品c、e的兴趣是:



以上就是UserCF最简单的实现方法。


我们还可以在此基础上进行改进,改进思想是:两个用户对冷门物品采取过同样的行为更能说明他们兴趣的相似度。

比如,两个用户都买过《新华词典》并不能说明两个人的兴趣相似,而如果两个人都买过《数据挖掘导论》则可以认为他们的兴趣相似。

==>公式如下:

[推荐算法]UserCF,基于用户的协同过滤算法_第2张图片

可以看到,如果一个物品被大多数人有过行为,则这样的信息参考价值不大,权重变小。




以上内容参考自《推荐系统实践》




你可能感兴趣的:(algorithm,&,data,structure)