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