1. 程式人生 > >個性化推薦模型

個性化推薦模型

集體智慧 (Collective Intelligence) 並不是 Web2.0 時代特有的,只是在 Web2.0 時代,大家在 Web 應用中利用集體智慧構建更加有趣的應用或者得到更好的使用者體驗。集體智慧是指在大量的人群的行為和資料中收集答案,幫助你對整個人群得到統計意義上的結論,這些結論是我們在單個個體上無法得到的,它往往是某種趨勢或者人群中共性的部分。

Wikipedia 和 Google 是兩個典型的利用集體智慧的 Web 2.0 應用:

  • Wikipedia 是一個知識管理的百科全書,相對於傳統的由領域專家編輯的百科全書,Wikipedia 允許終端使用者貢獻知識,隨著參與人數的增多,Wikipedia 變成了涵蓋各個領域的一本無比全面的知識庫。也許有人會質疑它的權威性,但如果你從另一個側面想這個問題,也許就可以迎刃而解。在發行一本書時,作者雖然是權威,但難免還有一些錯誤,然後通過一版一版的改版,書的內容越來越完善。而在 Wikipedia 上,這種改版和修正被變為每個人都可以做的事情,任何人發現錯誤或者不完善都可以貢獻他們的想法,即便某些資訊是錯誤的,但它一定也會盡快的被其他人糾正過來。從一個巨集觀的角度看,整個系統在按照一個良性迴圈的軌跡不斷完善,這也正是集體智慧的魅力。
  • Google:目前最流行的搜尋引擎,與 Wikipedia 不同,它沒有要求使用者顯式的貢獻,但仔細想想 Google 最核心的 PageRank 的思想,它利用了 Web 頁面之間的關係,將多少其他頁面連結到當前頁面的數目作為衡量當前頁面重要與否的標準;如果這不好理解,那麼你可以把它想象成一個選舉的過程,每個 Web 頁面都是一個投票者同時也是一個被投票者,PageRank 通過一定數目的迭代得到一個相對穩定的評分。Google 其實利用了現在 Internet 上所有 Web 頁面上鍊接的集體智慧,找到哪些頁面是重要的。

協同過濾是利用集體智慧的一個典型方法。要理解什麼是協同過濾 (Collaborative Filtering, 簡稱 CF),首先想一個簡單的問題,如果你現在想看個電影,但你不知道具體看哪部,你會怎麼做?大部分的人會問問周圍的朋友,看看最近有什麼好看的電影推薦,而我們一般更傾向於從口味比較類似的朋友那裡得到推薦。這就是協同過濾的核心思想。

協同過濾一般是在海量的使用者中發掘出一小部分和你品位比較類似的,在協同過濾中,這些使用者成為鄰居,然後根據他們喜歡的其他東西組織成一個排序的目錄作為推薦給你。當然其中有一個核心的問題:

  • 如何確定一個使用者是不是和你有相似的品位?
  • 如何將鄰居們的喜好組織成一個排序的目錄?

協同過濾相對於集體智慧而言,它從一定程度上保留了個體的特徵,就是你的品位偏好,所以它更多可以作為個性化推薦的演算法思想。可以想象,這種推薦策略在 Web 2.0 的長尾中是很重要的,將大眾流行的東西推薦給長尾中的人怎麼可能得到好的效果,這也回到推薦系統的一個核心問題:瞭解你的使用者,然後才能給出更好的推薦。

前面作為背景知識,介紹了集體智慧和協同過濾的基本思想,這一節我們將深入分析協同過濾的原理,介紹基於協同過濾思想的多種推薦機制,優缺點和實用場景。

首先,要實現協同過濾,需要一下幾個步驟

  • 收集使用者偏好
  • 找到相似的使用者或物品
  • 計算推薦

要從使用者的行為和偏好中發現規律,並基於此給予推薦,如何收集使用者的偏好資訊成為系統推薦效果最基礎的決定因素。使用者有很多方式向系統提供自己的偏好資訊,而且不同的應用也可能大不相同,下面舉例進行介紹:


表 1 使用者行為和使用者偏好
使用者行為 型別 特徵 作用
評分 顯式 整數量化的偏好,可能的取值是 [0, n];n 一般取值為 5 或者是 10 通過使用者對物品的評分,可以精確的得到使用者的偏好
投票 顯式 布林量化的偏好,取值是 0 或 1 通過使用者對物品的投票,可以較精確的得到使用者的偏好
轉發 顯式 布林量化的偏好,取值是 0 或 1 通過使用者對物品的投票,可以精確的得到使用者的偏好。
如果是站內,同時可以推理得到被轉發人的偏好(不精確)
儲存書籤 顯示 布林量化的偏好,取值是 0 或 1 通過使用者對物品的投票,可以精確的得到使用者的偏好。
標記標籤
(Tag)
顯示 一些單詞,需要對單詞進行分析,得到偏好 通過分析使用者的標籤,可以得到使用者對專案的理解,同時可以分析出使用者的情感:喜歡還是討厭
評論 顯示 一段文字,需要進行文字分析,得到偏好 通過分析使用者的評論,可以得到使用者的情感:喜歡還是討厭
點選流 
( 檢視 )
隱式 一組使用者的點選,使用者對物品感興趣,需要進行分析,得到偏好 使用者的點選一定程度上反映了使用者的注意力,所以它也可以從一定程度上反映使用者的喜好。
頁面停留時間 隱式 一組時間資訊,噪音大,需要進行去噪,分析,得到偏好 使用者的頁面停留時間一定程度上反映了使用者的注意力和喜好,但噪音偏大,不好利用。
購買 隱式 布林量化的偏好,取值是 0 或 1 使用者的購買是很明確的說明這個專案它感興趣。

