1. 程式人生 > >簡單的基於矩陣分解的推薦演算法-PMF, NMF

簡單的基於矩陣分解的推薦演算法-PMF, NMF

介紹:

推薦系統中最為主流與經典的技術之一是協同過濾技術(Collaborative Filtering),它是基於這樣的假設:使用者如果在過去對某些專案產生過興趣,那麼將來他很可能依然對其保持熱忱。其中協同過濾技術又可根據是否採用了機器學習思想建模的不同劃分為基於記憶體的協同過濾(Memory-based CF)與基於模型的協同過濾技術(Model-based CF)。其中基於模型的協同過濾技術中尤為矩陣分解(Matrix Factorization)技術最為普遍和流行,因為它的可擴充套件性極好並且易於實現,因此接下來我們將梳理下推薦系統中出現過的經典的矩陣分解方法。

 

矩陣分解:

首先對於推薦系統來說存在兩大場景即評分預測(rating prediction)與Top-N推薦(item recommendation,item ranking)。評分預測場景主要用於評價網站,比如使用者給自己看過的電影評多少分(MovieLens),或者使用者給自己看過的書籍評價多少分(Douban)。其中矩陣分解技術主要應用於該場景。Top-N推薦場景主要用於購物網站或者一般拿不到顯式評分資訊的網站,即通過使用者的隱式反饋資訊來給使用者推薦一個可能感興趣的列表以供其參考。其中該場景為排序任務,因此需要排序模型來對其建模。因此,我們接下來更關心評分預測任務。

對於評分預測任務來說,我們通常將使用者和專案(以電影為例)表示為二維矩陣的形式,其中矩陣中的某個元素表示對應使用者對於相應專案的評分,1-5分表示喜歡的程度逐漸增加,?表示沒有過評分記錄。推薦系統評分預測任務可看做是一個矩陣補全(Matrix Completion)的任務,即基於矩陣中已有的資料(observed data)來填補矩陣中沒有產生過記錄的元素(unobserved data)。值得注意的是,這個矩陣是非常稀疏的(Sparse),稀疏度一般能達到90%以上,因此如何根據極少的觀測資料來較準確的預測未觀測資料一直以來都是推薦系統領域的關鍵問題。

 

基礎背景:SVD 和 FunkSVD

SVD

當然SVD分解的形式為3個矩陣相乘,左右兩個矩陣分別表示使用者/專案隱含因子矩陣,中間矩陣為奇異值矩陣並且是對角矩陣,每個元素滿足非負性,並且逐漸減小。因此我們可以只需要前  個因子來表示它。

如果想運用SVD分解的話,有一個前提是要求矩陣是稠密的,即矩陣裡的元素要非空,否則就不能運用SVD分解。很顯然我們的任務還不能用SVD,所以一般的做法是先用均值或者其他統計學方法來填充矩陣,然後再運用SVD分解降維。

公式如下


 

FUNKSVD

SVD首先需要填充矩陣,然後再進行分解降維,同時由於需要求逆操作(複雜度O(n^3)),存在計算複雜度高的問題,所以後來Simon Funk提出了FunkSVD的方法,它不在將矩陣分解為3個矩陣,而是分解為2個低秩的使用者專案矩陣,同時降低了計算複雜度:

它借鑑線性迴歸的思想,通過最小化觀察資料的平方來尋求最優的使用者和專案的隱含向量表示。同時為了避免過度擬合(Overfitting)觀測資料,又提出了帶有L2正則項的FunkSVD:

SVD 和 FUNKSVD 的最優化函式都可以通過梯度下降或者隨機梯度下降法來尋求最優解。

 

 PMF:

 

 

PMF是對於FunkSVD的概率解釋版本,它假設評分矩陣中的元素  是由使用者潛在偏好向量 和物品潛在屬性向量 的內積決定的:

則觀測到的評分矩陣條件概率為:

 

 

同時,假設使用者偏好向量與物品偏好向量服從於均值都為0,方差分別為  ,  的正態分佈:

根據貝葉斯公式,可以得出潛變數U,V的後驗概率為:

 

接著,等式兩邊取對數  後得到:

 

最後,經過推導,我們可以發現PMF確實是FunkSVD的概率解釋版本,它兩個的形式一樣一樣的。

 

NMF

在普通的SVD的運算過程中,會得到一些負數的embedding,這裡,提出了一個假設:分解出來的小矩陣應該滿足非負約束。

因為在大部分方法中,原始矩陣  被近似分解為兩個低秩矩陣  相乘的形式,這些方法的共同之處是,即使原始矩陣的元素都是非負的,也不能保證分解出的小矩陣都為非負,這就導致了推薦系統中經典的矩陣分解方法可以達到很好的預測效能,但不能做出像User-based CF那樣符合人們習慣的推薦解釋(即跟你品味相似的人也購買了此商品)。在數學意義上,分解出的結果是正是負都沒關係,只要保證還原後的矩陣元素非負並且誤差儘可能小即可,但負值元素往往在現實世界中是沒有任何意義的。比如影象資料中不可能存在是負數的畫素值,因為取值在0~255之間;在統計文件的詞頻時,負值也是無法進行解釋的。因此提出帶有非負約束的矩陣分解是對於傳統的矩陣分解無法進行科學解釋做出的一個嘗試。

其中, 分解的兩個矩陣中的元素滿足非負約束。