1. 程式人生 > >推薦系統-矩陣分解

推薦系統-矩陣分解

文章一

ref: https://blog.csdn.net/GZHermit/article/details/73920755

推薦任務定義:

在一個標準推薦任務中,我們有mm個使用者(user),nn個物品(item),以及一個稀疏評分矩陣R(R∈Rm∗n)R(R∈Rm∗n)。RR中每個RijRij表示使用者ii對於物品jj的評分。如果Rij≠0Rij≠0,那麼說明使用者ii有對物品jj的評分,反之則沒有。每一個使用者ii可以用向量sui=(Ri1,Ri2,...,Rin)siu=(Ri1,Ri2,...,Rin)表示,同樣地,每一個物品jj可以用向量sij=R1j,...,Rmjsji=R1j,...,Rmj表示。對於使用者和物品各自的邊資訊(side information)矩陣,則分別用X∈Rm∗pX∈Rm∗p和Y∈Rn∗qY∈Rn∗q表示。

設ui,vj∈Rkui,vj∈Rk,其中uiui為使用者ii的隱因子向量(latent factor vector),vjvj則是物品jj的隱因子向量(latent factor vector),kk是隱空間的維度。因而,對於使用者和物品來說,對應的隱因子向量形式分別是U=u1:mU=u1:m和V=v1:nV=v1:n。由於R=UVR=UV,所以如果能夠求出UU和VV的話,那麼我們可以求出一個非稀疏的評分矩陣RR出來。

給定一個稀疏的評分矩陣RR,以及邊資訊矩陣XX和YY,我們的目標是學習出UU和VV,從而預測出RR中缺失的評分。(這也叫矩陣的UV分解)


矩陣分解

矩陣分解的思想很簡單,對於使用者-物品這個評分矩陣RR,我們可以將其分解為使用者-特性矩陣,以及特性-物品矩陣。這樣做的好處有兩點: 
1. 得到了使用者的偏好,以及物品的特性 
2. 降低了矩陣的維度。 
舉個例子,比如音樂推薦。我們比如有3個使用者(u表示),4首音樂(m表示)。 

u1u2u3m1wum21m2wum12m3wum32m4m1m2m3m4u1w12umu2w21umu3w32um


可以想到,在真實的場景中,這個矩陣是極其稀疏的,對於龐大的音樂庫來說,每個使用者聽過的曲目都是極小的一部分。並且由於使用者數量和音樂數量極大,所以這個RR實際上是一個極大的矩陣。 
現在假設音樂的風格有以下幾類:搖滾,重金屬,民謠,說唱,輕音樂。分別用s1,s2,s3,s4,s5s1,s2,s3,s4,s5來表示。那麼我們希冀得到使用者對於風格偏好的矩陣QQ,以及每個風格在歌曲中所佔比重的矩陣PP。 

u1u2u3s1wus11wus21wus31s2wus12wus22wus32s3wus13wus23wus33s4wus14wus24wus34s5wus15wus25wus35s1s2s3s4s5m1wsm11wsm21wsm31wsm41wsm51m2wsm12wsm22wsm32wsm42wsm52m3wsm13wsm23wsm33wsm43wsm53m4wsm14wsm24wsm34wsm44wsm54s1s2s3s4s5u1w11usw12usw13usw14usw15usu2w21usw22usw23usw24usw25usu3w31usw32usw33usw34usw35usm1m2m3m4s1w11smw12smw13smw14sms2w21smw22smw23smw24sms3w31smw32smw33smw34sms4w41smw42smw43smw44sms5w51smw52smw53smw54sm


通過這兩個矩陣,我們就可以計算出uiuimimi的評分: 

wumij=∑h=15wusihwsmhj,5是音樂風格種類的數量wijum=∑h=15wihuswhjsm,5是音樂風格種類的數量


通過這種方式,我們即可補全矩陣R。

 

現在的問題是,如何求出矩陣QQ和PP呢? 
很簡單的做法,我們可以通過迭代的方式,逐步使得R~=QPTR~=QPT與R之間的距離變小。設定loss函式,然後使用梯度下降法。loss函式設定如下: 

arg minQ,P=L(R,QPT)+λ(||Q||2F+||P||2F)arg minQ,P=L(R,QPT)+λ(||Q||F2+||P||F2)


其中L(⋅,⋅)L(⋅,⋅)是衡量兩個矩陣之間距離的loss函式,而(||Q||2F+||P||2F)(||Q||F2+||P||F2)則是正則項,用來約束引數,避免過擬合。||⋅||F||⋅||F是F-範數。這就是最基本的矩陣分解的思想和做法,後面有更進一步,比如考慮多種因素的,引入歷史資訊的,引入時間資訊的。可以參見這篇部落格

 


F-範數:

設A=(aij)n∗n∈Cn∗nA=(aij)n∗n∈Cn∗n,令 

||A||F=(∑i=nn∑i=nn|aij|2)12||A||F=(∑i=nn∑i=nn|aij|2)12