以上列舉的使用者行為都是比較通用的,推薦引擎設計人員可以根據自己應用的特點新增特殊的使用者行為,並用他們表示使用者對物品的喜好。

在一般應用中,我們提取的使用者行為一般都多於一種,關於如何組合這些不同的使用者行為,基本上有以下兩種方式:

  • 將不同的行為分組:一般可以分為“檢視”和“購買”等等,然後基於不同的行為,計算不同的使用者 / 物品相似度。類似於噹噹網或者 Amazon 給出的“購買了該圖書的人還購買了 ...”,“查看了圖書的人還查看了 ...”
  • 根據不同行為反映使用者喜好的程度將它們進行加權,得到使用者對於物品的總體喜好。一般來說,顯式的使用者反饋比隱式的權值大,但比較稀疏,畢竟進行顯示反饋的使用者是少數;同時相對於“檢視”,“購買”行為反映使用者喜好的程度更大,但這也因應用而異。

收集了使用者行為資料,我們還需要對資料進行一定的預處理,其中最核心的工作就是:減噪和歸一化。

  • 減噪:使用者行為資料是使用者在使用應用過程中產生的,它可能存在大量的噪音和使用者的誤操作,我們可以通過經典的資料探勘演算法過濾掉行為資料中的噪音,這樣可以是我們的分析更加精確。
  • 歸一化:如前面講到的,在計算使用者對物品的喜好程度時,可能需要對不同的行為資料進行加權。但可以想象,不同行為的資料取值可能相差很大,比如,使用者的檢視資料必然比購買資料大的多,如何將各個行為的資料統一在一個相同的取值範圍中,從而使得加權求和得到的總體喜好更加精確,就需要我們進行歸一化處理。最簡單的歸一化處理,就是將各類資料除以此類中的最大值,以保證歸一化後的資料取值在 [0,1] 範圍中。

進行的預處理後,根據不同應用的行為分析方法,可以選擇分組或者加權處理,之後我們可以得到一個使用者偏好的二維矩陣,一維是使用者列表,另一維是物品列表,值是使用者對物品的偏好,一般是 [0,1] 或者 [-1, 1] 的浮點數值。

當已經對使用者行為進行分析得到使用者喜好後,我們可以根據使用者喜好計算相似使用者和物品,然後基於相似使用者或者物品進行推薦,這就是最典型的 CF 的兩個分支:基於使用者的 CF 和基於物品的 CF。這兩種方法都需要計算相似度,下面我們先看看最基本的幾種計算相似度的方法。

相似度的計算

關於相似度的計算,現有的幾種基本方法都是基於向量(Vector)的,其實也就是計算兩個向量的距離,距離越近相似度越大。在推薦的場景中,在使用者 - 物品偏好的二維矩陣中,我們可以將一個使用者對所有物品的偏好作為一個向量來計算使用者之間的相似度,或者將所有使用者對某個物品的偏好作為一個向量來計算物品之間的相似度。下面我們詳細介紹幾種常用的相似度計算方法:

  • 歐幾里德距離(Euclidean Distance)

最初用於計算歐幾里德空間中兩個點的距離,假設 x,y 是 n 維空間的兩個點,它們之間的歐幾里德距離是:

Figure xxx. Requires a heading

可以看出,當 n=2 時,歐幾里德距離就是平面上兩個點的距離。

當用歐幾里德距離表示相似度,一般採用以下公式進行轉換:距離越小,相似度越大

Figure xxx. Requires a heading
  • 皮爾遜相關係數(Pearson Correlation Coefficient)

皮爾遜相關係數一般用於計算兩個定距變數間聯絡的緊密程度,它的取值在 [-1,+1] 之間。

Figure xxx. Requires a heading

sx, sy是 x 和 y 的樣品標準偏差。

  • Cosine 相似度(Cosine Similarity)

Cosine 相似度被廣泛應用於計算文件資料的相似度:

Figure xxx. Requires a heading
  • Tanimoto 係數(Tanimoto Coefficient)

Tanimoto 係數也稱為 Jaccard 係數,是 Cosine 相似度的擴充套件,也多用於計算文件資料的相似度:

Figure xxx. Requires a heading

相似鄰居的計算

介紹完相似度的計算方法,下面我們看看如何根據相似度找到使用者 - 物品的鄰居,常用的挑選鄰居的原則可以分為兩類:圖 1 給出了二維平面空間上點集的示意圖。

  • 固定數量的鄰居:K-neighborhoods 或者 Fix-size neighborhoods

不論鄰居的“遠近”,只取最近的 K 個,作為其鄰居。如圖 1 中的 A,假設要計算點 1 的 5- 鄰居,那麼根據點之間的距離,我們取最近的 5 個點,分別是點 2,點 3,點 4,點 7 和點 5。但很明顯我們可以看出,這種方法對於孤立點的計算效果不好,因為要取固定個數的鄰居,當它附近沒有足夠多比較相似的點,就被迫取一些不太相似的點作為鄰居,這樣就影響了鄰居相似的程度,比如圖 1 中,點 1 和點 5 其實並不是很相似。

  • 基於相似度門檻的鄰居:Threshold-based neighborhoods

與計算固定數量的鄰居的原則不同,基於相似度門檻的鄰居計算是對鄰居的遠近進行最大值的限制,落在以當前點為中心,距離為 K 的區域中的所有點都作為當前點的鄰居,這種方法計算得到的鄰居個數不確定,但相似度不會出現較大的誤差。如圖 1 中的 B,從點 1 出發,計算相似度在 K 內的鄰居,得到點 2,點 3,點 4 和點 7,這種方法計算出的鄰居的相似度程度比前一種優,尤其是對孤立點的處理。


圖 1.相似鄰居計算示意圖
圖 1 相似鄰居計算示意圖 

計算推薦

經過前期的計算已經得到了相鄰使用者和相鄰物品,下面介紹如何基於這些資訊為使用者進行推薦。本系列的上一篇綜述文章已經簡要介紹過基於協同過濾的推薦演算法可以分為基於使用者的 CF 和基於物品的 CF,下面我們深入這兩種方法的計算方法,使用場景和優缺點。

基於使用者的 CF(User CF)

基於使用者的 CF 的基本思想相當簡單,基於使用者對物品的偏好找到相鄰鄰居使用者,然後將鄰居使用者喜歡的推薦給當前使用者。計算上,就是將一個使用者對所有物品的偏好作為一個向量來計算使用者之間的相似度,找到 K 鄰居後,根據鄰居的相似度權重以及他們對物品的偏好,預測當前使用者沒有偏好的未涉及物品,計算得到一個排序的物品列表作為推薦。圖 2 給出了一個例子,對於使用者 A,根據使用者的歷史偏好,這裡只計算得到一個鄰居 - 使用者 C,然後將使用者 C 喜歡的物品 D 推薦給使用者 A。


圖 2.基於使用者的 CF 的基本原理
圖 2 基於使用者的 CF 的基本原理 

基於物品的 CF(Item CF)

基於物品的 CF 的原理和基於使用者的 CF 類似,只是在計算鄰居時採用物品本身,而不是從使用者的角度,即基於使用者對物品的偏好找到相似的物品,然後根據使用者的歷史偏好,推薦相似的物品給他。從計算的角度看,就是將所有使用者對某個物品的偏好作為一個向量來計算物品之間的相似度,得到物品的相似物品後,根據使用者歷史的偏好預測當前使用者還沒有表示偏好的物品,計算得到一個排序的物品列表作為推薦。圖 3 給出了一個例子,對於物品 A,根據所有使用者的歷史偏好,喜歡物品 A 的使用者都喜歡物品 C,得出物品 A 和物品 C 比較相似,而使用者 C 喜歡物品 A,那麼可以推斷出使用者 C 可能也喜歡物品 C。


圖 3.基於物品的 CF 的基本原理
圖 3 基於物品的 CF 的基本原理 

User CF vs. Item CF

前面介紹了 User CF 和 Item CF 的基本原理,下面我們分幾個不同的角度深入看看它們各自的優缺點和適用場景:

  • 計算複雜度

Item CF 和 User CF 是基於協同過濾推薦的兩個最基本的演算法,User CF 是很早以前就提出來了,Item CF 是從 Amazon 的論文和專利發表之後(2001 年左右)開始流行,大家都覺得 Item CF 從效能和複雜度上比 User CF 更優,其中的一個主要原因就是對於一個線上網站,使用者的數量往往大大超過物品的數量,同時物品的資料相對穩定,因此計算物品的相似度不但計算量較小,同時也不必頻繁更新。但我們往往忽略了這種情況只適應於提供商品的電子商務網站,對於新聞,部落格或者微內容的推薦系統,情況往往是相反的,物品的數量是海量的,同時也是更新頻繁的,所以單從複雜度的角度,這兩個演算法在不同的系統中各有優勢,推薦引擎的設計者需要根據自己應用的特點選擇更加合適的演算法。

  • 適用場景

在非社交網路的網站中,內容內在的聯絡是很重要的推薦原則,它比基於相似使用者的推薦原則更加有效。比如在購書網站上,當你看一本書的時候,推薦引擎會給你推薦相關的書籍,這個推薦的重要性遠遠超過了網站首頁對該使用者的綜合推薦。可以看到,在這種情況下,Item CF 的推薦成為了引導使用者瀏覽的重要手段。同時 Item CF 便於為推薦做出解釋,在一個非社交網路的網站中,給某個使用者推薦一本書,同時給出的解釋是某某和你有相似興趣的人也看了這本書,這很難讓使用者信服,因為使用者可能根本不認識那個人;但如果解釋說是因為這本書和你以前看的某本書相似,使用者可能就覺得合理而採納了此推薦。

相反的,在現今很流行的社交網路站點中,User CF 是一個更不錯的選擇,User CF 加上社會網路資訊,可以增加使用者對推薦解釋的信服程度。

  • 推薦多樣性和精度

研究推薦引擎的學者們在相同的資料集合上分別用 User CF 和 Item CF 計算推薦結果,發現推薦列表中,只有 50% 是一樣的,還有 50% 完全不同。但是這兩個演算法確有相似的精度,所以可以說,這兩個演算法是很互補的。

關於推薦的多樣性,有兩種度量方法:

第一種度量方法是從單個使用者的角度度量,就是說給定一個使用者,檢視系統給出的推薦列表是否多樣,也就是要比較推薦列表中的物品之間兩兩的相似度,不難想到,對這種度量方法,Item CF 的多樣性顯然不如 User CF 的好,因為 Item CF 的推薦就是和以前看的東西最相似的。

第二種度量方法是考慮系統的多樣性,也被稱為覆蓋率 (Coverage),它是指一個推薦系統是否能夠提供給所有使用者豐富的選擇。在這種指標下,Item CF 的多樣性要遠遠好於 User CF, 因為 User CF 總是傾向於推薦熱門的,從另一個側面看,也就是說,Item CF 的推薦有很好的新穎性,很擅長推薦長尾裡的物品。所以,儘管大多數情況,Item CF 的精度略小於 User CF, 但如果考慮多樣性,Item CF 卻比 User CF 好很多。

如果你對推薦的多樣性還心存疑惑,那麼下面我們再舉個例項看看 User CF 和 Item CF 的多樣性到底有什麼差別。首先,假設每個使用者興趣愛好都是廣泛的,喜歡好幾個領域的東西,不過每個使用者肯定也有一個主要的領域,對這個領域會比其他領域更加關心。給定一個使用者,假設他喜歡 3 個領域 A,B,C,A 是他喜歡的主要領域,這個時候我們來看 User CF 和 Item CF 傾向於做出什麼推薦:如果用 User CF, 它會將 A,B,C 三個領域中比較熱門的東西推薦給使用者;而如果用 ItemCF,它會基本上只推薦 A 領域的東西給使用者。所以我們看到因為 User CF 只推薦熱門的,所以它在推薦長尾裡專案方面的能力不足;而 Item CF 只推薦 A 領域給使用者,這樣他有限的推薦列表中就可能包含了一定數量的不熱門的長尾物品,同時 Item CF 的推薦對這個使用者而言,顯然多樣性不足。但是對整個系統而言,因為不同的使用者的主要興趣點不同,所以系統的覆蓋率會比較好。

從上面的分析,可以很清晰的看到,這兩種推薦都有其合理性,但都不是最好的選擇,因此他們的精度也會有損失。其實對這類系統的最好選擇是,如果系統給這個使用者推薦 30 個物品,既不是每個領域挑選 10 個最熱門的給他,也不是推薦 30 個 A 領域的給他,而是比如推薦 15 個 A 領域的給他,剩下的 15 個從 B,C 中選擇。所以結合 User CF 和 Item CF 是最優的選擇,結合的基本原則就是當採用 Item CF 導致系統對個人推薦的多樣性不足時,我們通過加入 User CF 增加個人推薦的多樣性,從而提高精度,而當因為採用 User CF 而使系統的整體多樣性不足時,我們可以通過加入 Item CF 增加整體的多樣性,同樣同樣可以提高推薦的精度。

  • 使用者對推薦演算法的適應度

前面我們大部分都是從推薦引擎的角度考慮哪個演算法更優,但其實我們更多的應該考慮作為推薦引擎的最終使用者 -- 應用使用者對推薦演算法的適應度。

對於 User CF,推薦的原則是假設使用者會喜歡那些和他有相同喜好的使用者喜歡的東西,但如果一個使用者沒有相同喜好的朋友,那 User CF 的演算法的效果就會很差,所以一個使用者對的 CF 演算法的適應度是和他有多少共同喜好使用者成正比的。

Item CF 演算法也有一個基本假設,就是使用者會喜歡和他以前喜歡的東西相似的東西,那麼我們可以計算一個使用者喜歡的物品的自相似度。一個使用者喜歡物品的自相似度大,就說明他喜歡的東西都是比較相似的,也就是說他比較符合 Item CF 方法的基本假設,那麼他對 Item CF 的適應度自然比較好;反之,如果自相似度小,就說明這個使用者的喜好習慣並不滿足 Item CF 方法的基本假設,那麼對於這種使用者,用 Item CF 方法做出好的推薦的可能性非常低。

通過以上的介紹,相信大家已經對協同過濾推薦的各種方法,原則,特點和適用場景有深入的瞭解,下面我們就進入實戰階段,重點介紹如何基於 Apache Mahout 實現協同過濾推薦演算法。

Apache Mahout 是 Apache Software Foundation (ASF) 旗下的一個開源專案,提供一些可擴充套件的機器學習領域經典演算法的實現,旨在幫助開發人員更加方便快捷地建立智慧應用程式,並且,在 Mahout 的最近版本中還加入了對 Apache Hadoop 的支援,使這些演算法可以更高效的執行在雲端計算環境中。

關於 Apache Mahout 的安裝和配置請參考《基於 Apache Mahout 構建社會化推薦引擎》,它是筆者 09 年發表的一篇關於基於 Mahout 實現推薦引擎的 developerWorks 文章,其中詳細介紹了 Mahout 的安裝步驟,並給出一個簡單的電影推薦引擎的例子。

Apache Mahout 中提供的一個協同過濾演算法的高效實現,它是一個基於 Java 實現的可擴充套件的,高效的推薦引擎。圖 4 給出了 Apache Mahout 中協同過濾推薦實現的元件圖,下面我們逐步深入介紹各個部分。


圖 4.元件圖
圖 4 元件圖 

Preference

基於協同過濾的推薦引擎的輸入是使用者的歷史偏好資訊,在 Mahout 裡它被建模為 Preference(介面),一個 Preference 就是一個簡單的三元組 < 使用者 ID, 物品 ID, 使用者偏好 >,它的實現類是 GenericPreference,可以通過以下語句建立一個 GenericPreference。

GenericPreference preference = new GenericPreference(123, 456, 3.0f);

這其中, 123 是使用者 ID,long 型;456 是物品 ID,long 型;3.0f 是使用者偏好,float 型。從這個例子我們可以看出,單單一個 GenericPreference 的資料就佔用 20 bytes,所以你會發現如果只簡單實用陣列 Array 載入使用者偏好資料,必然佔用大量的記憶體,Mahout 在這方面做了一些優化,它建立了 PreferenceArray(介面)儲存一組使用者偏好資料,為了優化效能,Mahout 給出了兩個實現類,GenericUserPreferenceArray 和 GenericItemPreferenceArray,分別按照使用者和物品本身對使用者偏好進行組裝,這樣就可以壓縮使用者 ID 或者物品 ID 的空間。下面清單 1 的程式碼以 GenericUserPreferenceArray 為例,展示瞭如何建立和使用一個 PreferenceArray。


清單 1. 建立和使用 PreferenceArray
				 
 PreferenceArray userPref = new GenericUserPreferenceArray(2); //size = 2 

 userPref.setUserID(0, 1L); 

 userPref.setItemID(0, 101L);  //<1L, 101L, 2.0f> 
 userPref.setValue(0, 2.0f); 
 userPref.setItemID(1, 102L);  //<1L, 102L, 4.0f> 
 userPref.setValue(1, 4.0f); 

 Preference pref = userPref.get(1);   //<1L, 102L, 4.0f> 

為了提高效能 Mahout 還構建了自己的 HashMap 和 Set:FastByIDMap 和 FastIDSet,有興趣的朋友可以參考 Mahout 官方說明。

DataModel

Mahout 的推薦引擎實際接受的輸入是 DataModel,它是對使用者偏好資料的壓縮表示,通過建立記憶體版 DataModel 的語句我們可以看出:

DataModel model = new GenericDataModel(FastByIDMap<PreferenceArray> map);

他儲存在一個按照使用者 ID 或者物品 ID 進行雜湊的 PreferenceArray,而 PreferenceArray 中對應儲存著這個使用者 ID 或者物品 ID 的所有使用者偏好資訊。

DataModel 是使用者喜好資訊的抽象介面,它的具體實現支援從任意型別的資料來源抽取使用者喜好資訊,具體實現包括記憶體版的 GenericDataModel,支援檔案讀取的 FileDataModel 和支援資料庫讀取的 JDBCDataModel,下面我們看看如何建立各種 DataModel。


清單 2. 建立各種 DataModel
				 
 //In-memory DataModel - GenericDataModel 
 FastByIDMap<PreferenceArray> preferences = new FastByIDMap<PreferenceArray>(); 

 PreferenceArray prefsForUser1 = new GenericUserPreferenceArray(10);  
 prefsForUser1.setUserID(0, 1L); 
 prefsForUser1.setItemID(0, 101L); 
 prefsForUser1.setValue(0, 3.0f);  
 prefsForUser1.setItemID(1, 102L); 
 prefsForUser1.setValue(1, 4.5f); 
… (8 more) 
 preferences.put(1L, prefsForUser1);   //use userID as the key 
… (more users) 

 DataModel model = new GenericDataModel(preferences); 

 //File-based DataModel - FileDataModel 
 DataModel dataModel = new FileDataModel(new File("preferences.csv"); 

 //Database-based DataModel - MySQLJDBCDataModel 
 MysqlDataSource dataSource = new MysqlDataSource(); 
 dataSource.setServerName("my_user"); 
 dataSource.setUser("my_password"); 
 dataSource.setPassword("my_database_host"); 
 JDBCDataModel dataModel = new MySQLJDBCDataModel(dataSource, "my_prefs_table", 
 "my_user_column", "my_item_column", "my_pref_value_column"); 

支援檔案讀取的 FileDataModel,Mahout 沒有對檔案的格式做過多的要求,只要檔案的內容滿足以下格式:

  • 每一行包括使用者 ID, 物品 ID, 使用者偏好
  • 逗號隔開或者 Tab 隔開
  • *.zip 和 *.gz 檔案會自動解壓縮(Mahout 建議在資料量過大時採用壓縮的資料儲存)

支援資料庫讀取的 JDBCDataModel,Mahout 提供一個預設的 MySQL 的支援,它對使用者偏好資料的存放有以下簡單的要求:

  • 使用者 ID 列需要是 BIGINT 而且非空
  • 物品 ID 列需要是 BIGINT 而且非空
  • 使用者偏好列需要是 FLOAT

建議在使用者 ID 和物品 ID 上建索引。

介紹完資料表示模型,下面介紹 Mahout 提供的協同過濾的推薦策略,這裡我們選擇其中最經典的三種,User CF, Item CF 和 Slope One。

User CF

前面已經詳細介紹了 User CF 的原理,這裡我們著重看怎麼基於 Mahout 實現 User CF 的推薦策略,我們還是從一個例子入手:


清單 3. 基於 Mahout 實現 User CF
				 
 DataModel model = new FileDataModel(new File("preferences.dat")); 
 UserSimilarity similarity = new PearsonCorrelationSimilarity(model); 
 UserNeighborhood neighborhood = new NearestNUserNeighborhood(100, similarity, model); 
 Recommender recommender = new GenericUserBasedRecommender(model, 
 neighborhood, similarity); 

  1. 從檔案建立 DataModel,我們採用前面介紹的 FileDataModel,這裡假設使用者的喜好資訊存放在 preferences.dat 檔案中。
  2. 基於使用者偏好資料計算使用者的相似度,清單中採用的是 PearsonCorrelationSimilarity,前面章節曾詳細介紹了各種計算相似度的方法,Mahout 中提供了基本的相似度的計算,它們都 UserSimilarity 這個介面,實現使用者相似度的計算,包括下面這些常用的:
  • PearsonCorrelationSimilarity:基於皮爾遜相關係數計算相似度
  • EuclideanDistanceSimilarity:基於歐幾里德距離計算相似度
  • TanimotoCoefficientSimilarity:基於 Tanimoto 係數計算相似度
  • UncerteredCosineSimilarity:計算 Cosine 相似度

ItemSimilarity 也是類似的:

  1. 根據建立的相似度計算方法,找到鄰居使用者。這裡找鄰居使用者的方法根據前面我們介紹的,也包括兩種:“固定數量的鄰居”和“相似度門檻鄰居”計算方法,Mahout 提供對應的實現:
    • NearestNUserNeighborhood:對每個使用者取固定數量 N 的最近鄰居
    • ThresholdUserNeighborhood:對每個使用者基於一定的限制,取落在相似度門限內的所有使用者為鄰居。
  2. 基於 DataModel,UserNeighborhood 和 UserSimilarity 構建 GenericUserBasedRecommender,實現 User CF 推薦策略。

Item CF

瞭解了 User CF,Mahout Item CF 的實現與 User CF 類似,是基於 ItemSimilarity,下面我們看實現的程式碼例子,它比 User CF 更簡單,因為 Item CF 中並不需要引入鄰居的概念:


清單 4. 基於 Mahout 實現 Item CF
				 
 DataModel model = new FileDataModel(new File("preferences.dat")); 
 ItemSimilarity similarity = new PearsonCorrelationSimilarity(model); 
 Recommender recommender = new GenericItemBasedRecommender(model, similarity); 

Slope One

如前面介紹的,User CF 和 Item CF 是最常用最容易理解的兩種 CF 的推薦策略,但在大資料量時,它們的計算量會很大,從而導致推薦效率較差。因此 Mahout 還提供了一種更加輕量級的 CF 推薦策略:Slope One。

Slope One 是有 Daniel Lemire 和 Anna Maclachlan 在 2005 年提出的一種對基於評分的協同過濾推薦引擎的改進方法,下面簡單介紹一下它的基本思想。

圖 5 給出了例子,假設系統對於物品 A,物品 B 和物品 C 的平均評分分別是 3,4 和 4。基於 Slope One 的方法會得到以下規律:

  • 使用者對物品 B 的評分 = 使用者對物品 A 的評分 + 1
  • 使用者對物品 B 的評分 = 使用者對物品 C 的評分

基於以上的規律,我們可以對使用者 A 和使用者 B 的打分進行預測:

  • 對使用者 A,他給物品 A 打分 4,那麼我們可以推測他對物品 B 的評分是 5,對物品 C 的打分也是 5。
  • 對使用者 B,他給物品 A 打分 2,給物品 C 打分 4,根據第一條規律,我們可以推斷他對物品 B 的評分是 3;而根據第二條規律,推斷出評分是 4。當出現衝突時,我們可以對各種規則得到的推斷進行就平均,所以給出的推斷是 3.5。

這就是 Slope One 推薦的基本原理,它將使用者的評分之間的關係看作簡單的線性關係:

Y = mX + b;

當 m = 1 時就是 Slope One,也就是我們剛剛展示的例子。


圖 5.Slope One 推薦策略示例
圖 5 Slope One 推薦策略示例 

Slope One 的核心優勢是在大規模的資料上,它依然能保證良好的計算速度和推薦效果。Mahout 提供了 Slope One 推薦方法的基本實現,實現程式碼很簡單,參考清單 5.


清單 5. 基於 Mahout 實現 Slope One
				 
 //In-Memory Recommender 
 DiffStorage diffStorage = new MemoryDiffStorage(model, Weighting.UNWEIGHTED, false, 
 Long.MAX_VALUE)); 
 Recommender recommender = new SlopeOneRecommender(model, Weighting.UNWEIGHTED, 
 Weighting.UNWEIGHTED, diffStorage);  

 //Database-based Recommender 
 AbstractJDBCDataModel model = new MySQLJDBCDataModel(); 
 DiffStorage diffStorage = new MySQLJDBCDiffStorage(model); 
 Recommender recommender = new SlopeOneRecommender(model, Weighting.WEIGHTED, 
 Weighting.WEIGHTED, diffStorage); 

