深入了解推薦引擎組件(基于Apache Mahout和Elasticsearch)

jopen 9年前發布 | 16K 次閱讀 推薦引擎 Apache Mahout

推薦引擎根據用戶的特定需求幫助用戶縮小選擇范圍。在這篇文章中,我們一起來探秘推薦引擎各部分是如何協同工作的。我們將根據電影評分數據,用協同 過濾的方法來推薦電影。其關鍵部分是基于Apache Mahout的協同過濾算法來建立和訓練機器學習模型,以及基于Elasticsearch的搜索技術來簡化推薦系統的開發。

什么是推薦?

推薦(Recommendation)是機器學習的一個分支,通過分析數據來預測用戶的喜好或者給物品評分。推薦系統在業界被廣泛運用:

  • 書籍及其它產品(如Amazon)
  • 音樂(如Pandora)
  • 電影(如Netflix)
  • 餐廳(如Yelp)
  • 職業(如LinkedIn)

深入了解推薦引擎組件(基于Apache Mahout和Elasticsearch)

Netflix的推薦引擎

電影推薦依賴于以下的觀點:

  1. 用戶的行為是他們訴求的最真實反應。
  2. 共同出現(Co-Occurrence)是Apache Mahout可以計算被推薦物品顯著性標識的基礎。
  3. 模型輸出指標分數的權重賦值和全文檢索引擎背后的數學計算有著相似性。
  4. 這種數學上的相似讓利用文本搜索開發Mahout推薦器的想法得以實現,借助如Elasticsearch這樣的搜索引擎。

深入了解推薦引擎組件(基于Apache Mahout和Elasticsearch)

推薦引擎架構

推薦引擎的架構

推薦引擎的架構如下所示:

推薦引擎的架構

  1. 電影信息數據被重新格式化,然后將其存儲在Elasticsearch中用于搜索。
  2. 來自Apache Mahout的物品相似度算法根據用戶對電影的已有評分來創建電影推薦的標識符。這些標識符被添加到存儲在Elasticsearch的對應電影文件里。
  3. 通過用戶喜歡電影的標識符去搜索其它電影,將返回一份新的按照用戶喜好相關性排序的電影列表。

基于Mahout的協同過濾

基于Mahout的協同過濾引擎著眼于用戶的歷史行為,并試圖猜測在今后某個場景下用戶可能喜歡什么。這是通過分析用戶過去交互過的產品和內容來完 成的。Mahout尤其關注物品是如何在用戶歷史記錄中共同出現的。共同出現是Apache Mahout計算被推薦物品顯著性標識的基礎。假設Ted喜歡電影A、B和C,Carol喜歡電影A和B。在給Bob推薦電影時,我們注意到Bob喜歡電 影B,由于Ted 和Carol也很喜歡電影B,因而電影A是一個備選推薦項。當然,這是一個很小的例子。在實際生活中,我們將通過海量數據來挖掘信息。

推薦網格

為了獲得推薦有用的標識符,Mahout的物品相似度(ItemSimilarity)項目根據用戶歷史行為建立了三個矩陣:

1. 歷史矩陣:包含用戶和物品的交互信息,用戶X物品的二維矩陣結構。

歷史矩陣

2.共生矩陣:把歷史矩陣轉化為物品和物品間關系的矩陣,記錄哪些物品在用戶歷史記錄中共同出現過。

共生矩陣

在這個例子中,電影A和電影B共同出現一次,而電影A和電影C 共同出現兩次。共生矩陣不能直接用作推薦的標識符,因為極其常見的物品總是會伴隨著大量的其它物品出現。

3.標識符矩陣:標識符矩陣只記錄能作為推薦線索的異常(令人關注的)同現。有些物品(這里指電影)由于廣受歡 迎,幾乎每個人都喜歡它們,意味著它們將伴隨所有物品出現。它們對于推薦系統而言就不值得關注(非異常)。而過于稀疏的共同出現也不可靠,因此也不記錄在 標識符矩陣中。在這個例子中,電影A是電影B的標識符之一。

標識符矩陣

Mahout同時并行地運行多個MapReduce作業來計算物品的共同出現(Mahout 1.0運行在 Apache Spark之上)。Mahout的 ItemSimilarity作業用對數似然比檢驗(LLR)來確定哪些共同出現足夠反常可以作為推薦標識符。系統輸出相似度大于設定閾值的那些物品間。

Mahout ItemSimilarity作業的輸出,給出了物品兩兩之間哪些總是共同出現、哪些能作為推薦依據。例如,電影B這一行的電影A這一列被標記,這意味著喜歡電影A可以作為你也喜歡電影B的一個標識符。

標識符矩陣

Elasticsearch搜索引擎

Elasticsearch搜索引擎

Elasticsearch是建立在全文搜索引擎庫Apache Lucene之上的開源搜索引擎。全文搜索使用準確度(Precision)和召回率(Recall)評估搜索結果:

  • 準確度 = 檢索出的相關文檔數與檢索出的文檔總數的比率
  • 召回率 = 檢索出的相關文檔數和文檔庫中所有的相關文檔數的比率

Elasticsearch存儲的文檔由多個不同的字段組成。每個字段都有對應的名字和內容。

對于我們的推薦引擎,我們存儲電影的元數據(如id、標題、流派和電影推薦標識符)到一個JSON文檔中:

{
“id”: "65006",
"title": "Electric Horseman",
"year": "2008",
"genre": ["Mystery","Thriller"]
}

標識符矩陣的數據,那些標識顯著性或是共同出現興趣度的信息,被存放在Elasticsearch電影文件標識符字段。例如,由于電影A是電影B的 一個標識符,電影A就會被存儲在電影B文件的標識符字段中。這意味著,當我們搜索電影A為標識符的電影,電影B就會被推薦給我們。

推薦矩陣

搜索引擎已經對搜索和查詢詞相關的字段做過優化。我們就根據和查詢詞最匹配的標識符字段,用搜索引擎來尋找電影。

了解更多搭建推薦引擎的信息,我們建議您查看以下資源:

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!