矩陣分解模型


導讀

最近在研究”基於時序行為的協同過濾算法“中重點提到了矩陣分解模型,因此總結下最近比較火的算法:矩陣分解模型。

經過kddcup和netflix比賽的多人多次檢驗,矩陣分解可以帶來更好的結果,而且可以充分地考慮各種因素的影響,有非常好的擴展性,因為要考慮多種因素的綜合作用,往往需要構造cost function來將矩陣分解問題轉化為優化問題,根據要考慮的因素為優化問題添加constraints,然后通過迭代的方法進行矩陣分解,原來評分矩陣中的missing vlaue可以通過分解后得到的矩陣求的。

本文將簡單介紹下最近學習到的矩陣分解方法。

1. PureSvd

開始學習機器學習算法時,覺得這種方法很神奇很數學,而且應用比較廣泛。但讀了Yehuda大神的paper之后,覺得這種方法還ok了。

其實,矩陣分解的核心是將一個非常稀疏的評分矩陣分解為兩個矩陣,一個表示user的特性,一個表示item的特性,將兩個矩陣中各取一行和一列向量做內積就可以得到對應評分。

那么如何將一個矩陣分解為兩個矩陣就是唯一的問題了。

說到這里大家就可能想起了在線代和數值分析中學到的各種矩陣分解方法,QR,Jordan,三角分解,SVD。。。

這里說說svd分解。

svd是將一個任意實矩陣分解為三個矩陣U,S,V,其中,U,V是兩個正交矩陣,稱為左右奇異矩陣,S是個對角陣,稱為奇異值矩陣。

其實svd分解的問題可以化解為特征值分解的問題。

評分矩陣A(m*n)=U(m*k)*S(k*k)*V'(k*n)

令B(m*m)=A(m*n)*A'(n*m)

B矩陣就是一個方陣,可以利用各種簡單的方法將B進行特征值分解:

Bv=av,

v是方陣B的特征向量,a是特征向量v對應的特征值。

所以奇異值s=sqrt(a),

左奇異向量u=A*v/s

同樣的方法可以求得右奇異向量。

這樣我們就得到了svd分解后的三個矩陣。(你可以自己寫個c程序計算,當然也可以用matlab算算得到)

分解后的三個矩陣都有着各自的意義,

U:每一行表示一個user的特征。

V:每一列表示一個item的特征。

S:表示對應的user和item的相關性。

所以可以考慮用U和V將S吸收進來,形成兩個矩陣分別表示user的矩陣和item的矩陣。

得到這個以后后面的事情就好辦了。

為什么說這個方法猥瑣呢?

因為我覺得,這種方法有着矩陣分解算法的表,卻可以非常簡單地完成矩陣的分解,然后填充稀疏的評分矩陣。

但它考慮的因素太少了,不過對於簡單的推薦系統,這種方法還是非常有意義的,容易實現,而且結果也不會太差。

2.  Latent Factor Model

這是真正的矩陣分解算法,經過實踐檢驗,具有非常高的准確性和易擴展性。

正如上面提到的,實現推薦系統結果的目標是將那個稀疏的評分矩陣分解成兩個矩陣,一個表示user的feature,一個表示item的feature,然后做內積得到預測。

當然要實現滿足一定約束條件的矩陣分解,可不像上面的PureSVD那樣容易,需要構造一個優化問題,用一些復雜的算法求解優化問題。而這些優化問題往往是NP問題,只有局部最優解。

首先構造一個優化目標函數,

考慮到最后的評價指標是預測分值和實際分值之間的誤差的平方(RMSE),所以構造的目標函數也是誤差的平方的函數。

為什么這樣的算法可以得到更優的結果呢?因為算法可以很容易地擴展很多的feature進來,更加出色地考慮了多種影響推薦效果的實實在在的因素。

  • Biases

因為有的用戶總是會打出比別人高的分,或者說有的用戶他的評價尺度比較寬松;同樣有的item總是被打高分。這是一個普遍存在的問題,所以在構造目標函數的時候需要增加幾項:所有評分的平均值miu,user的偏見分數bu,item的偏見分數bi。

比如:求用戶x對電影y的打分,

所有評分電影的評分的平均分是miu=3.5,

電影y比所有評分電影平均分高bi=0.5

但是用戶x是個比較嚴格的用戶,評分總是相對偏低,所以bu=-0.3

所以用戶x對電影y的打分為3.7

  • Implicit feedback

用戶在使用web應用的時候,會產生大量的行為,充分挖掘這部分的價值,將會很好地提升推薦的效果。

利用用戶的隱式反饋,相當於充分的利用了評分矩陣中的missing value的價值,用戶在頁面的停留時間,檢索,瀏覽,點擊等等各種行為都可以建模,內含到目標函數中。

這里,可以將簡單地用一個Boolean來描述一種行為有還是沒有。

不過在使用的時候,需要進行歸一化處理。

  • User-associated attributes

基於用戶的社會化屬性進行推薦也是一種很基本的推薦,當然也可以考慮到目標函數中。

  • Temporal dynamics

用戶的興趣包括長期和短期,動態地考慮一段時間內用戶的興趣是很有必要的。

上面的幾個因素中隨着時間變化的有,user的bias項bu=bu(t),item的bias項bi=bi(t),以及user的factor向量pu=pu(t),這里可以忽略item的factor向量的變化,因為item是比較穩定的。

  • Confidence level

因為在處理上述的因素的時候,很多都是比較主觀的,所以需要給每個因素添加一個置信權重,以平衡整個結果。

通過構造出這個目標函數,然后添加相應的約束條件,接下來的問題就是求解這個優化問題。

通常比較好的方法是Stochastic gradient desent。

3.  NMF(非負矩陣分解)

很多人用這種方法是因為他們覺得只有一個非負的值對於實際的例子才會有意義。

考慮到svd或者latent factor model會得到負的值,所以這種方法的物理意義比較明確。

同樣的道理,NMF也是將評分矩陣的轉置矩陣分解成兩個矩陣。

不同的是這兩個矩陣有着和上面的矩陣不同的物理意義。

其中一個是基矩陣W,另一個是投影矩陣H,即R'(n*m)=W(n*r)*H(r*m)

W:每一列包含一個基向量,這組基向量構成一個r維的空間。

H:每一列則近似為原始數據對應的列向量在該r維空間的投影。

做這個分解的方法也是構造一個目標函數和一些約束條件,然后用梯度下降的算法來計算得到一個局部最優解。

這種方法的思路大概是這樣的:

  1. 將評分矩陣轉置然后分解成兩個矩陣W和H。
  2. 根據基矩陣W,可以計算得到目標用戶評分向量a對基矩陣W的投影向量h。
  3. 計算投影向量h與投影矩陣H各行之間的歐式距離,將其中距離最小的前k個用戶組成目標用戶a的最近鄰集合。
  4. 然后用皮爾遜相關法將最近鄰集合中的數據進行加權計算,然后排序進行推薦。

可以看出來,這種方法的思路和上面的兩種還是很不相同的,主要還是在計算目標用戶的最近鄰集合,主要思想還是knn,只是在中間用了矩陣分解的方法降維降低了計算的時間復雜度。

小結

矩陣分解在研究生學習的時候感覺既沒用又麻煩,尤其是線代里面做矩陣的分解計算。現在看來,矩陣分解非常有意義!

參考資料

Yehuda的神作 http://ccnt.zju.edu.cn:8080/smart/files/20120915-3.pdf

上海交大在2012年kddcup獲獎方法的paper以及他們的開源系統 http://svdfeature.apexlab.org/wiki/Main_Page


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM