爲推薦系統選擇正確的推薦算法很是重要,而可用的算法不少,想要找到最適合所處理問題的算法仍是頗有難度的。這些算法每種都各有優劣,也各有侷限,所以在做出決策前咱們應當對其作以衡量。在實踐中,咱們極可能須要測試多種算法,以便找出最適合用戶的那種;瞭解這些算法的概念以及工做原理,對它們有個直觀印象將會頗有幫助。算法
推薦算法一般是在推薦模型中實現的,而推薦模型會負責收集諸如用戶偏好、物品描述這些可用做推薦憑藉的數據,據此預測特定用戶組可能感興趣的物品。數組
主要的推薦算法系列有四個(表格1-4):網絡
此外,還有不少高級或非傳統的方式,可參見表格5。機器學習
本文是系列文中的第一篇,將會以表格形式來介紹推薦算法的主要分類,包括算法簡介、典型的輸入內容、常見的形式及其優劣。在系列文的第二與第三篇中,咱們將會更詳細地介紹各類算法的不一樣,以便讓你們更深刻地理解其工做原理。本文的某些內容是基於一篇2014年的推薦算法2014教程《推薦問題再探(Recommender Problem Revisited)》來撰寫的,該文的做者是Xavier Amatriain。ide
表格一:協同過濾推薦算法概覽wordpress
表格二:基於內容過濾的推薦算法概覽函數
表格三:混合方式的推薦算法概覽工具
表格四:流行度推薦算法概覽學習
表格五:高級或「非傳統」推薦算法概覽測試
本文是系列文中的第二篇,將會列出推薦算法的備忘列表,介紹推薦算法的主要分類。在本文中,咱們會更詳細地介紹協同過濾推薦算法,並討論其優劣,以便你們更深入地理解其工做原理。
協同過濾(CF)推薦算法會尋找用戶的行爲模式,並據此建立用戶專屬的推薦內容。這種算法會根據系統中的用戶使用數據——好比用戶對讀過書籍的評論來肯定用戶對其喜好程度。關鍵概念在於:若是兩名用戶對於某件物品的評分方式相似,那麼他們對於某個新物品的評分極可能也是類似的。值得注意的是:這種算法無需再額外依賴於物品信息(好比描述、元數據等)或者用戶信息(好比感興趣的物品、統計數據等)。協同過濾推薦算法可分爲兩類:基於鄰域的與基於模型的。在前一種算法(也就是基於內存的協同過濾推薦算法)中,用戶-物品評分可直接用以預測新物品的評分。而基於模型的算法則經過評分來研究預測性的模型,再根據模型對新物品做出預測。大體理念就是經過機器學習算法,在數據中找出模式,並將用戶與物品間的互動方式模式化。
基於鄰域的協同過濾則着眼於物品之間的關係(即基於物品的協同過濾)或者用戶之間的關係(基於用戶的協同過濾)。
基於用戶的協同過濾是探索對物品擁有類似品味的用戶,並基於彼此喜好的物品來進行互推。
基於物品的協同過濾是用戶喜好的物品,推薦相似的東西。而這種類似性創建在物品同時出現的基礎上,好比購買了x物品的用戶也購買了y物品。
首先,在執行基於物品的協同過濾前,咱們先看一個基於用戶的協同過濾案例。
假設咱們有一些用戶已經表達了他們對某些書籍的偏好,他們越喜歡某本書,對這本書的評分也越高(評分範圍是1分到5分)。咱們能夠在一個矩陣中重現他們的這種偏好,用行表明用戶,用列表明書籍。
圖一:用戶書籍偏好全部偏好的範圍都是1分到5分,5分是最高(也就是最喜歡的)。第一個用戶(行1)給第一本書(列1)的評分爲4分,若是某個單元格爲空,表明着用戶並未對這本書做出評價。
在基於用戶的協同過濾算法中,咱們要作的第一件事就是根據用戶對書籍的偏好,計算出他們彼此間的類似度。咱們從某個單獨用戶的角度來看一下這個問題,以圖一中第一行的用戶爲例。一般咱們會將每一個用戶都做爲向量(或者數組),其中包含了用戶對物品的偏好。經過多種相似的指標對用戶進行對比是至關直接的。在本例中,咱們會使用餘弦類似點。咱們將第一位用戶與其餘五位相對比,能夠發現第一位與其餘用戶的類似度有多少(圖二)。就像大多類似度指標同樣,向量之間的類似度越高,彼此也就越類似。在本例中,第一位用戶與其中兩位有兩本相同的書籍,類似度較高;與另兩位只有一本相同書籍,類似度較低;與最後一位沒有相同書籍,類似度爲零。
圖二:第一位用戶與其餘用戶的類似性。能夠在一個單獨的維度中繪製用戶間的餘弦類似性。
更常見的狀況下,咱們能夠計算出每名用戶與全部用戶的類似程度,並在類似性矩陣中表現出來(圖三)。這是一個對稱矩陣,也就是說其中一些有用的屬性是能夠執行數學函數運算的。單元格的背景色代表了用戶彼此間的類似程度,紅色越深則類似度越高。
圖三:用戶間的類似矩陣,每一個用戶的類似度是基於用戶閱讀書籍間的類似性。
如今,咱們準備使用基於用戶的協同過濾來生成給用戶的推薦。對於特定的用戶來講,這表明着找出與其類似性最高的用戶,並根據這些相似用戶喜好的物品進行推薦,具體要參照用戶類似程度來加權。咱們先以第一個用戶爲例,爲其生成一些推薦。首先咱們找到與這名用戶類似程度最高的n名用戶,刪除這名用戶已經喜歡過的書籍,再對最類似用戶閱讀過的書籍進行加權,以後將全部結果加在一塊兒。在本例中,咱們假設n=2,也就是說取兩名與第一位用戶最類似的用戶,以生成推薦結果,這兩名用戶分別是用戶2及用戶3(圖四)。因爲第一名用戶已經對書籍1和書籍5作出了評分,推薦結果生成書籍3(分數4.5)及書籍4(分數3)。
圖四:爲一名用戶生成推薦。咱們取這兩名最類似的用戶所閱讀的書籍,進行加權,而後對這名用戶還沒有評分的書籍進行推薦。
如今咱們對基於用戶的協同過濾有了更深入的理解,以後來看一個基於物品的協同過濾的案例。咱們仍是用同一組用戶(圖一)爲例。
在基於物品的協同過濾中,與基於用戶的協同過濾相似,咱們要作的第一件事就是計算類似度矩陣。但這一回,咱們想要針對物品而非用戶來看看它們之間的類似性。與以前相似,咱們以書籍做爲喜好者的向量(或數組),將其與餘弦類似度函數相對比,從而揭示出某本書籍與其餘書籍之間的類似程度。因爲同一組用戶給出的評分大體相似,位於列1的第一本書與位於列5的第五本書類似度是最高的(圖五)。其次是類似度排名第三的書籍,有兩位相同的用戶喜好;排名第四和第二的書籍只有一位共同讀者;而排名最後的書籍因爲沒有共同讀者,類似度爲零。
圖五:第一本書與其餘書籍的對比。書籍經過所閱讀用戶的評價來表現。經過餘弦類似度指標(0-1)來進行對比,類似度越高,兩本書就越類似。
咱們還能夠在類似矩陣中展現出全部書籍彼此間的類似程度(圖六)。一樣以背景顏色區分了兩本書彼此間的類似程度,紅色越深類似程度也越高。
圖六:書籍的類似矩陣
如今咱們知道每本書彼此間的類似程度了,能夠爲用戶生成推薦結果。在基於物品的協同過濾中,咱們根據用戶此前曾評過度的物品,推薦與其最爲類似的物品。在案例中,第一位用戶得到的推薦結果爲第三本書籍,而後是第六本(圖七)。一樣地,咱們只取與用戶以前評論過的書籍最類似的兩本書。
圖七:爲某位用戶生成推薦結果。咱們取到他們以前評論過的書籍目錄,找出與每本書籍最類似的兩本,再對用戶還沒有評論過的書籍進行推薦。
根據上述描述,基於用戶與基於物品的協同過濾彷佛很是相似,所以能得出不一樣的結果這一點確實頗有意思。即使在上例中,這兩種方式都能爲同一名用戶得出不一樣的推薦結果,儘管二者的輸入內容是相同的。在構建推薦時,這兩種形式的協同過濾方式都是值得考慮的。儘管在向外行描述時,這兩種方法看起來很是相似,但實際上它們能得出很是不一樣的推薦結果,從而爲用戶帶來徹底不一樣的體驗。
因爲簡單高效,且生成的推薦結果準確、個性化,鄰域方法也是至關受歡迎的。但因爲要計算(用戶或物品間的)類似度,隨着用戶或物品數量的增加,也會出現一些伸縮性方面的侷限。在最糟的狀況下,須要計算O(m*n),但在現實中狀況略好一些,只要計算O(m+n)便可,部分緣由在於利用了數據的稀疏度。儘管稀疏度有助於擴展實現,但同時也爲基於鄰域的方法提出了挑戰,由於在海量的物品中,僅有少許是有用戶評論過的。例如,Mendeley系統中有數百萬篇文章,而一名用戶也許只讀過其中幾百篇。兩名各讀過100篇文章的用戶具備類似度的可能性僅爲0.0002(在5000萬篇文章的目錄中)。
基於模型的協同過濾方式能夠克服基於鄰域方法的限制。與使用用戶-物品評分直接預測新物品評分的鄰域方式不一樣,基於模型的方法則使用評分來研究預測性模型,並根據模型來預測新物品。大體理念就是經過機器學習算法,在數據中找出模式,並將用戶與物品間的互動方式模式化。整體來說,基於模型的協同過濾方式是構建協同過濾更高級的算法。不少不一樣的算法都能用來構建模型,以進行預測;例如貝葉斯網絡、集羣、分類、迴歸、矩陣因式分解、受限波爾茲曼機等,這些技術其中有些在得到Netflix Prize獎項時起到了關鍵性做用。Netflix在2006年到2009年間舉辦競賽,當時還爲可以生成準確度超過其系統10%的推薦系統製做團隊提供100萬美圓的大獎。勝出的解決方案是一套綜合了逾100種不一樣算法模型,並在生產環境中採用了矩陣因式分解與受限玻爾茲曼機的方法。
矩陣因式分解(好比奇異值分解、SVD++)將物品與用戶都轉化爲同一個隱空間,表現了用戶與物品間的底層互動(圖八)。矩陣因式分解背後的原理在於:其潛在特性表明了用戶如何對物品進行評分。根據用戶與物品的潛在表現,咱們就能夠預測用戶對未評分的物品的喜好程度。
圖八:矩陣分解算法的演示,用戶偏好矩陣能夠分解爲用戶主題矩陣乘以物品主題矩陣。
在表一中,咱們列出了鄰域算法與基於模型的協同過濾算法的關鍵優劣點。因爲協同過濾算法只依賴於用戶的使用數據,想要生成足夠優秀的推薦結果無需對技術工做有太多瞭解,但這種算法也有其侷限。例如,CF更容易推薦流行物品,所以爲品味獨特的用戶推薦物品時就會比較困難(即對其感興趣的物品可能不具備太多的使用數據),也就是流行度偏好的問題,這一點一般能夠經過基於內容的過濾算法解決。CF算法更重要的一個限制就是所謂的「冷啓動問題」——系統沒法爲沒有或使用行爲不多的用戶提供推薦(也就是新用戶的問題),也沒法爲沒有或使用行爲不多的物品提供推薦(也就是新物品的問題)。新用戶的「冷啓動問題」能夠經過流行度和混合算法來解決,而新物品問題能夠經過基於內容過濾或multi-armed bandit推薦算法(即探索-利用)來解決。在下篇文章中咱們會詳細討論其中一些算法。
本文中,咱們介紹了三種基本的協同過濾算法實現。基於物品、基於用戶的協同過濾算法,以及矩陣分解算法之間的區別都很細微,一般很難簡單地解釋其差別。理解這些算法間的差別有助於咱們選擇推薦系統最適合的算法。在下篇文章中,咱們會繼續深刻探討推薦系統的流行算法。
本文是系列文中的第三篇。第一篇文章經過列表形式介紹了推薦算法的主要分類,第二篇文章介紹了不一樣類型的協同過濾算法,強調了其間的一些細微差異。在本文中,咱們將會更加詳細地介紹基於內容的過濾算法並討論其優缺點,以更好地理解其工做原理。
基於內容的過濾算法會推薦與用戶最喜歡的物品相似的那些。可是,與協同過濾算法不一樣,這種算法是根據內容(好比標題、年份、描述),而不是人們使用物品的方式來總結其相似程度的。例如,若是某個用戶喜歡電影《魔戒》的第一部和第二部,那麼推薦系統會經過標題關鍵字向用戶推薦《魔戒》的第三部。在基於內容的過濾算法中,會假設每一個物品都有足夠的描述信息可做爲特徵向量(y)(好比標題、年代、描述),而這些特徵向量會被用來建立用戶偏好模型。各類信息檢索(好比tf-idf)以及機器學習技術(好比樸素貝葉斯算法、支持向量機、決策樹等)均可用於生成用戶模型,以後再根據模型來進行推薦。
假設咱們有一些用戶已經表達了他們對某些書籍的偏好,他們越喜歡某本書,對這本書的評分也越高(評分範圍是1分到5分)。咱們能夠在一個矩陣中重現他們的這種偏好,用行表明用戶,用列表明書籍。
圖一:用戶書籍偏好全部偏好的範圍都是1分到5分,5分是最高的(也就是最喜歡的)。第一個用戶(行1)給第一本書(列1)的評分爲4分,若是某個單元格爲空,表明着用戶並未對這本書做出評價。
在基於內容的協同過濾算法中,咱們要作的第一件事就是根據內容,計算出書籍之間的類似度。在本例中,咱們使用了書籍標題中的關鍵字(圖二),這只是爲了簡化而已。在實際中咱們還可使用更多的屬性。
圖二:用戶已經評論過的書籍標題
首先,一般咱們要從內容中刪除中止詞(好比語法詞、過於常見的詞),而後用表明出現哪些詞彙的向量(或數組)對書籍進行表示(圖三),這就是所謂的向量空間表示。
圖三:使用標題的詞彙若是在標題中有這個詞,咱們以1爲標記,不然爲空。
有了這個表格,咱們就可使用各類類似指標直接對比各本書籍。在本例中,咱們會使用餘弦類似點。當咱們使用第一本書籍,將其與其餘五本書籍對比時,就能看到第一本書籍與其餘書籍的類似程度(圖四)。就像大多類似度指標同樣,向量之間的類似度越高,彼此也就越類似。在本例中,第一本書與其餘三本書都很相似,都有兩個共同的詞彙(推薦和系統)。而標題越短,兩本書的類似程度越高,這也在情理之中,由於這樣一來,不相同的詞彙也就越少。鑑於徹底沒有共同詞彙,第一本書與其餘書籍中的兩本徹底沒有相似的地方。
圖四:第一本書與其餘書籍間的類似性在單個維度中經過兩本書之間的餘弦類似度就能繪製出來。
咱們還能夠在類似矩陣中展現出全部書籍彼此間的類似程度(圖五)。單元格的背景色代表了用戶彼此間的類似程度,紅色越深類似度越高。
圖五:書籍間的類似矩陣,每一個類似點都是基於書籍向量表示之間的餘弦類似度。
如今咱們知道每本書彼此間的類似程度了,能夠爲用戶生成推薦結果。與基於物品的協同過濾方式相似,咱們在以前的文章中也介紹過,推薦系統會根據用戶以前評價過的書籍,來推薦其餘書籍中類似度最高的。區別在於:類似度是基於書籍內容的,準確來講是標題,而不是根據使用數據。在本例中,系統會給第一個用戶推薦第六本書,以後是第四本書(圖六)。一樣地,咱們只取與用戶以前評論過的書籍最類似的兩本書。
圖六:爲某個用戶生成推薦結果。咱們取到他們以前評論過的書籍目錄,找出與每本書籍最類似的兩本,再對用戶還沒有評論過的書籍進行推薦。
基於內容的算法解決了協同過濾算法的某些限制,尤爲能協助咱們克服流行度偏見,以及新物品的冷啓動問題,而這些咱們已經在協同過濾的部分中討論過了。然而,值得注意的是:純粹基於內容的推薦系統一般在執行時效果不如那些基於使用數據的系統(好比協同過濾算法)。基於內容過濾的算法也會有過分專業化的問題,系統可能會向用戶推薦過多相同類型的物品(好比得到全部《魔戒》電影的推薦),而不會推薦那些雖然類型不一樣,可是用戶也感興趣的物品。最後,基於內容的算法在實現時只會使用物品元數據中所含的詞彙(好比標題、描述年份),更容易推薦更多相同的內容,限制了用戶探索發現這些詞彙以外的內容。關於基於內容過濾的優劣總結見表二。
本文是系列文中的第四篇。第一篇文章經過列表形式介紹了推薦算法的主要分類,第二篇文章介紹了不一樣類型的協同過濾算法,強調了其間的一些細微差異,在第三篇中咱們詳細介紹了基於內容的過濾算法。本文將會討論基於以前提過算法而造成的混合型推薦系統,也會簡單討論如何利用流行度來解決一些協同過濾算法與基於內容過濾算法的限制。
混合算法結合了用戶及物品的內容特性以及使用數據,以利用這兩類數據的優勢。結合了A算法與B算法的某個混合型推薦系統會嘗試利用A算法的優勢以解決B算法的缺點。例如,協同過濾算法存在新物品的問題,也就是說這種算法沒法推薦用戶未評價或使用過的物品。由於是基於內容(特性)預測的,這一點並不會對基於內容的算法產生限制。而結合了協同過濾與基於內容過濾算法的混合型推薦系統可以解決單個算法中的一些限制,好比冷啓動的問題與流行度偏好的問題。表一列出了一些不一樣的方法,包括如何結合兩種甚至更多基礎推薦系統技術,以建立新的混合型系統。
表一:結合兩種甚至更多的基礎推薦算法,以建立新混合算法的不一樣方式。
假設咱們有一些用戶已經表達了他們對某些書籍的偏好,他們越喜歡某本書,對這本書的評分也越高(評分級別分別爲1-5)。咱們能夠在一個矩陣中重現他們的這種偏好,用行表明用戶,用列表明書籍。
圖一:用戶書籍偏好全部偏好的範圍都是1分到5分,5分是最高的(也就是最喜歡的)。第一名用戶(行1)對第一本書(列1)的評分爲4分,若是某個單元格爲空,表明着用戶並未對這本書做出評價。
在本文所屬系列的第二篇中,咱們給出了兩個案例,包括如何使用基於物品及基於用戶的協同過濾算法來計算推薦結果;在本文所屬系列的第三篇中,咱們演示瞭如何使用基於內容的過濾算法來生成推薦結果。如今咱們將這三種不一樣的算法結合起來,生成一種全新的混合型推薦結果。咱們會使用加權法(表一)結合多種技術得出的結果,以後這三種算法即可按照不一樣的權值(根據重要性不一樣)結合得出一組新的推薦結果。
咱們先以第一個用戶爲例,爲其生成一些推薦。首先咱們會根據第二篇中的基於用戶的協同過濾算法,基於物品的協同過濾算法,以及第三篇中基於內容過濾的算法,各自生成推薦結果。值得注意的是,在這個小案例中,這三種方法爲同一名用戶生成的推薦結果有着輕微的差別,儘管輸入的內容是徹底相同的。
圖二:爲某個用戶生成的推薦結果——分別使用基於用戶的協同過濾算法,基於物品的協同過濾算法,以及基於內容的過濾算法。
下一步,咱們使用加權混合推薦算法爲指定用戶生成推薦結果,加權值分別爲:基於用戶的協同過濾算法40%,基於物品的協同過濾算法30%,基於內容過濾的算法30%(圖三)。在這個案例中,系統會向用戶推薦他們從未看過的全部三本書,而使用單個算法只會推薦其中兩本。
圖三:使用加權混合推薦系統爲某個用戶生成推薦結果,具體權值參見上文。
儘管混合型算法解決了CF與CB算法的一些重大挑戰與限制(見圖三),但在系統中平衡不一樣的算法也須要不少工做量。另外一種結合單個推薦算法的方式是使用集成方法,關於如何結合不一樣算法得出的結果,咱們研究得出了一個函數。值得注意的是:一般集成算法不只結合了不一樣的算法,還結合了根據同一種算法得出的不一樣變體與模型。例如:得到Netflix Prize獎項的解決方案包含了從10多種算法(流行度、鄰域算法、矩陣分解算法、受限波爾茲曼機、迴歸等等)得出的100多種不一樣的模型,並經過迭代決策樹(GBDT)將這些算法與模型結合在一塊兒。
另外,基於流行度的算法對於新用戶的冷啓動問題來講也是一個優秀的解決方案。這些算法經過某些流行度的測量標準,好比下載最多的或者購買最多的,來對物品進行排名,並將這些流行度最高的物品推薦給新用戶。當擁有合適的流行度衡量指標時,這個辦法雖然基礎卻頗有效,一般能夠爲其餘算法提供很好的基線標準。流行度算法也能夠單獨做爲算法使用,以引導推薦系統在換到其餘更切合用戶興趣點的算法(好比協同過濾算法以及基於內容過濾的算法)前得到足夠的活躍度與使用量。流行度模型也能夠引入混合算法中,從而解決新用戶的冷啓動問題。
本文是推薦算法系列文中的第五篇。第一篇文章經過列表形式介紹了推薦算法的主要分類,第二篇文章介紹了不一樣類型的協同過濾算法,強調了其間的一些細微差異,在第三篇中咱們詳細介紹了基於內容的過濾算法,在第四篇中咱們講解了混合型推薦系統以及基於流行度的算法。在本篇中,咱們會對簡單瞭解一下如何對一些高級的推薦算法作以選擇,再回顧一下基礎算法得出的推薦結果差別有多大,以便本系列完美收官。
除了咱們截至目前提到的一些更爲傳統的推薦系統算法以外(好比流行度算法、協同過濾算法、基於內容過濾的算法、混合型算法),還有許多其餘算法也可用於增強推薦系統的功能,包括有:
這些更爲高級的非傳統算法對於將現有推薦系統的質量推向更高層次頗有好處,但理解起來也更困難,推薦工具的支持上也不夠。在實踐中,咱們總要權衡實現高級算法的代價與對基礎算法的增益相比較是否值得。根據經驗來看,基礎算法還能使用好久,爲一些很優秀的產品提供服務。
在本系列文中,咱們但願介紹一些常見的推薦模塊算法,包括基於用戶的協同過濾算法,基於物品的協同過濾算法,基於內容的過濾算法,以及混合型算法。咱們使用了一個案例,說明了這四種不一樣算法在輸入數據相同時,應用於同一個案例時,爲同一個用戶生成的不一樣推薦結果(圖一)。當應用於真實世界的大型數據時,這樣的效應依然存在,所以決定使用哪一種算法時,須要考慮相關的優缺點以及執行效果。
圖一:四種推薦系統算法所有使用同一組數據,卻得出了不一樣的結果。左側咱們給出了一個矩陣,標明瞭用戶對大量物品的不一樣偏好,並列出了能夠推薦的物品名稱。在中間,咱們展現了這四種不一樣算法如何爲第一名用戶生成推薦結果(也就是用戶偏好矩陣中第一行的用戶)。就像類似矩陣中展現的那樣,這些算法對類似度有不一樣的定義。右側則是每種推薦算法生成的一些物品,從上到下分別按照四種算法的介紹順序來排序。
在實踐中,通常若是在推薦模型中使用協同過濾算法,就不會犯太大錯誤。協同過濾算法彷佛比其餘算法更優秀,但在冷啓動用戶及物品方面會有問題,所以一般會使用基於內容的算法做爲輔助。若是有時間的話,使用混合型算法就能夠結合協同過濾及基於內容過濾算法優點了。將這些基礎算法放在一塊兒固然是個好辦法,甚至比高級算法還要更好。
最後這一點值得牢記:推薦模型只是五個推薦系統組件中的一個。與全部組件相似,正確設置並努力創建模型很是重要,不過選擇數據集、處理、後處理、在線模塊及用戶界面也一樣重要。正如咱們再三強調的那樣,算法只是推薦系統的一部分,整個產品應當將你的決策歸入考量。