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