基于用户的协同过滤推荐算法原理和实现

      在推荐系统众多方法中,基于用户的协同过滤推荐算法是最先诞生的,原理也较为简单。该算法1992年提出并用于邮件过滤系统,两年后1994年被 GroupLens 用于新闻过滤。一直到2000年,该算法都是推荐系统领域最著名的算法。html

      本文简单介绍基于用户的协同过滤算法思想以及原理,最后基于该算法实现园友的推荐,即根据你关注的人,为你推荐博客园中其余你有可能感兴趣的人。算法

基本思想

      俗话说“物以类聚、人以群分”,拿看电影这个例子来讲,若是你喜欢《蝙蝠侠》、《碟中谍》、《星际穿越》、《源代码》等电影,另外有我的也都喜欢这些电影,并且他还喜欢《钢铁侠》,则颇有可能你也喜欢《钢铁侠》这部电影。网络

     因此说,当一个用户 A 须要个性化推荐时,能够先找到和他兴趣类似的用户群体 G,而后把 G 喜欢的、而且 A 没有据说过的物品推荐给 A,这就是基于用户的系统过滤算法。3d

原理

      根据上述基本原理,咱们能够将基于用户的协同过滤推荐算法拆分为两个步骤:code

1. 找到与目标用户兴趣类似的用户集合htm

2. 找到这个集合中用户喜欢的、而且目标用户没有据说过的物品推荐给目标用户blog

1. 发现兴趣类似的用户

      一般用 Jaccard 公式或者余弦类似度计算两个用户之间的类似度。设 N(u) 为用户 u 喜欢的物品集合,N(v) 为用户 v 喜欢的物品集合,那么 u 和 v 的类似度是多少呢:排序

      Jaccard 公式:get

      余弦类似度:博客

      假设目前共有4个用户: A、B、C、D;共有5个物品:a、b、c、d、e。用户与物品的关系(用户喜欢物品)以下图所示:

      如何一会儿计算全部用户之间的类似度呢?为计算方便,一般首先须要创建“物品—用户”的倒排表,以下图所示:

      而后对于每一个物品,喜欢他的用户,两两之间相同物品加1。例如喜欢物品 a 的用户有 A 和 B,那么在矩阵中他们两两加1。以下图所示:

      计算用户两两之间的类似度,上面的矩阵仅仅表明的是公式的分子部分。以余弦类似度为例,对上图进行进一步计算:

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

2. 推荐物品

      首先须要从矩阵中找出与目标用户 u 最类似的 K 个用户,用集合 S(u, K) 表示,将 S 中用户喜欢的物品所有提取出来,并去除 u 已经喜欢的物品。对于每一个候选物品 i ,用户 u 对它感兴趣的程度用以下公式计算:

      其中 rvi 表示用户 v 对 i 的喜欢程度,在本例中都是为 1,在一些须要用户给予评分的推荐系统中,则要代入用户评分。

      举个例子,假设咱们要给 A 推荐物品,选取 K = 3 个类似用户,类似用户则是:B、C、D,那么他们喜欢过而且 A 没有喜欢过的物品有:c、e,那么分别计算 p(A, c) 和 p(A, e):

      看样子用户 A 对 c 和 e 的喜欢程度多是同样的,在真实的推荐系统中,只要按得分排序,取前几个物品就能够了。

园友推荐

      在社交网络的推荐中,“物品”其实就是“人”,“喜欢一件物品”变为“关注的人”,这一节用上面的算法实现给我推荐 10 个园友。

1. 计算 10 名与我兴趣最类似的园友

      因为只是为我一我的作用户推荐,因此不必创建一个庞大的用户两两之间类似度的矩阵了,与我兴趣类似的园友只会在这个群体产生:我关注的人的粉丝。除我本身以外,目前我一共关注了23名园友,这23名园友一共有22936个惟一粉丝,我对这22936个用户逐一计算了类似度,类似度排名前10的用户及类似度以下:

昵称 关注数量 共同数量 类似度
蓝枫叶1938 5 4 0.373001923296126
FBI080703 3 3 0.361157559257308
鱼非鱼 3 3 0.361157559257308
Lauce 3 3 0.361157559257308
蓝色蜗牛 3 3 0.361157559257308
shanyujin 3 3 0.361157559257308
Mr.Huang 6 4 0.340502612303499
对世界说你好 6 4 0.340502612303499
strucoder 28 8 0.31524416249564
Mr.Vangogh 4 3 0.312771621085612

2. 计算对推荐园友的兴趣度

      这10名类似用户一共推荐了25名园友,计算获得兴趣度并排序:

排序 昵称 兴趣度
1 wolfy 0.373001923296126
2 Artech 0.340502612303499
3 Cat Chen 0.340502612303499
4 WXWinter(冬) 0.340502612303499
5 DanielWise 0.340502612303499
6 一路前行 0.31524416249564
7 Liam Wang 0.31524416249564
8 usharei 0.31524416249564
9 CoderZh 0.31524416249564
10 博客园团队 0.31524416249564
11 深蓝色右手 0.31524416249564
12 Kinglee 0.31524416249564
13 Gnie 0.31524416249564
14 riccc 0.31524416249564
15 Braincol 0.31524416249564
16 滴答的雨 0.31524416249564
17 Dennis Gao 0.31524416249564
18 刘冬.NET 0.31524416249564
19 李永京 0.31524416249564
20 浪端之渡鸟 0.31524416249564
21 李涛 0.31524416249564
22 阿不 0.31524416249564
23 JK_Rush 0.31524416249564
24 xiaotie 0.31524416249564
25 Leepy 0.312771621085612

      只须要按须要取类似度排名前10名就能够了,不过看起来整个列表的推荐质量都还不错!

参考

项亮:《推荐系统实践》

本文地址:http://www.cnblogs.com/technology/p/4467895.html

相关文章
相关标签/搜索