394
汽車大全
推薦係統-基於矩陣分解的LFM模型
這裏我想給大家介紹另外一種推薦係統,這種算法叫做潛在因子(Latent Factor)算法。這種算法是在NetFlix(沒錯,就是用大數據捧火《紙牌屋》的那家公司)的推薦算法競賽中獲獎的算法,最早被應用於電影推薦中。這種算法在實際應用中比現在排名第一的 @邰原朗 所介紹的算法誤差(RMSE)會小不少,效率更高。我下麵僅利用基礎的矩陣知識來介紹下這種算法。
這種算法的思想是這樣:每個用戶(user)都有自己的偏好,比如A喜歡帶有小清新的、吉他伴奏的、王菲等元素(latent factor),如果一首歌(item)帶有這些元素,那麼就將這首歌推薦給該用戶,也就是用元素去連接用戶和音樂。每個人對不同的元素偏好不同,而每首歌包含的元素也不一樣。我們希望能找到這樣兩個矩陣:
一.用戶-潛在因子矩陣Q,
表示不同的用戶對於不用元素的偏好程度,1代表很喜歡,0代表不喜歡。比如下麵這樣:
二.潛在因子-音樂矩陣P
表示每種音樂含有各種元素的成分,比如下表中,音樂A是一個偏小清新的音樂,含有小清新這個Latent Factor的成分是0.9,重口味的成分是0.1,優雅的成分是0.2……
利用這兩個矩陣,我們能得出張三對音樂A的喜歡程度是:張三對小清新的偏好*音樂A含有小清新的成分+對重口味的偏好*音樂A含有重口味的成分+對優雅的偏好*音樂A含有優雅的成分+……
即:0.6*0.9+0.8*0.1+0.1*0.2+0.1*0.4+0.7*0=0.69
每個用戶對每首歌都這樣計算可以得到不同用戶對不同歌曲的評分矩陣。(注,這裏的破浪線表示的是估計的評分,接下來我們還會用到不帶波浪線的R表示實際的評分):
因此我們隊張三推薦四首歌中得分最高的B,對李四推薦得分最高的C,王五推薦B。
如果用矩陣表示即為:
下麵問題來了,這個潛在因子(latent factor)是怎麼得到的呢?
由於麵對海量的讓用戶自己給音樂分類並告訴我們自己的偏好係數顯然是不現實的,事實上我們能獲得的數據隻有用戶行為數據。我們沿用 @邰原朗的量化標準:單曲循環=5, 分享=4, 收藏=3, 主動播放=2 , 聽完=1, 跳過=-2 , 拉黑=-5,在分析時能獲得的實際評分矩陣R,也就是輸入矩陣大概是這個樣子:

事實上這是個非常非常稀疏的矩陣,因為大部分用戶隻聽過全部音樂中很少一部分。如何利用這個矩陣去找潛在因子呢?這裏主要應用到的是矩陣的UV分解。也就是將上麵的評分矩陣分解為兩個低維度的矩陣,用Q和P兩個矩陣的乘積去估計實際的評分矩陣,而且我們希望估計的評分矩陣



這兩個矩陣相乘就可以得到估計的得分矩陣:

在這個例子裏麵用戶7和用戶8有強的相似性:
從推薦的結果來看,正好推薦的是對方評分較高的音樂:

###########################################################################################
具體公式:
下麵我們就來看看LFM是如何解決上麵的問題的?對於一個給定的用戶行為數據集(數據集包含的是所有的user, 所有的item,以及每個user有過行為的item列表),使用LFM對其建模後,我們可以得到如下圖所示的模型:(假設數據集中有3個user, 4個item, LFM建模的分類數為4)

R矩陣是user-item矩陣,矩陣值Rij表示的是user i 對item j的興趣度,這正是我們要求的值。對於一個user來說,當計算出他對所有item的興趣度後,就可以進行排序並作出推薦。LFM算法從數據集中抽取出若幹主題,作為user和item之間連接的橋梁,將R矩陣表示為P矩陣和Q矩陣相乘。其中P矩陣是user-class矩陣,矩陣值Pij表示的是user i對class j的興趣度;Q矩陣式class-item矩陣,矩陣值Qij表示的是item j在class i中的權重,權重越高越能作為該類的代表。所以LFM根據如下公式來計算用戶U對物品I的興趣度

我們發現使用LFM後,
- 我們不需要關心分類的角度,結果都是基於用戶行為統計自動聚類的,全憑數據自己說了算。
- 不需要關心分類粒度的問題,通過設置LFM的最終分類數就可控製粒度,分類數越大,粒度約細。
- 對於一個item,並不是明確的劃分到某一類,而是計算其屬於每一類的概率,是一種標準的軟分類。
- 對於一個user,我們可以得到他對於每一類的興趣度,而不是隻關心可見列表中的那幾個類。
- 對於每一個class,我們可以得到類中每個item的權重,越能代表這個類的item,權重越高。
那麼,接下去的問題就是如何計算矩陣P和矩陣Q中參數值。一般做法就是最優化損失函數來求參數。在定義損失函數之前,我們需要準備一下數據集並對興趣度的取值做一說明。
數據集應該包含所有的user和他們有過行為的(也就是喜歡)的item。所有的這些item構成了一個item全集。對於每個user來說,我們把他有過行為的item稱為正樣本,規定興趣度RUI=1,此外我們還需要從item全集中隨機抽樣,選取與正樣本數量相當的樣本作為負樣本,規定興趣度為RUI=0。因此,興趣的取值範圍為[0,1]。
采樣之後原有的數據集得到擴充,得到一個新的user-item集K={(U,I)},其中如果(U,I)是正樣本,則RUI=1,否則RUI=0。損失函數如下所示:

上式中的是用來防止過擬合的正則化項,λ需要根據具體應用場景反複實驗得到。損失函數的優化使用隨機梯度下降算法:
- 通過求參數PUK和QKI的偏導確定最快的下降方向;

- 迭代計算不斷優化參數(迭代次數事先人為設置),直到參數收斂。

其中,α是學習速率,α越大,迭代下降的越快。α和λ一樣,也需要根據實際的應用場景反複實驗得到。本書中,作者在MovieLens數據集上進行實驗,他取分類數F=100,α=0.02,λ=0.01。
綜上所述,執行LFM需要:
- 根據數據集初始化P和Q矩陣(這是我暫時沒有弄懂的地方,這個初始化過程到底是怎麼樣進行的,還懇請各位童鞋予以賜教。)
- 確定4個參數:分類數F,迭代次數N,學習速率α,正則化參數λ。
1.相關文檔
https://blog.csdn.net/sinat_33741547/article/details/52976391
https://www.cnblogs.com/tbiiann/p/6535189.html
https://www.cnblogs.com/hxsyl/p/4885372.html
最後更新:2017-08-13 22:47:20