||A||F||A||F是一種與向量的2-範數||x||2||x||2相容的方針範數,稱其為方陣A的Frobenius範數,簡稱F-範數。看這個形式,其實跟L2範數的計算方式一模一樣嘛。但是L2範數是沒有限制矩陣的形狀的,而F範數必須是個方陣。 
關於L2範數為什麼可以起到正則化的效果,可以參見這篇部落格,個人覺得講的非常好,淺顯易懂。佩服~

 

文章二

ref:https://www.tuicool.com/articles/RV3m6n

前言

最近一段時間隱語義模型(Latent Factor Model,LFM)在推薦系統中的應用越來越廣泛,本文所介紹的矩陣分解方法也是基於這個隱語義模型。

這裡需要說明的一點是,這裡所說的矩陣分解並不是SVD,之前在這個問題糾結了很久,因為網上很多人還有周圍的人都把矩陣分解就當成了SVD,實際上SVD也是矩陣分解的一種技術(SVD在推薦系統中的應用見 http://blog.csdn.net/wuyanyi/article/details/7964883 ,這篇才是真正的SVD推薦的方法,而其他很多網上所指的SVD就是本文所介紹的)。

基本思想

矩陣分解的思想簡單來說就是每一個使用者和每一個物品都會有自己的一些特性,用矩陣分解的方法可以從評分矩陣中分解出使用者——特性矩陣,特性——物品矩陣,這樣做的好處一是得到了使用者的偏好和每件物品的特性,二是見底了矩陣的維度。圖示如下:

用使用者對電影來舉例子就是:每個使用者看電影的時候都有偏好,這些偏好可以直觀理解成:恐怖,喜劇,動作,愛情等。使用者——特性矩陣表示的就是使用者對這些因素的喜歡程度。同樣,每一部電影也可以用這些因素描述,因此特性——物品矩陣表示的就是每一部電影這些因素的含量,也就是電影的型別。這樣子兩個矩陣相乘就會得到使用者對這個電影的喜歡程度。

形式化描述

由於評分矩陣的稀疏性(因為每一個人只會對少數的物品進行評分),因此傳統的矩陣分解技術不能完成矩陣的分解,即使能分解,那樣計算複雜度太高,不現實。因此通常的方法是使用已存在評分計算出出預測誤差,然後使用梯度下降調整引數使得誤差最小。

首先說明一些符號的含義:戴帽子的rui表示預測u對i的打分,qi表示物品i每個特性的歸屬度向量,pu表示使用者u對每個特性的喜歡程度的向量。因此,物品的預測得分為:

下面我們就需要根據已有的資料計算誤差並修正q和p使得誤差最小,誤差的表示方式如下:

(2)式子可以利用評分矩陣中存在的評分資料,使用隨機梯度下降方法進行引數的優化,在此不做介紹。注意第二項是正則式,是為了防止過擬合,具體原理也不太清楚。

計算完闡述後們對於未知的專案就可以使用(1)式子評分。

帶偏置的矩陣分解

上面的式子是最基本的矩陣分解思想,但實際情況下,卻並不是很好的衡量標準,比如有的網站中的使用者偏向評價高分;有一些使用者偏向評價高分(有的人比較寬容);有的物品被評價的分數偏高(也許由於等口碑原因)。因此在上面的式子中一般都會加入偏置項,u,bi,bu。綜合用下面的式子表示

結果預測式子變成如下:

誤差預測變成如下形式

帶標籤和歷史隱式反饋的矩陣分解

由於現實的評分矩陣特別稀疏,因此,為了使得資料更加稠密,下面加入了歷史的引述反饋資料(比如使用者瀏覽過瀏覽過某個電影就可以當做一定成的喜愛的正反饋),隱式反饋表現出來的偏好用下面的式子表示,其中xi表示歷史資料所表現出的偏好的向量,跟前面的向量維度相同。前面的權重表示這一項的可信任程度。

同樣,我們也可以使用使用者的標籤(比如年齡,性別,職業)推測使用者對每個因素的喜愛程度,形式化如下,ya表示標籤所表現出的偏好向量。

加入上面因素後的評分估計表示如下:

帶有時間因素的矩陣分解

現實生活中,我們每個人的愛好可能隨著時間的改變而改變,每個專案的平均評分也會改變。因此,專案的偏差(即專案高於平均分還是低於平均分)bi,使用者的評分習慣(即偏向於高分還是低分)bu,以及使用者的喜好矩陣pu都是時間的函式。為了更加準確的表達評分,都需要表示成為時間的函式形式,如下(這裡沒有考慮歷史標籤等資料):

小結

矩陣分解在推薦系統中現在用的很廣泛,主要是由於很好的擴充套件性,新的因素很容易新增到模型當中。並且網上有很多開源的庫實現演算法。 以上的內容根據這篇論文理解而來《MATRIX FACTORIZATION TECHNIQUES FOR RECOMMENDER SYSTEMS》

原文: 矩陣分解(MATRIX FACTORIZATION)在推薦系統中的應用