1. 根據 Data Model 建立資料之間線性關係的模型 DiffStorage。

2. 基於 Data Model 和 DiffStorage 建立 SlopeOneRecommender,實現 Slope One 推薦策略。

總結

Web2.0 的一個核心思想就是“集體智慧”,基於協同過濾的推薦策略的基本思想就是基於大眾行為,為每個使用者提供個性化的推薦,從而使使用者能更快速更準確的發現所需要的資訊。從應用角度分析,現今比較成功的推薦引擎,比如 Amazon,豆瓣,噹噹等都採用了協同過濾的方式,它不需要對物品或者使用者進行嚴格的建模,而且不要求物品的描述是機器可理解的,是中領域無關的推薦方法,同時這個方法計算出來的推薦是開放的,可以共用他人的經驗,很好的支援使用者發現潛在的興趣偏好。基於協同過濾的推薦策略也有不同的分支,它們有不同的實用場景和推薦效果,使用者可以根據自己應用的實際情況選擇合適的方法,異或組合不同的方法得到更好的推薦效果。

除此之外,本文還介紹瞭如何基於 Apache Mahout 高效實現協同過濾推薦演算法,Apache Mahout 關注海量資料上的機器學習經典演算法的高效實現,其中對基於協同過濾的推薦方法也提供了很好的支援,基於 Mahout 你可以輕鬆的體驗高效推薦的神奇。

作為深入推薦引擎相關演算法的第一篇文章,本文深入介紹了協同過濾演算法,並舉例介紹瞭如何基於 Apache Mahout 高效實現協同過濾推薦演算法,Apache Mahout 作為海量資料上的機器學習經典演算法的高效實現,其中對基於協同過濾的推薦方法也提供了很好的支援,基於 Mahout 你可以輕鬆的體驗高效推薦的神奇。但我們也發現了在海量資料上高效的執行協同過濾演算法以及其他推薦策略這樣高複雜的演算法還是有很大的挑戰的。在面對這個問題的過程中,大家提出了很多減少計算量的方法,而聚類無疑是其中最優的選擇。所以本系列的下一篇文章將詳細介紹各類聚類演算法,它們的原理,優缺點和實用場景,並給出基於 Apache Mahout 的聚類演算法的高效實現,並分析在推薦引擎的實現中,如何通過引入聚類來解決大資料量造成的海量計算,從而提供高效的推薦。

相關推薦

DNN個性化推薦模型

max 點擊 工具 行為 個人 evel end title 職業 0 推薦技術 1)協同過濾: (1)基於user的協同過濾:根據歷史日誌中用戶年齡,性別,行為,偏好等特征計算user之間的相似度,根據相似user對item的評

面向知乎的個性化推薦模型研究論文

面向知乎的個性化推薦模型研究 《面向知乎的個性化推薦模型研究》論文是大二暑假完成的,已投到《計算機應用與軟體》中文核心期刊。論文主要對知乎提出一種基於混合演算法的個性化推薦模型。論文基於使用者模型、問題

個性化推薦模型

集體智慧 (Collective Intelligence) 並不是 Web2.0 時代特有的,只是在 Web2.0 時代,大家在 Web 應用中利用集體智慧構建更加有趣的應用或者得到更好的使用者體驗。集體智慧是指在大量的人群的行為和資料中收集答案,幫助你對整個人群得到統計意義上的結論,這些結論是我

程世東老師TensorFlow實戰——個性化推薦,程式碼學習筆記之②模型訓練與測試

個性化推薦第二部分:模型訓練 程式碼來自於知乎:https://zhuanlan.zhihu.com/p/32078473 /程式碼地址https://github.com/chengstone/movie_recommender/blob/master/movie_recommender.

聊聊淘寶天貓個性化推薦技術演進史

阿裏 雙11 個性化推薦 引言:個性化推薦技術直面用戶,可以說是站在最前線的那個。如今,從用戶打開手機淘寶客戶端(簡稱“手淘”)或是手機天貓客戶端(簡稱“貓客”)的那一刻起,個性化推薦技術就已經啟動,為你我帶來一場個性化的購物之旅。本文將細數個性化推薦的一路風雨,講講個性化推薦技術的演進史。本文選

個性化推薦系統原理介紹(基於內容過濾/協同過濾/關聯規則/序列模式)

信息 來講 行為記錄 鏈接 方程 機器學習 沒有 比較 graph 個性化推薦根據用戶興趣和行為特點,向用戶推薦所需的信息或商品,幫助用戶在海量信息中快速發現真正所需的商品,提高用戶黏性,促進信息點擊和商品銷售。推薦系統是基於海量數據挖掘分析的商業智能平臺,推薦主要基

互聯網廣告的個性化推薦平臺設計--相關知識

傳播 收益 pla cluster 大數據集 公開信 ads 合法性 ril 人群分類模型 依據用戶人群數據記錄。建立人群屬性分類模型。根絕用戶特點。將用戶標記為特定類別。據此進行精準定向服務。並進行效果評估。主要分類方法: 1.採用模糊數學綜合判定理論,構建關

個性化推薦系統(二)---構建推薦引擎

