推薦演算法之用矩陣分解做協調過濾 LFM模型

2022-03-17 13:22:42 字數 3906 閱讀 9554

隱語義模型(latent factor model,以下簡稱lfm),是基於矩陣分解的推薦演算法,在其基本演算法上引入l2正則的funksvd演算法在推薦系統領域更是廣泛使用,在spark上也有其實現。本文將對 lfm原理進行詳細闡述,給出其基本演算法原理。此外,還將介紹使得隱語義模型聲名大噪的演算法funksvd和在其基礎上改進較為成功的biassvd。最後,對lfm進行乙個較為全面的總結。

在推薦系統中,我們經常可能面臨的場景是:現有大量使用者和物品,以及少部分使用者對少部分物品的評分,我們需要使用現有的使用者對少部分物品的評分去推測使用者對物品集中其他物品的可能的評分,從而將**中評分高的物品推薦給使用者。例如下面的使用者物品評分表:

使用者\物品

物品 1

物品 2

物品 3

物品 4

物品 5

使用者 132

使用者 212

6使用者 334

6使用者 412

5使用者 542

3對於每個使用者,我們希望較準確的**出其對未評分物品的評分。將m個使用者和n個物品的評分看做乙個矩陣m,從而將矩陣分解應用到該場景,即可解決這一問題。而本文,將關注於矩陣分解用於到推薦的方法之一,即lfm演算法的解決方案。

lfm演算法的核心思想是通過隱含特徵(latent factor)聯絡使用者和物品,該演算法最早在文字挖掘領域中被提出用於找到文字的隱含語義,相關名詞還有lda和topic model等。

在被問到這個問題時,針對movielens(電影評分)資料集,你可能會說使用者是否喜歡動作片,物品所屬電影型別去回答。但使用者對其他型別的電影的偏好程度呢?物品在其它型別所佔的權重又是多少呢?就算針對現有的電影型別去表徵使用者偏好和物品,那麼能否能夠完全的表示出使用者的偏好和物品屬性呢?答案是不能,比如使用者喜歡看成龍的電影這個偏好沒法表示出來,電影由誰導演,主演是誰沒法表示。但你要問我用哪些屬性去表徵呢?這個誰也無法給出乙個很好的答案,粒度很難控制。

隱語義模型較好的解決了該問題,它從資料出發,通過基於使用者行為統計的自動聚類,可指定出表徵使用者偏好和物品的向量維度,最終得到使用者的偏好向量以及物品的表徵向量。lfm通過以下公式計算使用者u對物品i的偏好:

\[preference(u, i)=p^t_u q_i=\sum_f^fq_}

\]這個公式,\(p_\)度量了使用者u的偏好和第f個隱類的關係,\(q_\)度量了物品i和第f個隱類的關係。

那麼現在,我們期望使用者的評分矩陣m這樣分解:

\[m_=p^t_q_

\]那麼,我們如何將矩陣分解呢?這裡採用了線性回歸的思想,即盡可能的讓使用者的評分和我們**的評分的殘差盡可能小,也就是說,可以用均方差作為損失函式來尋找最終的pq。考慮所有的使用者和樣本的組合,我們期望的最小化損失函式為:

\[\sum_-p_i^tq_j)^2}

\]只要我們能夠最小化上面的式子,並求出極值所對應的\(p_i\) 和\(q_j\),則我們最終可以得到矩陣pq,那麼對於任意矩陣m任意乙個空白評分的位置,我們就可以通過\(p^t_i q_j\)計算**評分。

上面是隱語義模型lfm的基本原理,但在實際業務中,為防止過擬合,我們常常會加入乙個l2的正則化項,這也就誕生了我們的funksvd演算法。其優化目標函式\(j(p,q)\)定義為:

\[\underbrace_\sum_-p^t_iq_j)^2+\lambda(\arrowvert}^2_2+\arrowvert}^2_2)}

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

將上式分別對\(p_i\)和\(q_j\)求導我們得到:

\[\frac}}=-2(m_-p^t_iq_j)q_j+2\lambda

\]\[\frac}}=-2(m_-p^t_iq_j)p_i+2\lambda

\]則梯度下降中迭代公式為:

\[p_i = p_i +\alpha((m_-p^t_iq_j)q_j-\lambda)

\]\[q_j = q_j+\alpha((m_-p^t_iq_j)p_i-\lambda)

\]通過迭代我們最終可以得到pq,進而用於推薦。

為讀者進一步理解,筆者實現了基於movielens資料集實現了該方法。**詳見github: funksvd演算法實現

