协同过滤算法_机器学习 | 简介推荐场景中的协同过滤算法,以及SVD的使用
本文始發(fā)于個(gè)人公眾號(hào):TechFlow,原創(chuàng)不易,求個(gè)關(guān)注
今天是機(jī)器學(xué)習(xí)專題的第29篇文章,我們來聊聊SVD在上古時(shí)期的推薦場景當(dāng)中的應(yīng)用。
推薦的背后邏輯
有沒有思考過一個(gè)問題,當(dāng)我們在淘寶或者是某東這類電商網(wǎng)站購物的時(shí)候。我們一進(jìn)首頁,就會(huì)看到首頁展出了很多商品。這些商品往往質(zhì)量很高,很吸引人,一旦逛起來可能就沒個(gè)結(jié)束。那么問題來了,電商平臺(tái)擁有那么多商品,它是怎么知道我們可能會(huì)喜歡什么樣的商品的呢?這背后的邏輯是什么?
簡單來說在這背后,平臺(tái)端的算法做了兩件事情,第一件事情是召回,第二件事情是排序。本質(zhì)上來說和搜索引擎做的事情是類似的,只是不同的是搜索的時(shí)候我們有搜索詞作為輸入,而首頁的推薦是沒有任何顯性的輸入信息的。所以召回的時(shí)候只能根據(jù)用戶畫像的一些特征和用戶之前在平臺(tái)上的行為來作為特征召回商品,召回了商品之后再用一個(gè)模型預(yù)估用戶點(diǎn)擊的概率,根據(jù)這個(gè)概率進(jìn)行排序。
雖然召回-排序的框架沒有變,但是召回的算法、邏輯以及排序的算法和邏輯一直在迭代。尤其是召回模型,從一開始的協(xié)同過濾再到后來的向量召回、雙塔模型以及樹模型等等,有了巨大的進(jìn)步,模型的效果自然也有了一個(gè)質(zhì)的飛躍。
今天我們來著重聊聊協(xié)同過濾,雖然這個(gè)模型非常簡單,目前也幾乎已經(jīng)退出歷史舞臺(tái)了,但是這不妨礙它仍然是一個(gè)經(jīng)典的算法,值得我們學(xué)習(xí)。
協(xié)同過濾的原理
協(xié)同過濾的原理非常簡單,一句話概括,就是尋找相似的商品以及相似的人。
因?yàn)樵谄脚_(tái)當(dāng)中的商品和人可能數(shù)量都非常大,當(dāng)我們要進(jìn)行推薦的時(shí)候,我們不可能窮舉所有的商品來進(jìn)行預(yù)測點(diǎn)擊率,這顯然是機(jī)器無法抗住的。所以我們希望把用戶在平臺(tái)上的行為使用起來,讓用戶的行為給平臺(tái)作為指引。根據(jù)用戶的行為尋找出行為相似的用戶以及相似的商品。
所以協(xié)同過濾有兩套邏輯,也可以認(rèn)為是兩種做法。第一種做法是user-based也就是尋找偏好相似的用戶,這個(gè)不難理解,比如說經(jīng)常買文具、買書的大概率是學(xué)生。假設(shè)我們知道了A和B行為相似,也就是說他們可能有相似的喜好。那么假設(shè)A購買過商品1并且給出了好評(píng),而B沒有購買過,那么很有可能B也會(huì)喜歡這個(gè)商品,所以我們就可以推薦給B。
第二種做法自然就是item-based,比如你搜索點(diǎn)擊了一個(gè)商品A,平臺(tái)會(huì)將和這個(gè)商品類似的商品BCD推薦給你,會(huì)放在商品詳情頁的下方的猜你喜歡當(dāng)中。比如你看的是襯衫,它可能會(huì)給你推薦別家的襯衫,也可能給你推薦西褲或者是領(lǐng)帶。本質(zhì)上邏輯是一樣的,因?yàn)檫@些商品和這件襯衫的相關(guān)度比較高。
下一個(gè)問題是用戶和用戶,商品和商品之間的相關(guān)度是怎么來的呢?
答案很簡單,是通過這個(gè)矩陣來的:
我們觀察一下這個(gè)矩陣,這是一個(gè)用戶和商品的相關(guān)行為矩陣,每一行表示一個(gè)用戶的行為,每一列表示每一個(gè)商品的銷售情況。也就是說我們可以用這個(gè)矩陣當(dāng)中的行向量表示用戶,列向量表示商品。既然我們把用戶和商品用向量表示出來了,接下來的事情就很簡單了,我們只需要計(jì)算向量之間的相似度就可以找到相似的用戶以及商品了。
我們要計(jì)算向量的相似度有很多種辦法,我們可以計(jì)算兩個(gè)向量的余弦值,可以計(jì)算歐式距離、皮爾遜值等等。
SVD的作用
其實(shí)到這里關(guān)于協(xié)同過濾就介紹完了,但問題是這和SVD看起來好像沒什么關(guān)系呀?
我們仔細(xì)琢磨一下就能發(fā)現(xiàn)它們之間的關(guān)系,對于規(guī)模比較小的公司或者場景來說,這當(dāng)然是沒問題的。比如說電影評(píng)分網(wǎng)站,因?yàn)殡娪暗臄?shù)量往往不會(huì)很大,充其量也在萬這個(gè)量級(jí),所以這個(gè)矩陣可能還是存的下的。如果是電商公司,商品和用戶都是億這個(gè)維度的,這個(gè)矩陣顯然是非常巨大的,根本不可能在內(nèi)存當(dāng)中存儲(chǔ)得下,更別提相似度計(jì)算了。并且這樣的矩陣必然存在大量稀疏和空缺,我們將它使用SVD壓縮也是非常合理的做法。
首先我們開發(fā)出一個(gè)輔助函數(shù),根據(jù)我們設(shè)置的百分比計(jì)算出最少需要的奇異值的數(shù)量:
def其次我們對原矩陣進(jìn)行svd分解,并且設(shè)置閾值對原矩陣進(jìn)行壓縮:
data最后壓縮之后得到的是item的矩陣,其中的每一個(gè)行向量對應(yīng)一個(gè)item。
這只是一個(gè)模擬,如果是在實(shí)際上的應(yīng)用,我們可以將幾億甚至是更多的維度壓縮到幾百甚至更少,極大的縮減了存儲(chǔ)所需要的開銷。而且svd的計(jì)算是可以分布式并發(fā)進(jìn)行的,所以即使原始數(shù)據(jù)非常龐大,也是可以支撐的。
總結(jié)
到這里關(guān)于協(xié)同過濾算法以及SVD的應(yīng)用就結(jié)束了,雖然算法非常簡單,實(shí)現(xiàn)起來也容易,但是這其中還有很多問題沒有解決。比如說這個(gè)用戶和商品的矩陣并不是一成不變的,因?yàn)槲覀冸S時(shí)都會(huì)有新商品上架以及新用戶注冊,對于這些沒有行為的新商品和新用戶應(yīng)該怎么辦?
另外一個(gè)問題是,這個(gè)算法沒有改進(jìn)的空間,一旦實(shí)現(xiàn)完成了上線之后,我們做不了太多的改進(jìn)。如果是其他的模型或者是算法,我們可以通過迭代算法以及模型的方法來獲取更好的效果,但是協(xié)同過濾不行。這也是為什么逐漸被淘汰的原因。
今天的文章到這里就結(jié)束了,如果喜歡本文的話,請來一波素質(zhì)三連,給我一點(diǎn)支持吧(關(guān)注、轉(zhuǎn)發(fā)、點(diǎn)贊)。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的协同过滤算法_机器学习 | 简介推荐场景中的协同过滤算法,以及SVD的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 算法设计与分析_算法设计与分析(第2版)
- 下一篇: 皮裤多少钱啊?