架構 商品 素材 業務開發 jpeg 用戶體驗 rom 機器學習 微信 當下推薦系統包含的層級特別的多,整個線上推薦系統包含:最上層線上推薦服務、中層各個推薦數據召回集(數據主題、分類池子)、底層各種推薦模型。 推薦系統介入線上各種業務,推薦系統當下已經

個性化推薦系統(三)---推薦系統意義一點思考

進展 這樣的 es2017 意見 推廣 移動 付出 技術 com 個性化推薦是隨著移動互聯網發展不斷發展起來的,國內應用個性化推薦技術最早應該是豆瓣,在web2.0興起時做了很多嘗試,給網民帶來很多新鮮感覺、體驗。後來是國外電影租賃網站netflex推波助瀾

從0開始做垂直O2O個性化推薦-以58到家美甲為例

mda amp 算法 彩繪 .com web 不同的 會有 tro 從0開始做垂直O2O個性化推薦 上次以58轉轉為例,介紹了如何從0開始如何做互聯網推薦產品(回復“推薦”閱讀),58轉轉的寶貝為閑置物品,品類多種多樣,要做統一的寶貝畫像比較難,而分類別做寶貝畫像成本又

基於多因素的搭配推薦模型

recommend list 推薦 glob 測距 pair lan .cn with 之所以起這個名字是因為對應之前的搭配推薦模型,如之前的博客 基於圖像信息的搭配商品推薦 中所述,可以看做是基於單因素對搭配進行建模,即認為搭配的商品應該在單因素--風格上相似,然後在對商

千人千面、個性化推薦,解讀數據賦能商家背後的AI技術

div 並且 聊天 接收 線上 體驗 超越 金礦 docke 12月6~7日,由阿裏巴巴集團、阿裏巴巴技術發展部、阿裏雲雲棲社區聯合主辦,以“2016 雙 11 技術創新”為主題的阿裏巴巴技術論壇,來自商家事業部的技術總監魏虎給大家分享了數據賦能商家背後的AI技術。首先對大

CCF大資料競賽-面向電信行業存量使用者的智慧套餐個性化匹配模型

題目:面向電信行業存量使用者的智慧套餐個性化匹配模型(2018 CCF-大資料競賽(聯通研究院舉辦) ) 網址:https://www.datafountain.cn/competitions/311/details 賽題背景: 電信產業作為國家基礎產業之一,覆蓋廣、使用者多

SparkML之推薦引擎(二)—— 推薦模型評估

本文內容和程式碼是接著上篇文章來寫的,推薦先看一下哈~ 我們上一篇文章是寫了電影推薦的實現,但是推薦內容是否合理呢,這就需要我們對模型進行評估 針對推薦模型,這裡根據 均方差 和 K值平均準確率 來對模型進行評估,MLlib也對這幾種評估方法都有提供內建的函式 在真

四個方面總結個性化推薦系統

大部分人都聽說過個性化推薦,那麼個性化推薦系統到底是怎麼樣的呢?最近做了一點總結。   現在的人們面對資訊過載問題日益嚴重,個性化推薦將能夠很好的提升使用者體驗,提高使用者使用產品完成任務的效率,更好的留住使用者,進一步擴大產品的盈利。 對於一些電商類的產品,個性

05_“相同距離,不同價格”的個性化推薦

前幾天被一條訊息刷屏了,據說還上了新聞聯播:相同起點,相同終點的兩個手機打車,價格不一樣。   去年也有新聞引起過激烈的討論:相同的起點,相同終點的兩個使用者買飛機票,機票價格不一樣。   今天接著用通俗的語言說說此類“個性化價格”是如何實現的。  

雙11個性化推薦背後,阿里雲“舜天”如何應對百億次挑戰?

摘要: 2018天貓雙11在技術世界,創下不少新記錄,其中有一個記錄是11日當天阿里全平臺共為使用者做個性化推薦453億次,這些推薦的圖片長度加起來可以繞地球70圈。 當你在天貓/手淘上買買買的時,圖片會以不同格式或解析度來轉碼呈現,這就要求後臺系統需要強大的算力來保障數倍於平時的轉碼需求。 2018天貓雙

BAT大牛親授-個性化推薦演算法實戰

第1章 個性化推薦演算法綜述 個性化推薦演算法綜述部分,主要介紹個性化推薦演算法綜述,本課程內容大綱以及本課程所需要準備的程式設計環境與基礎知識。 1-1 個性化推薦演算法綜述 1-2 個性化召回演算法綜述

BAT大牛親授-個性化推薦算法實戰

離線 sed 訓練數據 特征選擇 如何 size spa 工業 ear 第1章 個性化推薦算法綜述 個性化推薦算法綜述部分,主要介紹個性化推薦算法綜述,本課程內容大綱以及本課程所需要準備的編程環境與基礎知識。 1-1 個性化推薦算法綜述 1-2 個性化召回算法綜述

BAT大牛親授--個性化推薦演算法實戰

第1章 個性化推薦演算法綜述個性化推薦演算法綜述部分,主要介紹個性化推薦演算法綜述,本課程內容大綱以及本課程所需要準備的程式設計環境與基礎知識。 第2章 基於鄰域的個性化召回演算法LFM本章節重點介紹一種基於鄰域的個性化召回演算法,LFM。從LFM演算法的理論知識與數學原理進行介紹。並結合公開資料集,程式碼