【轉】推薦系統演算法總結(二)——協同過濾(CF) MF FM FFM
來源:未知,如有不妥,請隨時聯絡溝通,謝謝~
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預估有關咯,但是召回階段還有一大空白就是真正系統中是如何做到分散式計算的!
相關文章
- 【Datawhale】推薦系統-協同過濾
- 協同過濾實現小型推薦系統
- 協同過濾在推薦系統中的應用
- 推薦系統與協同過濾、奇異值分解
- 推薦系統入門之使用協同過濾實現商品推薦
- 【轉】推薦系統演算法總結(一)演算法
- 推薦系統--完整的架構設計和演算法(協同過濾、隱語義)架構演算法
- 基於使用者的協同過濾來構建推薦系統
- 推薦召回--基於物品的協同過濾:ItemCF
- 使用協同濾波(Collaborative Filtering)實現內容推薦系統Filter
- 推薦演算法(二)--演算法總結演算法
- 基於遺傳最佳化的協同過濾推薦演算法matlab模擬演算法Matlab
- 基於專案的協同過濾推薦演算法(Item-Based Collaborative Filtering Recommendation Algorithms)演算法FilterGo
- 【小白學推薦1】 協同過濾 零基礎到入門
- 推薦系統FM系列文章(三)-- NFM模型模型
- 協同過濾演算法概述與python 實現協同過濾演算法基於內容(usr-it演算法Python
- 雲音樂推薦系統(二):推薦系統的核心演算法演算法
- 聊聊推薦系統,FM模型效果好在哪裡?模型
- 協同過濾筆記筆記
- 【JAVA】助力數字化營銷:基於協同過濾演算法實現個性化商品推薦Java演算法
- 推薦系統召回四模型之全能的FM模型模型
- 【推薦系統】評估指標總結指標
- 推薦系統實踐 0x0c FM系列
- 基於矩陣分解的協同過濾演算法矩陣演算法
- 推薦系統 embedding 技術實踐總結
- 構建基於深度學習神經網路協同過濾模型(NCF)的影片推薦系統(Python3.10/Tensorflow2.11)深度學習神經網路模型Python
- 【推薦演算法】推薦系統的評估演算法
- 推薦系統一——深入理解YouTube推薦系統演算法演算法
- 【轉】Spark MLlib協同過濾之交替最小二乘法ALS原理與實踐Spark
- 【推薦系統】:LFM演算法解析演算法
- 推薦系統[八]演算法實踐總結V0:騰訊音樂全民K歌推薦系統架構及粗排設計演算法架構
- 推薦系統基礎知識(二)
- 神經圖協同過濾(Neural Graph Collaborative Filtering)Filter
- 推薦演算法在商城系統實踐演算法
- Netflix 推薦系統 (Part One)-排序演算法排序演算法
- 【推薦系統篇】--推薦系統之訓練模型模型
- 萬字長文,詳解推薦系統領域經典模型FM因子分解機模型
- [機器學習]協同過濾演算法的原理和基於Spark 例項機器學習演算法Spark