biassvd是funksvd較為成功的改進版演算法。biassvd假設評分系統包括三部分的偏置因素:一些和使用者物品無關的評分因素。使用者有一些和物品無關的評分因素,稱為使用者偏置項。而物品也有一些和使用者無關的評分因素,稱為物品偏置項。這很好理解,對於樂觀的使用者來說,它的評分行為普遍偏高,而對批判性使用者來說,他的評分記錄普遍偏低,即使他們對同一物品的評分相同,但是他們對該物品的喜好程度卻並不一樣。同理,對物品來說,以電影為例,受大眾歡迎的電影得到的評分普遍偏高,而一些爛片的評分普遍偏低,這些因素都是獨立於使用者或產品的因素,而和使用者對產品的的喜好無關。

假設評分系統平均分為μ,第i個使用者的使用者偏置項為\(b_i\),而第j個物品的物品偏置項為\(b_j\),則加入了偏置項以後的優化目標函式\(j(p_i,q_j)\)是這樣的:

\[\underbrace_\sum_-p^t_iq_j-u-b_i-b_j)^2+\lambda(\arrowvert}^2_2+\arrowvert}^2_2+\arrowvert}^2_2+\arrowvert}^2_2)}

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

\[p_i = p_i +\alpha((m_-p^t_iq_j-u-b_i-b_j)q_j-\lambda)

\]\[q_j = q_j+\alpha((m_-p^t_iq_j-u-b_i-b_j)p_i-\lambda)

\]\[b_i=b_i+\alpha(m_-p^t_iq_j-u-b_i-b_j-\lambda)

\]\[b_j=b_j+\alpha(m_-p^t_iq_j-u-b_i-b_j-\lambda)

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

為讀者進一步理解,筆者實現了基於movielens資料集實現了該方法。**詳見github:biassvd演算法實現

lfm 是一種基於機器學習的方法,具有比較好的理論基礎,通過優化乙個設定的指標建立最優的模型。它實質上是矩陣分解應用到推薦的方法,其中funksvd更是將矩陣分解用於推薦方法推到了新的高度,在實際應用中使用非常廣泛。當然矩陣分解方法也在不停的進步,目前矩陣分解推薦演算法中分解機方法(factorization machine, fm)已成為乙個趨勢。

對於矩陣分解用於推薦方法本身來說,它容易程式設計實現,實現複雜度低,**效果也好,同時還能保持擴充套件性。這些都是其寶貴的優點。但是lfm無法給出很好的推薦解釋,它計算出的隱類雖然在語義上確實代表了一類興趣和物品,卻很難用自然語言描述並生成解釋展現給使用者。

lfm 在建模過程中,假設有 m * 個使用者、 n 個物品、 k 條使用者對物品的行為記錄,如果是 f 個隱類,那麼它離線計算的空間複雜度是 \(o(f*(m+n))\) ,迭代 s次則時間複雜度為 \(o(k * f * s)\)。當 m(使用者數量)和 n(物品數量)很大時lfm相對於itemcf和usercf可以很好地節省離線計算的記憶體,在時間複雜度由於lfm會多次迭代上所以和itemcf、usercf*沒有質的差別。

同時,遺憾的是,lfm

參考:

推薦演算法之基於使用者的協調過濾

基於使用者的的協調過濾演算法是推薦統統最古老的演算法,簡稱usercf。該演算法的誕生一定程度上標誌著推薦系統的誕生。本文將對usercf演算法原理進行講解,並且基於movielens資料集給出實現 供大家交流學習。找到和目標使用者興趣相似的使用者集合 找到這個集合中使用者喜歡的且目標使用者沒有聽說...

推薦系統 基於使用者的協調過濾

作為推薦系統 這一系列的第二篇文章,我們今天主要來聊一聊目前比較流行的一種推薦演算法 協調過濾 當然,這裡我們只講理論,並不會涉及到相關 或者相關框架的使用,在這一系列的後續文章,如果可能,我們可以將我們的所有理論知識整合一下,實踐乙個 推薦系統的 實戰。顧名思義,協同過濾就是指使用者可以齊心協力,...

推薦系統之基於使用者的協調過濾

在如何海量的資料時代,如何從海量的商品中選擇相關產品?在1100萬首itunes曲目中,肯定有一部分 是你特別喜愛的,那麼該如何找到它們呢?專家點評推薦 影評家 通過商品本身尋找 我喜歡披頭四的一張 所以會認為他們的另一張 也不錯 資料探勘不僅僅是用來推薦商品,或是單單給商人增加銷量,同時也能擴充套...