摘要:如果做推薦系統(tǒng)不知道基于物品的協(xié)同過濾,那等同于做程序員不懂得冒泡排序。基于物品的八卦基于物品的協(xié)同過濾算法誕生于年,是由亞馬遜首先提出的,并在年由其發(fā)明者發(fā)表了相應(yīng)的論文。
不管你有沒有剁過手,你對(duì)“看了這個(gè)商品的還看了”這樣的推薦形式一定不陌生。無論是貓還是狗,或者是其他電商網(wǎng)站,這樣的推薦產(chǎn)品可以說是推薦系統(tǒng)的標(biāo)配了。
類似的還有,如點(diǎn)評(píng)標(biāo)記類網(wǎng)站的“喜歡了這部電影的還喜歡了”,社交媒體網(wǎng)站的“關(guān)注了這個(gè)人還關(guān)注了”,這些都只是文案類似,動(dòng)詞不同而已。 這樣的推薦形式背后都是來自一個(gè)古老的推薦算法,叫做基于物品的協(xié)同過濾,通常也被叫作 Item-Based,因?yàn)楹笳吒菀姿阉鞯较嚓P(guān)的文章,所以被更多地提及。 如果做推薦系統(tǒng)不知道“基于物品的協(xié)同過濾”,那等同于做程序員不懂得冒泡排序。這個(gè)樸素的算法,就像是喬峰大戰(zhàn)聚賢莊所用的“太祖長拳”一樣,簡(jiǎn)單直接有效,讀過高中就懂,用得好也能夠戰(zhàn)倒絕大多數(shù)的武林豪杰。今天,我就來和你聊聊這個(gè)樸素的算法。
基于物品(Item-Based)的八卦
基于物品的協(xié)同過濾算法誕生于 1998 年,是由亞馬遜首先提出的,并在 2001 年由其發(fā)明者發(fā)表了相應(yīng)的論文( Item-Based Collaborative Filtering Recommendation Algorithms )。
這篇論文在 Google 學(xué)術(shù)上引用數(shù)已近 7000,并且在 WWW2016 大會(huì)上被授予了“時(shí)間檢驗(yàn)獎(jiǎng)”,頒獎(jiǎng)詞是:“這篇杰出的論文深深地影響了實(shí)際應(yīng)用”。歷經(jīng)了 15 年后仍然在發(fā)光發(fā)熱,這個(gè)獎(jiǎng)它顯然受之無愧。
雖然今天各家公司都在使用這個(gè)算法,好像它是一個(gè)公共資源一樣,然而并不是這樣,亞馬遜早在 1998 年,也就是論文發(fā)表的三年前就申請(qǐng)了專利。
講完了算法的八卦,開始說正事了。
基于物品(Item-Based)原理
在基于物品的協(xié)同過濾出現(xiàn)之前,信息過濾系統(tǒng)最常使用的是基于用戶的協(xié)同過濾。基于用戶的協(xié)同過濾首先計(jì)算相似用戶,然后再根據(jù)相似用戶的喜好推薦物品,這個(gè)算法有這么幾個(gè)問題:
用戶數(shù)量往往比較大,計(jì)算起來非常吃力,成為瓶頸; 用戶的口味其實(shí)變化還是很快的,不是靜態(tài)的,所以興趣遷移問題很難反應(yīng)出來;
數(shù)據(jù)稀疏,用戶和用戶之間有共同的消費(fèi)行為實(shí)際上是比較少的,而且一般都是一些熱門物品,對(duì)發(fā)現(xiàn)用戶興趣幫助也不大。
和基于用戶的不同,基于物品的協(xié)同過濾首先計(jì)算相似物品,然后再根據(jù)用戶消費(fèi)過、或者正在消費(fèi)的物品為其推薦相似的,基于物品的算法怎么就解決了上面這些問題呢?
首先,物品的數(shù)量,或者嚴(yán)格的說,可以推薦的物品數(shù)量往往少于用戶數(shù)量;所以一般計(jì)算物品之間的相似度就不會(huì)成為瓶頸。
其次,物品之間的相似度比較靜態(tài),它們變化的速度沒有用戶的口味變化快;所以完全解耦了> 用戶興趣遷移這個(gè)問題。
最后,物品對(duì)應(yīng)的消費(fèi)者數(shù)量較大,對(duì)于計(jì)算物品之間的相似度稀疏度是好過計(jì)算用戶之間相似度的。
根據(jù)我在上一篇文章中所說,協(xié)同過濾最最依賴的是用戶物品的關(guān)系矩陣,基于物品的協(xié)同過濾算法也不能例外,它的基本步驟是這樣的:
構(gòu)建用戶物品的關(guān)系矩陣,矩陣元素可以是用戶的消費(fèi)行為,也可以是消費(fèi)后的評(píng)價(jià),還可以是對(duì)消費(fèi)行為的某種量化如時(shí)間、次數(shù)、費(fèi)用等;
假如矩陣的行表示物品,列表示用戶的話,那么就兩兩計(jì)算行向量之間的相似度,得到物品相似度矩陣,行和列都是物品;
產(chǎn)生推薦結(jié)果,根據(jù)推薦場(chǎng)景不同,有兩種產(chǎn)生結(jié)果的形式。一種是為某一個(gè)物品推薦相關(guān)物品,另一種是在個(gè)人首頁產(chǎn)生類似“猜你喜歡”的推薦結(jié)果。不要急,稍后我會(huì)分別說。
計(jì)算物品相似度
前面較為籠統(tǒng)地說要計(jì)算物品之間的相似度,現(xiàn)在詳細(xì)說說這塊。從用戶物品關(guān)系矩陣中得到的物品向量長什么樣子呢?我來給你描述一下:
它是一個(gè)稀疏向量;
向量的維度是用戶,一個(gè)用戶代表向量的一維,這個(gè)向量的總共維度是總用戶數(shù)量;
向量各個(gè)維度的取值是用戶對(duì)這個(gè)物品的消費(fèi)結(jié)果,可以是行為本身的布爾值,也可以是消費(fèi)行為量化如時(shí)間長短、次數(shù)多少、費(fèi)用大小等,還可以是消費(fèi)的評(píng)價(jià)分?jǐn)?shù);
沒有消費(fèi)過的就不再表示出來,所以說是一個(gè)稀疏向量。
接下來就是如何兩兩計(jì)算物品的相似度了,一般選擇余弦相似度,當(dāng)然還有其他的相似度計(jì)算法方法也可以。計(jì)算公式如下: 用文字解釋一下這個(gè)公式:
分母是計(jì)算兩個(gè)物品向量的長度,求元素值的平方和再開方。分子是兩個(gè)向量的點(diǎn)積,相同位置的元素值相乘再求和。
很簡(jiǎn)單,因?yàn)檫@個(gè)公式出自中學(xué)數(shù)學(xué)課本,所以我剛才說讀過高中就懂。 這個(gè)公式的物理意義就是計(jì)算兩個(gè)向量的夾角余弦值,相似度為 1
時(shí),對(duì)應(yīng)角度是 0,好比時(shí)如膠似漆,相似度為 0 時(shí),對(duì)應(yīng)角度為 90 度,毫不相干,互為路人甲。
看上去計(jì)算量很大,貌似每一個(gè)求和的復(fù)雜度都是和向量維度、也就是用戶數(shù)量一樣的。但是別忘了,前面我說過他們都是稀疏向量,也就是向量中絕大多數(shù)值都是
0,求和時(shí)不用算,點(diǎn)積時(shí)更不用算,甚至求點(diǎn)積時(shí)只用管兩個(gè)物品的公共用戶,只是少許幾個(gè)乘積而已。
物品之間的相似度計(jì)算是這個(gè)算法最可以改進(jìn)的地方。通常的改進(jìn)方向有下面兩種。物品中心化。把矩陣中的分?jǐn)?shù),減去的是物品分?jǐn)?shù)的均值;先計(jì)算每一個(gè)物品收到評(píng)分的均值,然后再把物品向量中的分?jǐn)?shù)減去對(duì)應(yīng)物品的均值。這樣做的目的是什么呢?去掉物品中鐵桿粉絲群體的非理性因素,例如一個(gè)流量明星的電影,其腦殘粉可能會(huì)集體去打高分,那么用物品的均值來中心化就有一定的抑制作用。
用戶中心化。把矩陣中的分?jǐn)?shù),減去對(duì)應(yīng)用戶分?jǐn)?shù)的均值;先計(jì)算每一個(gè)用戶的評(píng)分均值,然后把他打過的所有分?jǐn)?shù)都減去這個(gè)均值。 這樣做的目的又是什么呢?每個(gè)人標(biāo)準(zhǔn)不一樣,有的標(biāo)準(zhǔn)嚴(yán)苛,有的寬松,所以減去用戶的均值可以在一定程度上僅僅保留了偏好,去掉了主觀成分。
上面提到的相似度計(jì)算方法,不只是適用于評(píng)分類矩陣,也適用于行為矩陣。所謂行為矩陣,即矩陣元素為 0 或者 1
的布爾值,也就是在前面的專欄中講過的隱式反饋。隱式反饋取值特殊,有一些基于物品的改進(jìn)推薦算法無法應(yīng)用,比如著名的 Slope One 算法。
計(jì)算推薦結(jié)果 在得到物品相似度之后,接下來就是為用戶推薦他可能會(huì)感興趣的物品了,基于物品的協(xié)同過濾,有兩種應(yīng)用場(chǎng)景。第一種屬于 TopK 推薦,形式上也常常屬于類似“猜你喜歡”這樣的。
出發(fā)方式是當(dāng)用戶訪問首頁時(shí),匯總和“用戶已經(jīng)消費(fèi)過的物品相似”的物品,按照匯總后分?jǐn)?shù)從高到低推出。匯總的公式是這樣的:
這個(gè)公式描述一下,核心思想就和基于用戶的推薦算法一樣,用相似度加權(quán)匯總。 要預(yù)測(cè)一個(gè)用戶 u 對(duì)一個(gè)物品 i 的分?jǐn)?shù),遍歷用戶 u
評(píng)分過的所有物品,假如一共有 m 個(gè),每一個(gè)物品和待計(jì)算物品 i
的相似度乘以用戶的評(píng)分,這樣加權(quán)求和后,除以所有這些相似度總和,就得到了一個(gè)加權(quán)平均評(píng)分,作為用戶 u 對(duì)物品 i 的分?jǐn)?shù)預(yù)測(cè)。
和基于物品的推薦一樣,我們?cè)谟?jì)算時(shí)不必對(duì)所有物品都計(jì)算一邊,只需要按照用戶評(píng)分過的物品,逐一取出和它們相似的物品出來就可以了。
這個(gè)過程都是離線完成后,去掉那些用戶已經(jīng)消費(fèi)過的,保留分?jǐn)?shù)最高的 k 個(gè)結(jié)果存儲(chǔ)。當(dāng)用戶訪問首頁時(shí),直接查詢出來即可。
第二種屬于相關(guān)推薦,也就是我們今天專欄題目所指的場(chǎng)景。
這類推薦不需要提前合并計(jì)算,當(dāng)用戶訪問一個(gè)物品的詳情頁面時(shí),或者完成一個(gè)物品消費(fèi)的結(jié)果面,直接獲取這個(gè)物品的相似物品推薦,就是“看了又看”或者“買了又買”的推薦結(jié)果了。
Slope One 算法
經(jīng)典的基于物品推薦,相似度矩陣計(jì)算無法實(shí)時(shí)更新,整個(gè)過程都是離線計(jì)算的,而且還有另一個(gè)問題,相似度計(jì)算時(shí)沒有考慮相似度的置信問題。例如,兩個(gè)物品,他們都被同一個(gè)用戶喜歡了,且只被這一個(gè)用戶喜歡了,那么余弦相似度計(jì)算的結(jié)果是
1,這個(gè) 1 在最后匯總計(jì)算推薦分?jǐn)?shù)時(shí),對(duì)結(jié)果的影響卻最大。 Slope One 算法針對(duì)這些問題有很好的改進(jìn)。在 2005
年首次問世,Slope One 算法專門針對(duì)評(píng)分矩陣,不適用于行為矩陣。Slope One
算法計(jì)算的不是物品之間的相似度,而是計(jì)算的物品之間的距離,相似度的反面。舉個(gè)例子就一目了然,下面是一個(gè)簡(jiǎn)單的評(píng)分矩陣:
這個(gè)矩陣反應(yīng)了這些事實(shí):用戶 1 給物品 A、B、C 都評(píng)分了,分別是 5,3,2;用戶 2 給物品 A、B 評(píng)分了,分別是 3、4;用戶
3 給物品 B、C 評(píng)分了,分別是 2、5。現(xiàn)在首先來兩兩計(jì)算物品之間的差距:
括號(hào)里表示兩個(gè)物品的共同用戶數(shù)量,代表兩個(gè)物品差距的置信程度。比如物品 A 和物品 B 之間的差距是 0.5,共同用戶數(shù)是 2,反之,物品
B 和物品 A 的差距是 -0.5,共同用戶數(shù)還是 2。知道這個(gè)差距后,就可以用一個(gè)物品去預(yù)測(cè)另一個(gè)物品的評(píng)分。 如果只知道用戶 3 給物品
B 的評(píng)分是 2,那么預(yù)測(cè)用戶 3 給物品 A 的評(píng)分呢就是 2.5,因?yàn)閺奈锲?B 到物品 A 的差距是 0.5。
在此基礎(chǔ)上繼續(xù)推進(jìn),如果知道用戶給多個(gè)物品評(píng)分了,怎么匯總這些分?jǐn)?shù)呢? 方法是把單個(gè)預(yù)測(cè)的分?jǐn)?shù)按照共同用戶數(shù)加權(quán)求平均。比如現(xiàn)在知道用戶 3
不但給物品 B 評(píng)分為 2,還給物品 C 評(píng)分為 5,物品 B 對(duì)物品 A 的預(yù)測(cè)是 2.5 分,剛才計(jì)算過了,物品 C 給物品 A
的預(yù)測(cè)是 8 分,再加權(quán)平均。 就得到了推薦分?jǐn)?shù)為 4.33 分。是不是很簡(jiǎn)單? 總結(jié)
今天我們?cè)诨谟脩舻膮f(xié)同過濾基礎(chǔ)上介紹了比較常見的一個(gè)算法:基于物品的協(xié)同過濾。這個(gè)方法常常在電商網(wǎng)站上見到,“買了又買”“看了又看”這樣的相關(guān)推薦,都是由這個(gè)推薦算法產(chǎn)生。
最后我們介紹了一個(gè)改良版的基于物品推薦算法 Slope One。這里也留下了一個(gè)問題給你:為什么說 Slope One 可以做到在線更新呢?歡迎留言討論。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/44707.html
摘要:在峰會(huì)大數(shù)據(jù)專場(chǎng)上,達(dá)觀數(shù)據(jù)紀(jì)達(dá)麒圍繞數(shù)據(jù)挖掘算法落地實(shí)踐做了主題演講,就個(gè)性化推薦系統(tǒng)商業(yè)化的五大要素進(jìn)行了詳細(xì)探討。在機(jī)器學(xué)習(xí)領(lǐng)域,每一個(gè)單一算法都是針對(duì)一類特定的問題,因而針對(duì)同一個(gè)推薦任務(wù),不同的算法效果相差很大。 在日前舉行的2017 CSDI 中國軟件研發(fā)管理行業(yè)峰會(huì)上,包括摩拜單車創(chuàng)始人及CTO夏一平、華為首席系統(tǒng)工程專家徐琦海、京東云、攜程等一線互聯(lián)網(wǎng)企業(yè)大數(shù)據(jù)平臺(tái)負(fù)責(zé)...
摘要:最近寫搜索引擎文章寫多了,來一篇之前寫的老文,給那些對(duì)推薦算法感興趣想入門的人吧,最近也在做推薦廣告系統(tǒng),又翻出來看了看。 最近寫搜索引擎文章寫多了,來一篇之前寫的老文,給那些對(duì)推薦算法感興趣想入門的人吧,最近也在做推薦廣告系統(tǒng),又翻出來看了看。 什么是推薦算法 推薦算法最早在1992年就提出來了,但是火起來實(shí)際上是最近這些年的事情,因?yàn)榛ヂ?lián)網(wǎng)的爆發(fā),有了更大的數(shù)據(jù)量可以供我們使用,推...
摘要:協(xié)同過濾提出了一種支持不完整評(píng)分矩陣的矩陣分解方法不用對(duì)評(píng)分矩陣進(jìn)行估值填充。使用的是交叉最小二乘法來最優(yōu)化損失函數(shù)。 構(gòu)建基于Spark的推薦引擎(Python) 推薦引擎背后的想法是預(yù)測(cè)人們可能喜好的物品并通過探尋物品之間的聯(lián)系來輔助這個(gè)過程 在學(xué)習(xí)Spark機(jī)器學(xué)習(xí)這本書時(shí),書上用scala完成,自己不熟悉遂用pyshark完成,更深入的理解了spark對(duì)協(xié)同過濾的實(shí)現(xiàn) 在這里我...
閱讀 812·2021-11-18 10:02
閱讀 2500·2021-11-11 16:54
閱讀 2749·2021-09-02 09:45
閱讀 653·2019-08-30 12:52
閱讀 2774·2019-08-29 14:04
閱讀 2745·2019-08-29 12:39
閱讀 447·2019-08-29 12:27
閱讀 1887·2019-08-26 13:23