矩陣分解在協同過濾推薦演算法中的應用

2022-03-17 06:03:23 字數 3687 閱讀 8625

在推薦系統中,我們常常遇到的問題是這樣的,我們有很多使用者和物品,也有少部分使用者對少部分物品的評分,我們希望**目標使用者對其他未評分物品的評分,進而將評分高的物品推薦給目標使用者。比如下面的使用者物品評分表:

使用者\物品

物品1物品2

物品3物品4

物品5物品6

物品7使用者135

1使用者224

使用者34

使用者42

1使用者514

對於每個使用者,我們希望較準確的**出使用者對未評分物品的評分。對於這個問題我們有很多解決方法,本文我們關注於用矩陣分解的方法來做。如果將m個使用者和n個物品對應的評分看做乙個矩陣$m$,我們希望通過矩陣分解來解決這個問題。

說道矩陣分解,我們首先想到的就是奇異值分解svd。在奇異值分解(svd)原理與在降維中的應用中,我們對svd原理做了總結。如果大家對svd不熟悉的話,可以翻看該文。

此時可以將這個使用者物品對應的$m \times n$矩陣$m$進行svd分解,並通過選擇部分較大的一些奇異值來同時進行降維,也就是說矩陣$m$此時分解為:$$m_=u_\sigma_v_^t $$  

其中k是矩陣$m$中較大的部分奇異值的個數,一般會遠遠的小於使用者數和物品樹。如果我們要**第i個使用者對第j個物品的評分$m_$,則只需要計算$u_i^t\sigma v_j$即可。通過這種方法,我們可以將評分表裡面所有沒有評分的位置得到乙個**評分。通過找到最高的若干個評分對應的物品推薦給使用者。

可以看出這種方法簡單直接,似乎很有吸引力。但是有乙個很大的問題我們忽略了,就是svd分解要求矩陣是稠密的,也就是說矩陣的所有位置不能有空白。有空白時我們的$m$是沒法直接去svd分解的。大家會說,如果這個矩陣是稠密的,那不就是說我們都已經找到所有使用者物品的評分了嘛,那還要svd幹嘛! 的確,這是乙個問題,傳統svd採用的方法是對評分矩陣中的缺失值進行簡單的補全,比如用全域性平均值或者用使用者物品平均值補全,得到補全後的矩陣。接著可以用svd分解並降維。

雖然有了上面的補全策略,我們的傳統svd在推薦演算法上還是較難使用。因為我們的使用者數和物品一般都是超級大,隨便就成千上萬了。這麼大乙個矩陣做svd分解是非常耗時的。那麼有沒有簡化版的矩陣分解可以用呢?我們下面來看看實際可以用於推薦系統的矩陣分解。

funksvd是在傳統svd面臨計算效率問題時提出來的,既然將乙個矩陣做svd分解成3個矩陣很耗時,同時還面臨稀疏的問題,那麼我們能不能避開稀疏問題,同時只分解成兩個矩陣呢?也就是說,現在期望我們的矩陣$m$這樣進行分解:$$m_=p_^tq_$$

我們知道svd分解已經很成熟了,但是funksvd如何將矩陣$m$分解為$p$和$q$呢?這裡採用了線性回歸的思想。我們的目標是讓使用者的評分和用矩陣乘積得到的評分殘差盡可能的小,也就是說,可以用均方差作為損失函式,來尋找最終的$p$和$q$。

對於某乙個使用者評分$m_$,如果用funksvd進行矩陣分解,則對應的表示為$q_j^tp_i$,採用均方差做為損失函式,則我們期望$(m_-q_j^tp_i)^2$盡可能的小,如果考慮所有的物品和樣本的組合,則我們期望最小化下式:$$\sum\limits_(m_-q_j^tp_i)^2$$

只要我們能夠最小化上面的式子,並求出極值所對應的$p_i, q_j$,則我們最終可以得到矩陣$p$和$q$,那麼對於任意矩陣$m$任意乙個空白評分的位置,我們可以通過$q_j^tp_i$計算**評分。很漂亮的方法!

當然,在實際應用中,我們為了防止過擬合,會加入乙個l2的正則化項,因此正式的funksvd的優化目標函式$j(p,q)$是這樣的:$$\underbrace_\;\sum\limits_(m_-q_j^tp_i)^2 + \lambda(||p_i||_2^2 + ||q_j||_2^2 ) $$

其中$\lambda$為正則化係數,需要調參。對於這個優化問題,我們一般通過梯度下降法來進行優化得到結果。

將上式分別對$p_i, q_j$求導我們得到:$$\frac = -2(m_-q_j^tp_i)q_j + 2\lambda p_i$$$$\frac = -2(m_-q_j^tp_i)p_i + 2\lambda q_j$$ 

則在梯度下降法迭代時,$p_i, q_j$的迭代公式為: $$p_i = p_i + \alpha((m_-q_j^tp_i)q_j - \lambda p_i)$$$$q_j =q_j +  \alpha((m_-q_j^tp_i)p_i - \lambda q_j)$$

通過迭代我們最終可以得到$p$和$q$,進而用於推薦。funksvd演算法雖然思想很簡單,但是在實際應用中效果非常好,這真是驗證了大道至簡。

