協同過濾演算法
矩陣分解
協同過濾與矩陣分解的關係
早期的推薦系統以業務理解為核心,通過複雜的規則描述來向使用者推薦商品,這種做法具有透明性高、可移植性差、維護成本高、泛化能力差等特點。在這樣乙個背景下,協同過濾演算法在amazon推薦系統中的成功落地成為了當時的焦點。
要理解協同過濾演算法必須理解其中的兩個關鍵名詞:共現矩陣和相似矩陣。
共現矩陣的行座標為使用者、列座標為物品,矩陣中的值代表某個使用者對某個物品的評分值(在不同的業務背景下該評分具有不同的實際意義)。
相似矩陣的定義在usercf中是使用者到使用者的相似度矩陣,在itemcf中則是物品到物品的相似度矩陣。
協同過濾的過程可以大致分為兩個階段:
離線階段:根據共現矩陣計算出相似度矩陣。
現假設從歷史資料中可以獲得m個使用者對n個物品的正負反饋,將其轉化成共現矩陣。
資料:使用者到物品的評分矩陣,即乙個 mxn 的共現矩陣。
目標:計算出 mxm 的使用者相似度矩陣,或者 nxn 的物品相似度矩陣。
資料:乙個 mxn 的共現矩陣,mxm 的使用者相似度矩陣或者 nxn的物品相似度矩陣。
usercf:根據使用者相似度矩陣,找出與使用者a最相似的top m個使用者,然後用下面的偽**計算出該使用者對不同物品的評價**
# 計算出usera對每個候選item的得分
item_scores = {}
for item in 候選物品集:
sim_sum = 0
for sim_user in m個最相似的使用者:
item_scores[item] += sim_user對item的評分 * sim_user與usera的相似度
sim_sum += sim_user與usera的相似度
item_scores[item] /= sim_sum
# 找出按score倒排找出top k個item,**忽略
itemcf:假設使用者a的正反饋物品集為h,根據物品相似度矩陣,然後用下面的偽**計算出該使用者的top k
# 計算出usera對每個候選item的得分
item_scores = {}
for item in 候選物品集:
for item_h in 使用者a的正反饋物品集h:
item_scores[item] += 使用者a對item_h的評分 * item與item_h的相似度
# 找出按score倒排找出top k個item,**忽略
usercf在「使用者對物品的興趣點比較分散和稀疏」的場景中比itemcf表現更好,例如新聞推薦。
usercf需要離線對整個使用者群體進行相似度矩陣的計算,從計算成本和儲存成本上考慮都不太適合使用者數量級遠大於item數量級的場景(如**推薦),itemcf會更適合這類場景。
協同過濾的計算方式決定了它推薦出來的物品往往集中在頭部那些**多的熱門商品,即頭部效應嚴重,從長期的角度上並不利於推薦池的多樣性。
協同過濾演算法在使用者、商品達到一定數量級之後,會面臨著共現矩陣非常稀疏的問題,而協同過濾在稀疏性較強的資料中難以挖掘到使用者真正的潛在興趣。
為了解決協同過濾存在的泛化效能不強的特點,矩陣分解法被提出。
矩陣分解的含義是在協同過濾演算法中的共現矩陣的基礎上,加入隱向量的概念,加強了模型處理稀疏矩陣的能力。假設m個使用者n個物品,共現矩陣為 mxn 維,那麼矩陣分解演算法最終會將共現矩陣拆成乙個 mxf的使用者向量矩陣和乙個 nxf的物品向量矩陣(f即隱向量的長度),實際推薦過程中可以直接用線上請求的使用者與候選集的物品進行相似度計算,再取top k。
矩陣分解的過程是怎麼樣的呢?在具體的演算法實現上,矩陣分解主要有三種實現方法。
特徵值分解
奇異值分解(svd)
梯度下降
其中特徵值分解只能用於方陣,不適用於大部分場景下的矩陣分解。
奇異值分解的計算方法在這裡不詳細介紹,它會將乙個mxn的矩陣表示成mxm矩陣、mxn對角陣和nxn矩陣的乘積,然後取對角陣的對角線上前f大的元素,使得mxn的矩陣被分解為mxf、fxf和fxn三個矩陣的乘積,也就得到了使用者和物品的向量矩陣。奇異值分解的方法本質上要求共現矩陣是稠密的(但大多數網際網路場景下使用者的行為都是稀疏的),並且時間複雜度為
,在使用者量和物品數量很大的情況下計算的時間成本非常高。
梯度下降法是矩陣分解的主流方法,梯度下降法的過程可以概括為以下幾步:
確定待優化引數,**值
假設 為使用者向量矩陣,
為物品向量矩陣,那麼**值就是
, 為使用者u對物品i的評分。
2. 確定目標函式
這裡用均方誤差,目標函式為
為了防止模型在區域性引數上過擬合,我們加入正則化項
3. 求偏導,得梯度
對 求偏導,得到的結果為
對 求偏導,得到的結果為
4. 利用梯度的反方向對引數進行更新,從i步到i+1步為
其中 為學習率
協同過濾演算法以使用者或物品為單位,找出乙個相似的群體,以該群體的整體偏好來估計當前使用者的偏好。矩陣分解則借助隱變數,將整個共現矩陣在隱變數的空間內進行描述,用相似度來計算使用者對某個商品的興趣程度。後者在前者的基礎上有以下幾個點做出了改進:
泛化效能強,解決了資料稀疏的問題。協同過濾演算法,以itemcf為例,是以日誌中使用者有過正反饋的物品集來刻畫使用者的興趣的,如果使用者只對極少數物品有過正反饋,那麼利用itemcf的方法來進行推薦對使用者興趣的刻畫是不準確的(usercf中則體現在使用者的相似度計算不夠準確)。而矩陣分解則以隱變數來刻畫使用者的興趣,由於所有使用者隱變數的定義都是統一的,所以在計算的過程中,隱變數是可以在所有樣本上進行更新的。
拓展性強,中間產物更加靈活。協同過濾演算法的中間產物是相似度矩陣,而矩陣分解的產物是使用者和物品的向量。相似度矩陣只能用於直接計算推薦結果,但是使用者向量和物品向量卻還可以進行聚類分析或者作為embedding特徵輸入到其他模型當中。
空間複雜度由、
降到了
推薦系統 協同過濾
這是我學習推薦系統的筆記,主要參考的是51cto的一系列文章和人們郵電出版的 推薦系統實踐 首先說一下什麼是協同過濾。假如某寶要向你推薦一些商品,當然這些商品不是隨隨便便推薦的,推給你了就是引誘你去買,咱能賺到錢。那麼什麼樣的商品你有可能去買呢?系統或演算法怎麼找到這些商品呢?協同過濾就是幹這個的。...
推薦系統 協同過濾演算法
協同過濾,collaborative filtering,簡稱cf,廣泛應用於如今的推薦系統中。通過協同過濾演算法,可以算出兩個相似度 user user相似度矩陣 item item相似度矩陣。為什麼叫做協同過濾?是因為這兩個相似度矩陣是通過對方來計算出來的。舉個栗子 100個使用者同時購買了兩種...
推薦系統之協同過濾
協同過濾 collaborative filtering,簡稱cf 是目前最為流行的推薦演算法,它是根據具有相同興趣與生活經驗的群體的共同愛好推薦與使用者需求相符合的商品。在推薦過程中 cf演算法首先將使用者對於專案的評分矩陣作為輸入,輸入資料通過 cf 演算法計算出使用者或者專案的相似度,生成推薦...