協同過濾推薦(Collaborative Filtering Recommendation) 基於用戶的協同過濾分為兩個步驟: 1. 找到與目標用戶興趣相似的用戶集合 2. 找到這個集合中用戶喜歡的、並且目標用戶沒有聽說過的物品推薦給目標用戶 計算兩個用戶的興趣相似度: 設 N(u) 為用戶 u 喜 ...
協同過濾推薦(Collaborative Filtering Recommendation)
User-based CF: 基於User的協同過濾,通過不同用戶對Item的評分來評測用戶之間的相似性,根據用戶之間的相似性做出推薦;
基於用戶的協同過濾分為兩個步驟:
1. 找到與目標用戶興趣相似的用戶集合
2. 找到這個集合中用戶喜歡的、並且目標用戶沒有聽說過的物品推薦給目標用戶
計算兩個用戶的興趣相似度:
設 N(u) 為用戶 u 喜歡的物品集合,N(v) 為用戶 v 喜歡的物品集合:
Jaccard 公式:
餘弦相似度:
其中分母表示兩個向量b和c的長度,分子表示向量的內積。
在本例中,用戶A對物品{a,b,c}有過行為,用戶B對物品{a,c}有過行為,利用餘弦相似度公式計算用戶A和用戶B的興趣相似度,以及A和C、D的相似度:
向量A = {1,1,0,1,0};
向量B = {1,0,1,0,0};
如果兩兩用戶都利用餘弦相似度計算相似度。這種方法的時間複雜度是O(|U|*|U|),這在用戶數很大的情況下十分耗時。事實上,很多用戶相互之間並沒有相同的物品產生行為,即很多時候N(u)和N(v)的交集為0。那麼,一種高效的演算法就是首先計算出交集不為0的用戶對{u,v},然後再對這種情況除以分母|N(u)UN(v)|(或者另一種根號形式)。
為此,可以首先建立物品到用戶的 倒查表 ,對於每個物品都保存對該物品產生過行為的用戶列表。令繫數矩陣C[u][v]=|N(u)並N(v)|。那麼,假設用戶u和用戶v同時屬於倒排表中K個物品對應的用戶列表,就有C[u][v]=K。從而,可以掃描倒查表中每個物品對應的用戶列表,將用戶列表中的兩兩用戶對應的C[u][v]加1,最終就可以得到所有用戶之間不為0的C[u][v]。
建立的倒查表:
建立一個4*4的 用戶相似度矩陣W ,對於物品a,將W[A][B]和W[B][A]加1,對於物品b,將W[A][C]和W[C][A]加1,以此類推。掃描完所有物品後,我們可以得到最終的W矩陣。這裡的W是餘弦相似度中的分子部分,然後將W除以分母可以得到最終的用戶興趣相似度。
推薦物品:
首先需要從矩陣中找出與目標用戶 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 的喜歡程度是一樣的,在真實的推薦系統中,只要按得分排序,取前幾個物品就可以了。