基於用戶的協同過濾推薦算法原理和實現

      在推薦系統衆多方法中,基於用戶的協同過濾推薦算法是最先誕生的,原理也較爲簡單。該算法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

相關文章
相關標籤/搜索