本系列文章會從最簡單的推薦系統到目前主流的推薦系統解決方案作總結。算法
基於鄰域的算法是推薦系統中最基本的算法,在業界獲得了普遍應用。基於鄰域的算法分爲兩大類,一類是基於用戶的協同過濾算法,另外一類是基於物品的協同過濾算法。編程
定義:性能
在一個在線個性化推薦系統中,當一個用戶A須要個性化推薦時,能夠先找到和他有類似興趣的其餘用戶,而後把那些用戶喜歡的、而用戶A沒有據說過的物品推薦給A。網站
步驟:ui
設用戶u和用戶v ,N(u)表示用戶u曾經有過正反饋的物品集合,N(v)表示用戶v曾經有過正反饋的物品集合。能夠經過下面幾種方法計算用戶的興趣類似度。spa
舉例:設計
用戶A對物品{a, b, d}有過行爲,用戶B對物品{a, c}有過行爲,利用餘弦類似度公式計算用戶A和用戶B的興趣類似度爲:3d
同理,能夠計算出用戶A和用戶C、 D的類似度:orm
分析:blog
以上例子對兩兩用戶經過利用餘弦類似度計算類似度。這種方法的時間複雜度是O(|U|*|U|),這在用戶數很大時很是耗時。解決辦法是創建「物品—用戶」的倒排表。能夠掃描倒排表中每一個物品對應的用戶列表,令稀疏矩陣C[u][v]= | N(u)∩N (v) |,將用戶列表中的兩兩用戶對應的C[u][v]加1,最終就能夠獲得全部用戶之間不爲0的C[u][v],具體以下圖所示:
這裏的W是餘弦類似度中的分子部分,而後將W除以分母能夠獲得最終的用戶興趣類似度。
獲得用戶之間的興趣類似度後, UserCF算法會給用戶u推薦和他興趣最類似的K個用戶喜歡的物品。以下的公式度量了UserCF算法中用戶u對物品 i 的感興趣程度:
其中, S(u, K)包含和用戶u興趣最接近的K個用戶, N(i)是對物品 i 有過行爲的用戶集合,即用戶v的集合, wuv是用戶u和用戶v的興趣類似度, rvi表明用戶v對物品i的興趣。
舉例:
以上圖爲例,對用戶A進行推薦。選取K=3,用戶A對物品c、 e沒有過行爲,所以能夠把這兩個物品推薦給用戶A。根據UserCF算法,用戶A對物品c、 e的興趣是:
分析:
使用MovieLens數據集上的離線實驗來評測基礎算法的性能。 UserCF只有一個重要的參數K,即爲每一個用戶選出K個和他興趣最類似的用戶,而後推薦那K個用戶感興趣的物品:
能夠發現參數K是UserCF的一個重要參數,它的調整對推薦算法的各類指標都會產生必定的影響。
準確率和召回率:
能夠看到,推薦系統的精度指標(準確率和召回率)並不和參數K成線性關係。在MovieLens數據集中,選擇K=80左右會得到比較高的準確率和召回率。所以選擇合適的K對於得到高的推薦系統精度比較重要。固然,推薦結果的精度對K也不是特別敏感,只要選在必定的區域內,就能夠得到不錯的精度。
流行度:
能夠看到,在3個數據集上K越大則UserCF推薦結果就越熱門。這是由於K決定了UserCF在給你作推薦時參考多少和你興趣類似的其餘用戶的興趣,那麼若是K越大,參考的人越多,結果就愈來愈趨近於全局熱門的物品。
覆蓋率:
能夠看到,在3個數據集上, K越大則UserCF推薦結果的覆蓋率越低。覆蓋率的下降是由於流行度的增長,隨着流行度增長, UserCF愈來愈傾向於推薦熱門的物品,從而對長尾物品的推薦愈來愈少,所以形成了覆蓋率的下降。
用戶類似度計算的改進
餘弦類似度計算用戶興趣過於粗糙。
改進思路:兩個用戶對冷門物品採起過一樣的行爲更能說明他們興趣的類似度。
經過1/log(1+|N(i)|)懲罰了用戶u和用戶v共同興趣列表中熱門物品對他們類似度的影響。這種算法叫作User-IIF算法。
一樣地,對UserCF-IIF的推薦性能,並將其和UserCF進行對比:
能夠看到,UserCF-IIF在各項性能上略優於UserCF。這說明在計算用戶興趣類似度時考慮物品的流行度對提高推薦結果的質量確實有幫助。
基於用戶的協同過濾總結
基於物品的協同過濾算法是目前業界應用最多的算法。
定義:
給用戶推薦那些和他們以前喜歡的物品類似的物品。
步驟:
物品的類似度:
其中分母 |N(i)| 是喜歡物品 i 的用戶數,而分子 |N(i) ∩N(j)| 是同時喜歡物品 i 和物品 j 的用戶數。上述公式能夠理解爲喜歡物品 i 的用戶中有多少比例的用戶也喜歡物品 j 。
分析:
但上述公式存在一個問題,即若是物品 j 很熱門,不少人都喜歡,那麼Wij就會很大,接近1。即會形成任何物品都會和熱門的物品有很大的類似度,致使出現長尾效應。
物品類似度計算的改進
經過懲罰物品j的權重,從而減輕了熱門物品會和不少物品類似的可能性。
用ItemCF算法計算物品類似度時也能夠首先創建用戶—物品倒排表(即對每一個用戶創建一個包含他喜歡的物品的列表),而後對於每一個用戶,將他物品列表中的物品兩兩在共現矩陣C中加1。
上圖左邊是輸入的用戶行爲記錄,每一行表明一個用戶感興趣的物品集合。右邊矩陣C中的 C[i][j] 記錄了同時喜歡物品 i 和物品 j 的用戶數。最後,將C矩陣歸一化能夠獲得物品之間的餘弦類似度矩陣W。
在獲得物品之間的類似度後, ItemCF經過以下公式計算用戶u對一個物品 j 的興趣:
這裏N(u)是用戶喜歡的物品的集合, S(j,K)是和物品 j 最類似的K個物品的集合, wji是物品j和i的類似度, rui是用戶u對物品 i 的興趣度。(對於隱反饋數據集,若是用戶u對物品 i 有過行爲,那麼rui=1)
該公式的含義是,和用戶歷史上感興趣的物品越類似的物品,越有可能在用戶的推薦列表中得到比較高的排名。
例子:
用戶喜歡《C++ Primer中文版》和《編程之美》兩本書。而後ItemCF會爲這兩本書分別找出和它們最類似的3本書,並根據公式的定義計算用戶對每本書的感興趣程度。
能夠看到, ItemCF的一個優點就是能夠提供推薦解釋,即利用用戶歷史上喜歡的物品爲如今的推薦結果進行解釋。
分析:
ItemCF算法離線實驗的各項性能指標的評測結果:
精度(準確率和召回率)
能夠看到ItemCF推薦結果的精度也是不和K成正相關或者負相關的,所以選擇合適的K對得到最高精度很是重要。
流行度
和UserCF不一樣,參數K對ItemCF推薦結果流行度的影響也不是徹底正相關的。隨着K的增長,結果流行度會逐漸提升,但當K增長到必定程度,流行度就不會再有明顯變化。
覆蓋率
K增長會下降系統的覆蓋率。
物品類似度計算的改進
兩個物品產生類似度是由於它們共同出如今不少用戶的興趣列表中。換句話說,每一個用戶的興趣列表都對物品的類似度產生貢獻。那麼,是否是每一個用戶的貢獻都相同呢?
未必。有些用戶雖然活躍,可是買這些書並不是都是出於自身的興趣,並且這些書覆蓋了當當網圖書的不少領域,因此這個用戶對於他所購買書的兩兩類似度的貢獻應該遠遠小於一個只買了十幾本本身喜歡的書的文學青年。即:活躍用戶對物品類似度的貢獻應該小於不活躍的用戶。
ItemCF-IUF算法
上式增長用戶活躍度對數的倒數這個參數來修正物品類似度的計算公式。
ItemCF-Norm 算法
研究中發現若是將ItemCF的類似度矩陣按最大值歸一化,能夠提升推薦的準確率。所以,若是已經獲得了物品類似度矩陣w,那麼能夠用以下公式獲得歸一化以後的類似度矩陣w':
歸一化的好處不只僅在於增長推薦的準確度,它還能夠提升推薦的覆蓋率和多樣性。
能夠看到,歸一化確實能提升ItemCF的性能,其中各項指標都有了比較明顯的提升。
UserCF給用戶推薦那些和他有共同興趣愛好的用戶喜歡的物品。
ItemCF給用戶推薦那些和他以前喜歡的物品相似的物品。.
因此,UserCF的推薦結果着重於反映和用戶興趣類似的小羣體的熱點,既社會化。而ItemCF的推薦結果着重於維繫用戶的歷史興趣,即個性化。
所以,在新聞推薦中使用UserCF,緣由有三:
在圖書、電子商務和電影網站中使用ItemCF,緣由有三:
總結
在設計ItemCF算法之初發現ItemCF算法計算出的圖書相關表存在一個問題,就是不少書都和《哈利波特》相關。也就是說,購買任何一本書的人彷佛都會購買《哈利波特》。後來他們研究發現,主要是由於《哈利波特》太熱門了,確實是購買任何一本書的人幾乎都會購買它。
但實際上,這些書與《哈利波特》並不一樣屬同一類型。換句話說,哈利波特問題描述的是兩個不一樣領域的最熱門物品之間每每具備比較高的類似度。
解決辦法:
其中一個辦法是能夠在分母上加大對熱門物品的懲罰,好比採用以下公式:
其中α∈[0.5 ,1] 。經過提升α,就能夠懲罰熱門的物品 j 。而更好的方法是依靠引入物品的內容數據解決這個問題,好比對不一樣領域的物品下降權重等。