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
利用聚類方法的推薦器,暫時沒有研究。