推薦系統02--協同過濾

無論你有沒有剁過手,你對「看了這個商品的還看了」這樣的推薦形式必定不陌生。不管是貓仍是狗,或者是其餘電商網站,這樣的推薦產品能夠說是推薦系統的標配了。程序員

相似的還有,如點評標記類網站的「喜歡了這部電影的還喜歡了」,社交媒體網站的「關注了這我的還關注了」,這些都只是文案相似,動詞不一樣而已。
這樣的推薦形式背後都是來自一個古老的推薦算法,叫作基於物品的協同過濾,一般也被叫做 Item-Based,由於後者更容易搜索到相關的文章,因此被更多地說起。
若是作推薦系統不知道「基於物品的協同過濾」,那等同於作程序員不懂得冒泡排序。這個樸素的算法,就像是喬峯大戰聚賢莊所用的「太祖長拳」同樣,簡單直接有效,讀太高中就懂,用得好也可以戰倒絕大多數的武林豪傑。今天,我就來和你聊聊這個樸素的算法。

基於物品(Item-Based)的八卦算法

基於物品的協同過濾算法誕生於 1998 年,是由亞馬遜首先提出的,並在 2001 年由其發明者發表了相應的論文( Item-Based Collaborative Filtering Recommendation Algorithms )。

這篇論文在 Google 學術上引用數已近 7000,而且在 WWW2016 大會上被授予了「時間檢驗獎」,頒獎詞是:「這篇傑出的論文深深地影響了實際應用」。歷經了 15 年後仍然在發光發熱,這個獎它顯然受之無愧。
雖然今天各家公司都在使用這個算法,好像它是一個公共資源同樣,然而並非這樣,亞馬遜早在 1998 年,也就是論文發表的三年前就申請了專利。
講完了算法的八卦,開始說正事了。網站

基於物品(Item-Based)原理code

在基於物品的協同過濾出現以前,信息過濾系統最常使用的是基於用戶的協同過濾。基於用戶的協同過濾首先計算類似用戶,而後再根據類似用戶的喜愛推薦物品,這個算法有這麼幾個問題:
用戶數量每每比較大,計算起來很是吃力,成爲瓶頸; 用戶的口味其實變化仍是很快的,不是靜態的,因此興趣遷移問題很難反應出來;
數據稀疏,用戶和用戶之間有共同的消費行爲其實是比較少的,並且通常都是一些熱門物品,對發現用戶興趣幫助也不大。
和基於用戶的不一樣,基於物品的協同過濾首先計算類似物品,而後再根據用戶消費過、或者正在消費的物品爲其推薦類似的,基於物品的算法怎麼就解決了上面這些問題呢?
首先,物品的數量,或者嚴格的說,能夠推薦的物品數量每每少於用戶數量;因此通常計算物品之間的類似度就不會成爲瓶頸。
其次,物品之間的類似度比較靜態,它們變化的速度沒有用戶的口味變化快;因此徹底解耦了

> 用戶興趣遷移這個問題。排序

最後,物品對應的消費者數量較大,對於計算物品之間的類似度稀疏度是好過計算用戶之間類似度的。
根據我在上一篇文章中所說,協同過濾最最依賴的是用戶物品的關係矩陣,基於物品的協同過濾算法也不能例外,它的基本步驟是這樣的:
構建用戶物品的關係矩陣,矩陣元素能夠是用戶的消費行爲,也能夠是消費後的評價,還能夠是對消費行爲的某種量化如時間、次數、費用等;
假如矩陣的行表示物品,列表示用戶的話,那麼就兩兩計算行向量之間的類似度,獲得物品類似度矩陣,行和列都是物品;
產生推薦結果,根據推薦場景不一樣,有兩種產生結果的形式。一種是爲某一個物品推薦相關物品,另外一種是在我的首頁產生相似「猜你喜歡」的推薦結果。不要急,稍後我會分別說。資源

計算物品類似度數學

前面較爲籠統地說要計算物品之間的類似度,如今詳細說說這塊。從用戶物品關係矩陣中獲得的物品向量長什麼樣子呢?我來給你描述一下:產品

它是一個稀疏向量;it

向量的維度是用戶,一個用戶表明向量的一維,這個向量的總共維度是總用戶數量;
向量各個維度的取值是用戶對這個物品的消費結果,能夠是行爲自己的布爾值,也能夠是消費行爲量化如時間長短、次數多少、費用大小等,還能夠是消費的評價分數;
沒有消費過的就再也不表示出來,因此說是一個稀疏向量。
接下來就是如何兩兩計算物品的類似度了,通常選擇餘弦類似度,固然還有其餘的類似度計算法方法也能夠。計算公式以下: 用文字解釋一下這個公式:
分母是計算兩個物品向量的長度,求元素值的平方和再開方。分子是兩個向量的點積,相同位置的元素值相乘再求和。
很簡單,由於這個公式出自中學數學課本,因此我剛纔說讀太高中就懂。 這個公式的物理意義就是計算兩個向量的夾角餘弦值,類似度爲 1
時,對應角度是 0,比如時如膠似漆,類似度爲 0 時,對應角度爲 90 度,絕不相干,互爲路人甲。
看上去計算量很大,貌似每個求和的複雜度都是和向量維度、也就是用戶數量同樣的。可是別忘了,前面我說過他們都是稀疏向量,也就是向量中絕大多數值都是
0,求和時不用算,點積時更不用算,甚至求點積時只用管兩個物品的公共用戶,只是少量幾個乘積而已。
物品之間的類似度計算是這個算法最能夠改進的地方。一般的改進方向有下面兩種。io

  1. 物品中心化。把矩陣中的分數,減去的是物品分數的均值;先計算每個物品收到評分的均值,而後再把物品向量中的分數減去對應物品的均值。這樣作的目的是什麼呢?去掉物品中鐵桿粉絲羣體的非理性因素,例如一個流量明星的電影,其腦殘粉可能會集體去打高分,那麼用物品的均值來中心化就有必定的抑制做用。
  2. 用戶中心化。把矩陣中的分數,減去對應用戶分數的均值;先計算每個用戶的評分均值,而後把他打過的全部分數都減去這個均值。 這樣作的目的又是什麼呢?每一個人標準不同,有的標準嚴苛,有的寬鬆,因此減去用戶的均值能夠在必定程度上僅僅保留了偏好,去掉了主觀成分。

