天天看點

基于使用者的協同過濾推薦算法原理和實作分析基本思想原理園友推薦

本文轉載自nieson  基于使用者的協同過濾推薦算法原理和實作

在推薦系統衆多方法中,基于使用者的協同過濾推薦算法是最早誕生的,原理也較為簡單。該算法1992年提出并用于郵件過濾系統,兩年後1994年被 GroupLens 用于新聞過濾。一直到2000年,該算法都是推薦系統領域最著名的算法。

      本文簡單介紹基于使用者的協同過濾算法思想以及原理,最後基于該算法實作園友的推薦,即根據你關注的人,為你推薦部落格園中其他你有可能感興趣的人。

基本思想

      俗話說“物以類聚、人以群分”,拿看電影這個例子來說,如果你喜歡《蝙蝠俠》、《碟中諜》、《星際穿越》、《源代碼》等電影,另外有個人也都喜歡這些電影,而且他還喜歡《鋼鐵俠》,則很有可能你也喜歡《鋼鐵俠》這部電影。

     是以說,當一個使用者 A 需要個性化推薦時,可以先找到和他興趣相似的使用者群體 G,然後把 G 喜歡的、并且 A 沒有聽說過的物品推薦給 A,這就是基于使用者的系統過濾算法。

原理

      根據上述基本原理,我們可以将基于使用者的協同過濾推薦算法拆分為兩個步驟:

1. 找到與目标使用者興趣相似的使用者集合

2. 找到這個集合中使用者喜歡的、并且目标使用者沒有聽說過的物品推薦給目标使用者

1. 發現興趣相似的使用者

      通常用 Jaccard 公式或者餘弦相似度計算兩個使用者之間的相似度。設 N(u) 為使用者 u 喜歡的物品集合,N(v) 為使用者 v 喜歡的物品集合,那麼 u 和 v 的相似度是多少呢:

      Jaccard 公式:

基于使用者的協同過濾推薦算法原理和實作分析基本思想原理園友推薦

      餘弦相似度:

基于使用者的協同過濾推薦算法原理和實作分析基本思想原理園友推薦

      假設目前共有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名就可以了,不過看起來整個清單的推薦品質都還不錯!

繼續閱讀