推薦系統相關演算法 SVD

2022-03-25 16:28:11 字數 2334 閱讀 1460

假如要**zero君對一部電影m的評分,而手上只有zero君對若幹部電影的評分和風炎君對若幹部電影的評分(包含m的評分)。那麼能**出zero君對m的評分嗎?答案顯然是能。最簡單的方法就是直接將**分定為平均分。不過這時的準確度就難說了。本文將介紹一種比這個最簡單的方法要準上許多,並且也不算複雜的演算法。

svd(singular value decomposition)的想法是根據已有的評分情況,分析出評分者對各個因子的喜好程度以及電影包含各個因子的程度,最後再反過來根據分析結果**評分。電影中的因子可以理解成這些東西:電影的搞笑程度,電影的愛情愛得死去活來的程度,電影的恐怖程度。。。。。。svd的想法抽象點來看就是將乙個n行m列的評分矩陣r(r[u][i]代表第u個使用者對第i個物品的評分),分解成乙個n行f列的使用者因子矩陣p(p[u][k]表示使用者u對因子k的喜好程度)和乙個m行f列的物品因子矩陣q(q[i][k]表示第i個物品的因子k的程度)。用公式來表示就是

r = p * t(q)//t(q)表示q矩陣的轉置

下面是將評分矩陣r分解成使用者因子矩陣p與物品因子矩陣q的乙個例子。r的元素數值越大,表示使用者越喜歡這部電影。p的元素數值越大,表示使用者越喜歡對應的因子。q的元素數值越大,表示物品對應的因子程度越高。分解完後,就能利用p,q來**zero君對《七夜》的評分了。按照這個例子來看,zero君應該會給《七夜》較低的分數。因為他不喜歡恐怖片。注意不要糾結圖中的具體數值,因為那些數值是我隨便填上去的。

實際上,我們給一部電影評分時,除了考慮電影是否合自己口味外,還會受到自己是否是乙個嚴格的評分者和這部電影已有的評分狀況影響。例如:乙個嚴格評分者給的分大多數情況下都比乙個寬鬆評分者的低。你看到這部電影的評分大部分較高時,可能也傾向於給較高的分。在svd中,口味問題已經有因子來表示了,但是剩下兩個還沒有相關的式子表示。因此有必要加上相關的部分,提高模型的精準度。改進後的svd的公式如下:

r = overallmean + biasu + biasi + p * t(q)    (1)

其中overallmean表示所有電影的平均分,biasu表示使用者評分偏離overallmean的程度,biasi表示電影評分偏離overallmean的程度,p,q意思不變。特別注意,這裡除了overallmean之後,其它幾個都是矩陣。

分解完後,即(1)式中的五個引數都有了正確的數值後,就可以用來**分數了。假設我們要**使用者u對電影i的評分:

bu表示第u個使用者的偏離程度,bi表示第i部電影的偏離程度,pu表示第u個使用者的因子愛好程度,qi表示第i部電影的因子程度。

在第一部分的例子中,你也許會有疑問:明明評分矩陣有乙個元素的值是空的,為什麼還能得到兩個完整的矩陣p和q呢?原因是那兩個矩陣是通過學習(learning)得到的。svd使用隨機梯度下降(stochastic gradient descent)學習(1)式中除了overallmean之外的引數。學習過程可以概括成這樣:先給各個引數乙個初值,然後利用這些引數進行**,並將**結果與已知評分進行對比,最後根據對比結果修正各個引數。更準確點的說法是調整引數的值,使得以下式子能取到最小值:

alpha表示所有訓練樣本。被第乙個圓括號括著的部分表示當前的**結果與實際值的偏差。被第二個圓括號括著的部分是為了防止過擬合(overfitting)。

以上就是svd實現時的主要思想了,至於具體實現可以參考我的**。這個實現版本在movielens 1m上的效果比《a guide to singular value decomposition for collaborative filtering》中提到的要好一點點。這裡,我主要提一下實現svd時要注意的地方:

a. 更新qi時,要先儲存

b. **分數時,範圍要限制在最小值和最大值內

此外,這是我找到的一些有用的建議:

a. 所有引數的regularization 值是一樣的,不用特別區分bu, bi和 p,q

b. bu, bi不需要初始化,全部設成0

c. p,q應該的初始化,一般使用  0.1 * rand(0,1) / sqrt(dim)  dim指特徵的維數

1. netflix update: try this at home

2. a guide to singular value decomposition for collaborative filtering

3. matrix factorization techniques for recommender systems

推薦 SVD演算法

矩陣作用於向量的意義是 對向量進行旋轉和縮放,更加抽象的說,是將這個向量從一組正交基空間旋轉到另一組正交基空間,並縮放 對於實對稱矩陣,存在 m v i lambda v i即存在一組正交基,m的作用只是拉伸 對應特徵分解 但是對於更加一般的矩陣m m v i lambda u i即不同組正交基之間...

用於推薦系統的SVD演算法python實現

svd演算法python實現 之前看到一篇實現svd演算法的blog,但是實現方法沒有用到矩陣。為了更直觀簡便高效的實現svd演算法,在這裡基於numpy重新寫了一遍。這裡用到的演算法是優化下面這個目標函式 如下 引數 mat 輸入矩陣,feature latent factor數量 def svd...

SVD在推薦系統中的應用

其實說參考也不準確,準確地說應該是半翻譯半學習筆記。仔細整理一遍,感覺還是收穫很大的。任意乙個m n的矩陣a m行 n列,m n 可以被寫成三個矩陣的乘機 1.u m行m列的列正交矩陣 2.s m n的對角線矩陣,矩陣元素非負 3.v n n的正交矩陣的倒置 即a u s v 注意矩陣v需要倒置 直...