在推薦系統衆多方法中,基於用戶的協同過濾推薦算法是最先誕生的,原理也較爲簡單。該算法1992年提出並用於郵件過濾系統,兩年後1994年被 GroupLens 用於新聞過濾。一直到2000年,該算法都是推薦系統領域最著名的算法。html
本文簡單介紹基於用戶的協同過濾算法思想以及原理,最後基於該算法實現園友的推薦,即根據你關注的人,爲你推薦博客園中其餘你有可能感興趣的人。算法
俗話說「物以類聚、人以羣分」,拿看電影這個例子來講,若是你喜歡《蝙蝠俠》、《碟中諜》、《星際穿越》、《源代碼》等電影,另外有我的也都喜歡這些電影,並且他還喜歡《鋼鐵俠》,則頗有可能你也喜歡《鋼鐵俠》這部電影。網絡
因此說,當一個用戶 A 須要個性化推薦時,能夠先找到和他興趣類似的用戶羣體 G,而後把 G 喜歡的、而且 A 沒有據說過的物品推薦給 A,這就是基於用戶的系統過濾算法。3d
根據上述基本原理,咱們能夠將基於用戶的協同過濾推薦算法拆分爲兩個步驟:code
1. 找到與目標用戶興趣類似的用戶集合htm
2. 找到這個集合中用戶喜歡的、而且目標用戶沒有據說過的物品推薦給目標用戶blog
一般用 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。以下圖所示:
計算用戶兩兩之間的類似度,上面的矩陣僅僅表明的是公式的分子部分。以餘弦類似度爲例,對上圖進行進一步計算:
到此,計算用戶類似度就大功告成,能夠很直觀的找到與目標用戶興趣較類似的用戶。
首先須要從矩陣中找出與目標用戶 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 個園友。
因爲只是爲我一我的作用戶推薦,因此不必創建一個龐大的用戶兩兩之間類似度的矩陣了,與我興趣類似的園友只會在這個羣體產生:我關注的人的粉絲。除我本身以外,目前我一共關注了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 |
這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名就能夠了,不過看起來整個列表的推薦質量都還不錯!
項亮:《推薦系統實踐》