上面提到的類似度計算方法,不僅是適用於評分類矩陣,也適用於行爲矩陣。所謂行爲矩陣,即矩陣元素爲 0 或者 1
的布爾值,也就是在前面的專欄中講過的隱式反饋。隱式反饋取值特殊,有一些基於物品的改進推薦算法沒法應用,好比著名的 Slope One 算法。
計算推薦結果 在獲得物品類似度以後,接下來就是爲用戶推薦他可能會感興趣的物品了,基於物品的協同過濾,有兩種應用場景。

第一種屬於 TopK 推薦,形式上也經常屬於相似「猜你喜歡」這樣的。
出發方式是當用戶訪問首頁時,彙總和「用戶已經消費過的物品類似」的物品,按照彙總後分數從高到低推出。彙總的公式是這樣的:
這個公式描述一下,核心思想就和基於用戶的推薦算法同樣,用類似度加權彙總。 要預測一個用戶 u 對一個物品 i 的分數,遍歷用戶 u
評分過的全部物品,假如一共有 m 個,每個物品和待計算物品 i
的類似度乘以用戶的評分,這樣加權求和後,除以全部這些類似度總和,就獲得了一個加權平均評分,做爲用戶 u 對物品 i 的分數預測。
和基於物品的推薦同樣,咱們在計算時沒必要對全部物品都計算一邊,只須要按照用戶評分過的物品,逐一取出和它們類似的物品出來就能夠了。
這個過程都是離線完成後,去掉那些用戶已經消費過的,保留分數最高的 k 個結果存儲。當用戶訪問首頁時,直接查詢出來便可。
第二種屬於相關推薦,也就是咱們今天專欄題目所指的場景。
這類推薦不須要提早合併計算,當用戶訪問一個物品的詳情頁面時,或者完成一個物品消費的結果面,直接獲取這個物品的類似物品推薦,就是「看了又看」或者「買了又買」的推薦結果了。
Slope One 算法
經典的基於物品推薦,類似度矩陣計算沒法實時更新,整個過程都是離線計算的,並且還有另外一個問題,類似度計算時沒有考慮類似度的置信問題。例如,兩個物品,他們都被同一個用戶喜歡了,且只被這一個用戶喜歡了,那麼餘弦類似度計算的結果是
1,這個 1 在最後彙總計算推薦分數時,對結果的影響卻最大。 Slope One 算法針對這些問題有很好的改進。在 2005
年首次問世,Slope One 算法專門針對評分矩陣,不適用於行爲矩陣。Slope One
算法計算的不是物品之間的類似度,而是計算的物品之間的距離,類似度的反面。舉個例子就一目瞭然,下面是一個簡單的評分矩陣:
這個矩陣反應了這些事實:用戶 1 給物品 A、B、C 都評分了,分別是 5,3,2;用戶 2 給物品 A、B 評分了,分別是 三、4;用戶
3 給物品 B、C 評分了,分別是 二、5。如今首先來兩兩計算物品之間的差距:
括號裏表示兩個物品的共同用戶數量,表明兩個物品差距的置信程度。好比物品 A 和物品 B 之間的差距是 0.5,共同用戶數是 2,反之,物品
B 和物品 A 的差距是 -0.5,共同用戶數仍是 2。知道這個差距後,就能夠用一個物品去預測另外一個物品的評分。 若是隻知道用戶 3 給物品
B 的評分是 2,那麼預測用戶 3 給物品 A 的評分呢就是 2.5,由於從物品 B 到物品 A 的差距是 0.5。
在此基礎上繼續推動,若是知道用戶給多個物品評分了,怎麼彙總這些分數呢? 方法是把單個預測的分數按照共同用戶數加權求平均。好比如今知道用戶 3
不但給物品 B 評分爲 2,還給物品 C 評分爲 5,物品 B 對物品 A 的預測是 2.5 分,剛纔計算過了,物品 C 給物品 A
的預測是 8 分,再加權平均。 就獲得了推薦分數爲 4.33 分。是否是很簡單? 總結
今天咱們在基於用戶的協同過濾基礎上介紹了比較常見的一個算法:基於物品的協同過濾。這個方法經常在電商網站上見到,「買了又買」「看了又看」這樣的相關推薦,都是由這個推薦算法產生。

最後咱們介紹了一個改良版的基於物品推薦算法 Slope One。這裏也留下了一個問題給你:爲何說 Slope One 能夠作到在線更新呢?歡迎留言討論。

相關文章
相關標籤/搜索