基于用户的协同推荐算法。这个算法是最早诞生的推荐算法的一种。下面就简单介绍一下它的思想和原理。

一、基本思想

大家在日常使用的一些App中,相信也或多或少地遇到过基于用户的协同推荐算法。比如我经常浏览的B站,我们关注过一些UP主之后,系统就会有额外的推荐供选择。

基于用户推荐算法java实现 用户推送算法_用户兴趣

当然,这其中的算法会更为复杂,它可能会根据日常使用App的行为习惯,系统将用户归为某一领域的爱好者,当你关注某一UP主之后,系统就能提供其他你可能也敢兴趣UP。而基于用户的协同推荐算法简单点来理解就是当一个用户需要个性化推荐时(当然推荐可以是电影、音乐、UP主等等),可以先找到和这个用户兴趣相似的用户群体,然后把 这个用户群体中关注的、并且用户没有听说过的推荐给该用户。

二、算法原理

基于用户的协同过滤推荐算法,我们可以将算法拆分成两个步骤,第一个就是要找到与目标用户兴趣相似的用户集合,另外一个步骤就是找到这个集合中用户喜欢的、并且目标用户没有听说过的物品推荐给目标用户。

(1).找到兴趣相似的用户集合

要找到兴趣相似的用户群体,首先我们得先定义指标来度量用户与用户之间的相似度。这也好像我们之间提及到的K近邻算法,又或者聚类算法的影子。我们此处引入Jaccard 公式和余弦相似度,用两者计算用户之间的相似度。假设N(a)表示用户a感兴趣的物品集合,N(b)则是用户b的感兴趣物品集合,那么用Jaccard公式计算 用户之间的相似度如下:

基于用户推荐算法java实现 用户推送算法_相似度_02

而另外一种计算方法余弦相似度则可表示为:

基于用户推荐算法java实现 用户推送算法_基于用户推荐算法java实现_03

下面用一个简单的例子说明如何计算用户之间的相似度,假设有5个用户A-E,共有6样物品a-f,具体用户喜欢的物品明细如下:

基于用户推荐算法java实现 用户推送算法_基于用户推荐算法java实现_04

第一步我们需要先将上面的数据进转换,转换成物品-用户的形式:

基于用户推荐算法java实现 用户推送算法_推荐算法_05

然后对于每个物品,喜欢他的用户,两两之间相同物品加1。例如喜欢物品 d 的用户有 A 和 B,那么在矩阵对应的位置标记为1。下图为完整的得分:

基于用户推荐算法java实现 用户推送算法_基于用户推荐算法java实现_06

到这一步还需要构造分母,Jaccard 公式和余弦相似度的分母是不一样的。比如前者,对于A和B,分母就是A和B喜欢物品的并集,记为{a,b,c,d},数值就是4。而后者就是根号6(3×2)。那么我们就以前者为标准,完成完整的相似度表格:

基于用户推荐算法java实现 用户推送算法_推荐算法_07

到此,计算用户相似度就大功告成,可以很直观的找到与目标用户兴趣较相似的用户。

(2).推荐物品

我们推荐物品的过程是参考上面相似度表格,找到与目标用户s相似度较高的k个用户,标志为用户群体T(s,k),并且将T中的所有物品提取出来,且去掉目标用户已喜欢的物品。然后对于每个候选物品i,定义目标用户对候选物品感兴趣程度用以下公式计算:

基于用户推荐算法java实现 用户推送算法_推荐算法_08

其中r_vi表示用户群体T中的用户v对物品i的喜欢程度,我们在上面的过程中默认为1。有时候可能需要用户给予对应的评分数据,才能较准确地描述喜欢程度。继续用上面的例子,假设我们的目标用户为A,我们在与A相似的用户群体{B,C,D}中,物品c、e和f是A没有感兴趣,但是用户群体中包含的,分别计算P(A,c)、P(A,e)和P(A,f):

基于用户推荐算法java实现 用户推送算法_推荐算法_09

从计算结果可以看出,如果对用户A推荐其可能感兴趣的物品,物品e能成为A的兴趣对象可能较高。上面通过一步步地介绍用户相似度的计算,用户对物品感兴趣的定义,以及用户对于其他未接触的物品感兴趣程度的估计,相信大家都这个基于用户的协同过滤算法有了最基础的认识。当然在我们现实生活中的应用,并不是这样简单,算法会变得更加复杂,且优化后的推荐效果更是上升了很多。