1. 程式人生 > >Mahout的taste推薦系統裡的幾種Recommender分析

Mahout的taste推薦系統裡的幾種Recommender分析

Taste簡介

Mahout 是apache下的一個java語言的開源大資料機器學習專案,與其他機器學習專案不同的是,它的演算法多數是mapreduce方式寫的,可以在hadoop上執行,並行化處理大規模資料。

協同過濾在mahout裡是由一個叫taste的引擎提供的, 它提供兩種模式,一種是以jar包形式嵌入到程式裡在程序內執行,另外一種是MapReduce Job形式在hadoop上執行。這兩種方式使用的演算法是一樣的,配置也類似。基本上搞明白了一種,就會另外一種了。

Taste的系統結構如下圖

其中:

Perference:表示使用者的喜好資料,是個三元組(userid, itemid, value),分別表示使用者id, 物品id和使用者對這個物品的喜好值。

DataModel:是Perference的集合,可以認為是協同過濾用到的user*item的大矩陣。DateModel可以來自db, 檔案或者記憶體。

Similarity:相似度計算的介面,各種相似度計算演算法都是繼承自這個介面,具體相似度計算的方法,可以參考這篇文章:http://anylin.iteye.com/blog/1721978

Recommender:  利用Similarity找到待推薦item集合後的各種推薦策略,這是最終要暴露個使用者的推薦介面,本文將重點介紹下taste裡各種recommender的實現策略,有錯誤之處,請多指正。

各種Recommender介紹

按照協同過濾方法的分類, taste裡的recommender可以分別劃到對應的分類下:

Item-based:

         GenericItemBasedRecommender

         GenericBooleanPrefItemBasedRecommender

         KnnItemBasedRecommender

User-based:

         GenericUserBasedRecommender

         GenericBooleanPerfUserBasedRecommender

Model-based:

         SlopeOneRecommender

         SVDRecommender

         TreeClusteringRecommender

  ItemAverageRecommender

         ItemUserAverageRecommender

每種Recommender的詳細介紹如下:

GenericUserBasedRecommender

一個很簡單的user-based模式的推薦器實現類,根據傳入的DataModel和UserNeighborhood進行推薦。其推薦流程分成三步:

第一步,使用UserNeighborhood獲取跟指定使用者Ui最相似的K個使用者{U1…Uk};

第二步,{U1…Uk}喜歡的item集合中排除掉Ui喜歡的item, 得到一個item集合 {Item0...Itemm}

第三步,對{Item0...Itemm}每個itemj計算 Ui可能喜歡的程度值perf(Ui , Itemj) ,並把item按這個數值從高到低排序,把前N個item推薦給Ui。其中perf(Ui , Itemj)的計算公式如下:

其中 是使用者Ul對Itemj的喜好值。

GenericBooleanPerfUserBasedRecommender

繼承自GenericUserBasedRecommender, 處理邏輯跟GenericUserBasedRecommender一樣,只是 的計算公式變成如下公式

其中是布林型取值,不是0就是1。

GenericItemBasedRecommender

一個簡單的item-based的推薦器,根據傳入的DateModel和ItemSimilarity去推薦。基於Item的相似度計算比基於User的相似度計算有個好處是,item數量較少,計算量也就少了,另外item之間的相似度比較固定,所以相似度可以事先算好,這樣可以大幅提高推薦的速度。

其推薦流程可以分成三步:

       第一步,獲取使用者Ui喜好的item集合{It1…Itm}

第一步,使用MostSimilarItemsCandidateItemsStrategy(有多種策略, 功能類似UserNeighborhood) 獲取跟使用者喜好集合裡每個item最相似的其他Item構成集合 {Item1…Itemk};

第二步,對{Item1...Itemk}裡的每個itemj計算 Ui可能喜歡的程度值perf(Ui , Itemj) ,並把item按這個數值從高到低排序,把前N個Item推薦給Ui。其中perf(Ui , Itemj)的計算公式如下:

其中 是使用者Ul對Iteml的喜好值。

GenericBooleanPrefItemBasedRecommender

繼承自GenericItemBasedRecommender, 處理邏輯跟GenericItemBasedRecommender一樣,只是 的計算公式變成如下公式

其中是布林型取值,不是0就是1。

KnnItemBasedRecommender

繼承自GenericItemBasedRecommender, 處理邏輯跟GenericItemBasedRecommender一樣,只是 的計算公式比較複雜,基於一篇論文提到的演算法,論文地址在這裡

ItemAverageRecommender

這是一個提供給實驗用的推薦類,簡單但計算快速,推薦結果可能會不夠好。它預測一個使用者對一個未知item的喜好值是所有使用者對這個item喜好值的平均值,預測公式如下。

ItemUserAverageRecommender

在ItemAverageRecommender的基礎上,考慮了使用者喜好的平均值和全域性所有喜好的平均值進行調整,它的預測公式如下:

         其中 是所有使用者對Itemj喜好的平均值, 是使用者Ul所有喜好的平均值,是全域性所有喜好值的平均值。

RandomRecommender

隨機推薦item,  除了測試效能的時候有用外,沒太大用處。

SlopeOneRecommender

基於Slopeone演算法的推薦器,Slopeone演算法適用於使用者對item的打分是具體數值的情況。Slopeone演算法不同於前面提到的基於相似度的演算法,他計算簡單快速,對新使用者推薦效果不錯,資料更新和擴充套件性都很不錯,預測能達到和基於相似度的演算法差不多的效果,很適合在實際專案中使用。

基本原理:

使用者   對itema打分     對itemb打分

X                          3                          4

Y                          2                          4

Z                          4                          ?

使用者Z對itemb的打分可能是多少呢? Slope one演算法認為:所有使用者對事物A對itemb的打分平均差值是:((3 - 4) + (2 - 4)) / 2 = -1.5,也就是說人們對itemb的打分一般比事物A的打分要高1.5,於是Slope one演算法就猜測Z對itemb的打分是4 + 1.5 = 5.5

當然在實際應用中,使用者不止X,Y 兩個,跟itemb相關的item也不止A一個,所以slopeone的預測公式如下:

其中表示與, 使用者Ui打過分的除itemj之外所有其他item集合, 表示使用者Ui對 itemk的打分。表示除Ui外所有其他使用者對itemk和itemj打分差值的平均值。

其中表示除Ui外其他所有使用者的集合。

SVDRecommender

基於SVD矩陣分解技術的推薦器,暫時沒有研究, 具體可以參考這個文件。

TreeClusteringRecommender

利用聚類方法的推薦器,暫時沒有研究。