協(xié)同過濾一般分為兩大類:一類為基于領域(記憶)的方法,第二類為基于模型的方法,即隱語義模型口糕,矩陣分解模型是隱語義模型最為成功的一種實現搞挣。隱語義模型最早在文本挖掘領域被提出带迟,用于尋找文本的隱含語義,相關的模型常見的有潛在語義分析(Latent Semantic Analysis,LSA)囱桨、LDA(Latent Dirichlet Allocation)的主題模型(Topic Model)仓犬、矩陣分解(Matrix Factorization)等等。本文主要介紹的是矩陣分解中SVD相關的方法舍肠。
大綱
- 傳統(tǒng)的SVD
- FunkSVD
- FunkSVD在協(xié)同過濾中的應用
- 基于SVD的其他改進方法
1. SVD簡介
在推薦系統(tǒng)中搀继,我們根據用戶行為通常可以得到user-item的評分矩陣貌夕。由于每個用戶可能只在少部分商品上有歷史行為律歼,因此評分矩陣往往是稀疏的,如下:
user\item | item1 | item2 | item3 | item4 | item5 | item6 | item7 |
---|---|---|---|---|---|---|---|
user1 | 3 | 5 | 1 | ||||
user2 | 2 | 1 | 4 | ||||
user3 | 4 | 3 | |||||
user4 | 1 | 4 | 2 |
在推薦中啡专,我們希望可以預測出用戶對未評分商品的評分险毁,從而將評分高的商品推薦給用戶。矩陣分解就是解決該問題的其中一種方法。如果對SVD原理不了解的可以看看這篇博客強大的矩陣奇異值分解(SVD)及其應用畔况,本文不詳細介紹鲸鹦。
如果我們對user-item評分矩陣進行SVD分解,就可以得到:
其中是矩陣中較大的部分奇異值的個數跷跪,一般會遠遠的小于用戶數和物品樹馋嗜。如果我們要預測第個用戶對第個物品的評分,則只需要計算即可。通過這種方法吵瞻,我們可以將評分表里面所有沒有評分的位置得到一個預測評分葛菇。通過找到最高的若干個評分對應的物品推薦給用戶。到這里似乎很完美了橡羞,但是我們忽略了一個問題眯停,傳統(tǒng)的SVD要求矩陣是稠密的,因此為了讓SVD解決該問題卿泽,我們需要對SVD進行缺失值填充莺债。但是這樣又會導致新的問題:
- 矩陣太稠密計算復雜度高
- 如何對缺失值進行填充
2. FunkSVD
為了解決上述傳統(tǒng)SVD的問題,FunkSVD被提出签夭,這種改進算法稱為隱語義模型或潛在因素模型齐邦。該方法只將矩陣分解成2個矩陣——用戶隱含特征組成的矩陣和項目隱含特征組成的矩陣:
其中表示隱特征的數量,為矩陣第租,表示用戶特征向量措拇;為矩陣,表示物品特征向量煌妈。那么用戶對用戶的預測評分為:
2.1求解
求解方法是將問題轉化為最小化誤差函數儡羔,目標函數為:
目標
2.2優(yōu)化方法
最常用的兩種優(yōu)化方法:隨機梯度下降(SGD)和最小二乘(ALS)。通常SGD比ALS(Alternating Least Squares)簡單而且快速璧诵;但是ALS的并行性能比較好汰蜘,而且可以較好地處理稀疏數據,spark的實現方式就是ALS之宿。
隨機梯度下降
分別對和求導:
那么,的迭代公式為:
ALS
同樣通過求偏導的方法族操,并令偏導等于0,可以得到
先固定比被,通過公式(1)求解色难;再固定,通過公式(2)求解等缀;直到收斂枷莉。
3. FunkSVD在協(xié)同過濾中的應用
最后得到, 后,可以通過4種方式進行推薦:
- 直接使用
- 基于user-based推薦
先通過計算出相似用戶尺迂,然后再推薦相似用戶評分高的物品 - 基于item-based推薦
先通過計算出相似物品笤妙,然后再根據該用戶的歷史行為推薦相似物品 - 基于主題的推薦(可能這種叫法不對)
這個有點類似于LDA, 通過可以得到用戶最顯著的隱特征冒掌,然后推薦在該隱特征上表現明顯的商品。
4. 基于SVD的其他改進方法
Bias-SVD
用戶對物品的評價有些因素與用戶的喜好無關蹲盘,而只取決于用戶或物品本身特性股毫。例如,對于樂觀的用戶來說召衔,它的評分行為普遍偏高铃诬,而對批判性用戶來說,他的評分記錄普遍偏低苍凛,即使他們對同一物品的評分相同趣席,但是他們對該物品的喜好程度卻并不一樣。同理醇蝴,對物品來說吩坝,以電影為例,受大眾歡迎的電影得到的評分普遍偏高哑蔫,而一些爛片的評分普遍偏低,這些因素都是獨立于用戶或產品的因素弧呐,而和用戶對產品的的喜好無關闸迷。
Bias-SVD把這些獨立于用戶或獨立于物品的因素稱為偏置(Bias)部分,將用戶和物品的交互即用戶對物品的喜好部分稱為個性化部分俘枫。偏置部分由3部分組成:
- 訓練集中所有評分記錄的全局平均數, 該值為常數
- 用戶偏置bu
- 物品偏置bi
則偏置部分為:
將加入目標函數腥沽,則變成:
SVD++
SVD++算法在Bias-SVD算法上增加考慮了用戶的隱式反饋。
對于某一個用戶鸠蚪,它提供了隱式反饋的物品集合定義為今阳,這個用戶對某個物品對應的隱式反饋修正的評分值為,表示為那么該用戶所有的評分修正值為茅信,則加入了隱式反饋以后的優(yōu)化目標函數J(p,q)是這樣的:
其中盾舌,引入是為了消除不同個數引起的差異。如果需要考慮用戶的隱式反饋時蘸鲸,使用SVD++是個不錯的選擇妖谴。