在funksvd演算法火爆之後,出現了很多funksvd的改進版演算法。其中biassvd算是改進的比較成功的一種演算法。biassvd假設評分系統包括三部分的偏置因素:一些和使用者物品無關的評分因素,使用者有一些和物品無關的評分因素,稱為使用者偏置項。而物品也有一些和使用者無關的評分因素,稱為物品偏置項。這其實很好理解。比如乙個垃圾山寨貨評分不可能高,自帶這種爛屬性的物品由於這個因素會直接導致使用者評分低,與使用者無關。

假設評分系統平均分為$\mu$,第i個使用者的使用者偏置項為$b_i$,而第j個物品的物品偏置項為$b_j$,則加入了偏置項以後的優化目標函式$j(p,q)$是這樣的$$\underbrace_\;\sum\limits_(m_-\mu-b_i-b_j-q_j^tp_i)^2 + \lambda(||p_i||_2^2 + ||q_j||_2^2 + ||b_i||_2^2 + ||b_j||_2^2) $$

這個優化目標也可以採用梯度下降法求解。和funksvd不同的是,此時我們多了兩個偏執項$b_i,b_j$,,$p_i, q_j$的迭代公式和funksvd類似,只是每一步的梯度導數稍有不同而已,這裡就不給出了。而$b_i,b_j$一般可以初始設定為0,然後參與迭代。這裡給出$b_i,b_j$的迭代方法$$b_i = b_i + \alpha(m_-\mu-b_i-b_j-q_j^tp_i -\lambda b_i)$$$$b_j = b_j + \alpha(m_-\mu-b_i-b_j-q_j^tp_i -\lambda b_j)$$

通過迭代我們最終可以得到$p$和$q$,進而用於推薦。biassvd增加了一些額外因素的考慮,因此在某些場景會比funksvd表現好。

svd++演算法在biassvd演算法上進一步做了增強,這裡它增加考慮使用者的隱式反饋。好吧,乙個簡單漂亮的funksvd硬是被越改越複雜。

對於某乙個使用者i,它提供了隱式反饋的物品集合定義為$n(i)$, 這個使用者對某個物品j對應的隱式反饋修正的評分值為$c_$, 那麼該使用者所有的評分修正值為$\sum\limits_c_$。一般我們將它表示為用$q_s^ty_i$形式,則加入了隱式反饋項以後的優化目標函式$j(p,q)$是這樣的:$$\underbrace_\;\sum\limits_(m_-\mu-b_i-b_j-q_j^tp_i - q_j^t|n(i)|^\sum\limits_q_)^2+ \lambda(||p_i||_2^2 + ||q_j||_2^2 + ||b_i||_2^2 + ||b_j||_2^2 + \sum\limits_||q_||_2^2) $$

其中,引入$|n(i)|^$是為了消除不同|n(i)|個數引起的差異。式子夠長的,不過需要考慮使用者的隱式反饋時,使用svd++還是不錯的選擇。

funksvd將矩陣分解用於推薦方法推到了新的高度,在實際應用中使用也是非常廣泛。當然矩陣分解方法也在不停的進步,目前張量分解和分解機方法是矩陣分解推薦方法今後的乙個趨勢。

對於矩陣分解用於推薦方法本身來說,它容易程式設計實現,實現複雜度低,**效果也好,同時還能保持擴充套件性。這些都是它寶貴的優點。當然,矩陣分解方法有時候解釋性還是沒有基於概率的邏輯回歸之類的推薦演算法好,不過這也不影響它的流形程度。小的推薦系統用矩陣分解應該是乙個不錯的選擇。大型的話,則矩陣分解比起現在的深度學習的一些方法不佔優勢。

矩陣分解在協同過濾推薦演算法中的應用和理解

協同過濾所要達到的目的是將整個user item矩陣中空白的位置來 出值,矩陣分解可以滿足這一要求,將原矩陣分解成兩個或者三個子矩陣,然後再相乘得到乙個新的矩陣,這個新的矩陣就是最終 要 的矩陣 個人理解 svd分解要求矩陣是稠密的,而在user item矩陣中往往比較稀疏,所以不太適用funksv...

協同過濾推薦演算法 協同過濾推薦演算法總結

推薦演算法具有非常多的應用場景和商業價值,因此對推薦演算法值得好好研究。推薦演算法種類很多,但是目前應用最廣泛的應該是協同過濾類別的推薦演算法,本文就對協同過濾類別的推薦演算法做乙個概括總結,後續也會對一些典型的協同過濾推薦演算法做原理總結。推薦演算法概述 1 基於內容的推薦 這一類一般依賴於自然語...

協同過濾與矩陣分解

生成共現矩陣。假設有m個使用者,n個物品,每個使用者會對n個物品中的乙個或者幾個進行評分,未評分的物品分值就用問號表示,則所有m個使用者對物品的評分可形成乙個m n m nm n的評分矩陣,也就是協同過濾中的共現矩陣。生成共現矩陣後,推薦問題就轉換成了 矩陣中問號的值的過程。利用使用者相似度和相似使...