推荐系统算法学习(一)——协同过滤(CF) MF FM FFM
https://blog.csdn.net/qq_23269761/article/details/81355383
1.協同過濾(CF)【基于內存的協同過濾】
優點:簡單,可解釋
缺點:在稀疏情況下無法工作
所以對于使用userCF的系統,需要解決用戶冷啟動問題 和如何讓一個新物品被第一個用戶發現
對于只用itemCF的系統,需要解決物品冷啟動問題
如何更新推薦系統呢,答案就是離線更新用戶相似度矩陣和物品相似度矩陣【不斷刪除離開的用戶/物品,加入新來的用戶/物品】
2.MF PMF BPMF【基于模型的協同過濾】
當你有一個多維度稀疏矩陣,通過矩陣因式分解你能夠將用戶-項目矩陣(user-item matrix)重構成低評分結構(low-rank structure),并且你能夠通過兩個低評分( low-rank)矩陣相乘得出這個矩陣,其中矩陣的行包含潛在向量。
通過低評價矩陣乘積盡可能調整這個矩陣近似原始矩陣,以填充原始矩陣中缺失的項。
優點:更好解決可擴展性和稀疏問題而被廣泛用于推薦系統
缺點:矩陣分解時間復雜度高,可采用梯度下降的方法減少計算復雜度
2.1 利用SVD求解MF
參考博客:https://www.cnblogs.com/AndyJee/p/7879765.html
任意一個M*N的矩陣A(M行*N列,M>N),可以被寫成三個矩陣的乘積:
U:(M行M列的列正交矩陣)
S:(M*N的對角線矩陣,矩陣元素非負)
V:(N*N的正交矩陣的倒置)
即 A=U*S*V’(注意矩陣V需要倒置)
簡單總結就是選取S對角陣中的前k個元素即可對U,S進行降維,利用,令U=U*S, 則U*V’可以近似還原并填充原矩陣?【這句話我認為不對的吧。還原是近似接近原矩陣, 如果原來是0,即未評分,還原的后的矩陣應該還是很接近0才對】,應該采用后面的方法對未評分的元素進行預測
這里有一個很重要的但是很多博客沒有明確指出的問題是,如果這時候來了一個新的用戶【不應該是新的用戶吧,應該是原來矩陣中有未評分的用戶,不然原矩陣就不是原矩陣了,SVD分解就不成立了】,我們該如何為其進行推薦呢?
這里始終搞不明白,看大家網上的代碼,有直接還原矩陣直接預測的,也就計算相似度后再預測的
上圖很形象,卻說的不是很透徹,回到矩陣分解用到推薦系統中的本質來看,設 訓練集用戶數(m),物品數(n),因子數(k)
A的維度: m*n
U的維度: m*k(代表用戶對不同因子的相關程度)
S的維度: k*k
V的維度: n*k(代表物品對不同因子的相關程度)
且由 A=U*S*V’ —> U=A*V*S-1
此時令A是一個新用戶的1*n的矩陣,就可以得到這個用戶不同因子的相關程度的向量,此后可以通過U矩陣與其他用戶進行相似度計算,從而進行相應的推薦!!!!
【上述方法是計算用戶的相似度進而進行推薦】
也可以通過計算物品之間的相似度,然后根據物品相似度為用戶未打分的item打分,進而進行推薦。
2.2 利用梯度下降求解MF
參考博客:
http://www.cnblogs.com/bjwu/p/9358777.html
【這個算法有人叫SVD[可能因為他是SVD++的前身吧],有人叫LFM】
SVD++推薦系統:
代碼參考:
https://blog.csdn.net/akiyamamio11/article/details/79313339
至于SVD++為什么公式是這樣的,參見Yehuda Koren 大牛的論文: Factorization Meets the Neighborhood: a Multifaceted Collaborative Filtering Model
寫的很復雜,但網上的解釋大都同上,很淺顯
2.3 PMF BPMF
參考博客:
https://blog.csdn.net/shulixu/article/details/75349138
2.4 總結
MF其實就是基于模型的協同過濾,因為協同過濾的本質就是矩陣分解和矩陣填充
圖片來源于:https://blog.csdn.net/manduner/article/details/80564414
那么如何得到MF的矩陣分解模型呢?
SVD方法,但是由于未評分元素也參與了分解,所以最后的近似矩陣會把未評分處還近似為0,所以需要利用用戶相似度矩陣或物品相似度矩陣對缺失除進行評分預測,預測方法上文也提到了,這里補充一個有代碼的博客
http://www.cnblogs.com/lzllovesyl/p/5243370.html
以最小二乘作為損失函數的隨機梯度下降優化方法: SVD++,LFM(SVD++的前身),由于只有有評分的元素在參與訓練過程,所以最后得到的近似矩陣中的對應位置的評分就是相應的預測值了,再計算得到用戶/物品相似度矩陣?
真正的大型推薦系統中,離線召回步驟存儲的是用戶相似度矩陣或物品相似度矩陣
2.5 推薦系統LFM和基于鄰域(如UserCF、ItemCF)的方法的比較
LFM是一種基于機器學習的方法,具有比較好的理論基礎。這個方法和基于鄰域的方法(比如UserCF、ItemCF)相比,各有優缺點。下面將從不同的方面對比LFM和基于鄰域的方法。
理論基礎
LFM具有比較好的理論基礎,他是一種學習方法,通過優化一個設定的指標建立最優的模型。基于鄰域的方法更多是一種基于統計的方法,并沒有學習過程。【LFM的性能要好一些】
離線計算的空間復雜度
基于鄰域的方法需要維護一張離線的相關表。在離線計算相關表的過程中,如果用戶/物品數很多,將會占用很大的內存。假如有M個用戶和N個物品,在計算相關表的過程中,我們可能會獲得一張比較稠密的臨時相關表(盡管最終我們對每個物品只保留K個最相關的物品,但在計算過程中稠密的相關表是不可避免的),LFM則節省了大量的內存。【這里節省內存的前提時沒有稠密化user-item矩陣吧】
離線計算的時間復雜度
一般情況下,LFM的時間復雜度要稍微高于UserCF和ItemCF,這主要是因為該算法需要多次迭代。但總體上,這兩種算法在時間復雜度上面沒有本質的差別。【但也有人說LFM的計算時間復雜度更高】
在線實時推薦
UserCF和ItemCF在線服務算法需要將相關表緩存在內存中,然后可以在線進行實時的預測。以ItemCF算法為例,一旦用戶喜歡了新的物品,就可以通過查詢內存中的相關表將和該物品相似的其他物品推薦給用戶【因為有物品相似度矩陣啊】。因此,一旦用戶有了新的行為,而且該行為被實時地記錄到后臺的數據庫系統中,他的推薦列表就會發生變化。
而從LFM的預測公式可以看到,LFM在給用戶生成推薦列表時,需要計算用戶對所有物品的興趣權重,然后排名,返回全中最大的N個物品。那么,在物品數很多時,這一過程的時間復雜度非常高,因此,LFM不太適合用戶物品數非常龐大的系統。另一方面,LFM在生成一個用戶推薦列表時速度太慢,因此不鞥呢在線實時計算,而需要離線將所有用戶的推薦結果事先計算好存儲在數據庫中【也就是user-item那張大矩陣】。因此,LFM不能進行在線試試推薦,也就是說,當用戶有了新的行為后,他的推薦列表不會發生變化。
推薦解釋
ItemCF算法支持很好的推薦解釋,它可以利用用戶的歷史行為解釋推薦結果。但LFM無法提供這樣的解釋,它計算出的隱類雖然在語義上卻是代表了一類興趣和物品,卻很難用自然語言描述并生成解釋展示給用戶。
3.FM Factorization Machine(因子分解機)
這里著重強調一下MF與FM的區別,混淆了很久啊,矩陣分解MF、SVD++等,這些模型可以學習到特征之間的交互隱藏關系,但基本上每個模型都只適用于特定的輸入和場景【因為他們都是協同過濾,都在用戶-物品評分矩陣下運行,也就是得有顯示反饋】。為此,在高度稀疏的數據場景下如推薦系統,FM(Factorization Machine)出現了。
我認為一個很大的區別在于,MF等矩陣分解的方法都是在操作和分解用戶-物品矩陣,而FM矩陣將用戶和物品都進行了one-hot編碼作為了預測 評分 的特征,使得特征維度巨大且十分稀疏,那么FM就是在解決稀疏數據下的特征組合問題。
參考博客1(講解詳細,還有與SVM的區別),FM一般用于Ctr預估,其y值是用于的點擊概率。【用于線上系統的精排序】
https://www.cnblogs.com/AndyJee/p/7879765.html
參考博客2:有代碼
https://www.jianshu.com/p/152ae633fb00
參考博客3:有關于FM用于分類的loss的推導(用于預測CTR)
https://blog.csdn.net/google19890102/article/details/45532745
4.FFM
參考博客:
https://www.jianshu.com/p/781cde3d5f3d
總結
協同過濾算法復雜度較低但是在用戶-物品矩陣稀疏時無法得到好的效果。
MF等矩陣分解方法好理解但是計算復雜度高,且只適用于評分矩陣這種簡單的特征計算,無法利用其他特征
FM與FFM在用戶量和物品量較大時,特征維度爆炸式增長,好奇這種方法究竟如何應用到真正的系統中。
各種問號啊,后面再來補充吧,就醬~
————————————————補充劃分線————————————————
FM的優點是可以用于各種分類變量較多【需要one-hot】編碼的數據集中,其對于稀疏矩陣有奇效
但是在協同過濾領域,原始的MF方法需要的特征存儲空間是 N_user*N_item。
但FM卻需要一個N_grade*(N_user+N_item)的存儲空間大錯特錯【欸之前被一個簡化版的FM實現代碼誤導了!!!】去看代碼里實現的時候,用一個原始數據大小的矩陣存特征index,再用一個原始特征大小的矩陣存特征value,根本不需要存儲one-hot編碼過的龐大數據啊
具體實現方式詳見下一篇博客的講解:
https://blog.csdn.net/qq_23269761/article/details/81366939
這回可以總結了~FM是真的好~!!!可能唯一的缺點是不好解釋?
【實際系統中】 協同過濾(基于內存/模型)大多用在召回階段,因為他可以快速的粗略的挑選出一些可解釋的推薦列表
FM GBDT等模型用在召回后的精排序階段,利用預測出色Ctr對粗排序列表中的內容融合更高級的模型的進行更精準的計算和投放。
所以后續博客中的算法大多與Ctr預估有關咯,但是召回階段還有一大空白就是真正系統中是如何做到分布式計算的!
總結
以上是生活随笔為你收集整理的推荐系统算法学习(一)——协同过滤(CF) MF FM FFM的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AMD 首发 RX 7000M 系列中端
- 下一篇: HP 集群软件