Mahout的taste推荐系统里的几种Recommender分析
Taste簡介
看自:http://blog.csdn.net/zhoubl668/article/details/13297583
Mahout 是apache下的一個java語言的開源大數據機器學習項目,與其他機器學習項目不同的是,它的算法多數是mapreduce方式寫的,可以在hadoop上運行,并行化處理大規模數據。
協同過濾在mahout里是由一個叫taste的引擎提供的, 它提供兩種模式,一種是以jar包形式嵌入到程序里在進程內運行,另外一種是MapReduce Job形式在hadoop上運行。這兩種方式使用的算法是一樣的,配置也類似?;旧细忝靼琢艘环N,就會另外一種了。
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去推薦?;贗tem的相似度計算比基于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一樣,只是 的計算公式比較復雜,基于一篇論文提到的算法,論文地址在這里
http://public.research.att.com/~volinsky/netflix/BellKorICDM07.pdf。根據論文介紹,該算法對數據進行了一些預處理,同時改進了鄰居選取策略,再不怎么增加計算量的情況下,可以較大幅度提高推薦準確度。
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(Singular Value Decomposition)的想法是根據已有的評分情況,分析出評分者對各個因子的喜好程度以及電影包含各個因子的程度,最后再反過來根據分析結果預測評分。電影中的因子可以理解成這些東西:電影的搞笑程度,電影的愛情愛得死去活來的程度,電影的恐怖程度。。。。。。SVD的想法抽象點來看就是將一個N行M列的評分矩陣R(R[u][i]代表第u個用戶對第i個物品的評分),分解成一個N行F列的用戶因子矩陣P(P[u][k]表示用戶u對因子k的喜好程度)和一個M行F列的物品因子矩陣Q(Q[i][k]表示第i個物品的因子k的程度)。用公式來表示就是
? ? ? ? ? ? ? ?R = P * T(Q) ? ? ? ? ? ? ?//T(Q)表示Q矩陣的轉置
基于SVD矩陣分解技術的推薦器,暫時沒有研究, 具體可以參考這個文檔。
https://cwiki.apache.org/confluence/display/MAHOUT/Collaborative+Filtering+with+ALS-WR
1、關于奇異值分解的理論基礎,請參看下面的鏈接http://www.cnblogs.com/LeftNotEasy/archive/2011/01/19/svd-and-applications.html2、關于奇異值分解的應用場景,請參看下面的例子http://www.igvita.com/2007/01/15/svd-recommendation-system-in-ruby/3、關于奇異值分解輸入、輸出文格式的件的轉換,,請參考http://bickson.blogspot.com/2011/02/mahout-svd-matrix-factorization.html注意輸出結果解析的時應該用NamedVector,而不是SequentialAccessSparseVector4、輸出結果解釋輸入的矩陣記為A,mahout svd輸出的結果為矩陣A^t *A的特征值和特征向量,需要注意的是,特征值是按照順序排列的。要得到U和奇異值需要做進一步的運算(參照第一步里面提到的公式),V則是輸出的特征向量。TreeClusteringRecommender
基于樹形聚類的推薦算法
特點
用戶數目少的時候非常合適
計算速度快
需要預先計算
這個算法在mahout-0.8版本中,已經被@Deprecated。
基于模型的推薦算法、基于滿意度得推薦算法(未實現)
轉載于:https://blog.51cto.com/1992mrwang/1337936
總結
以上是生活随笔為你收集整理的Mahout的taste推荐系统里的几种Recommender分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Discuz添加自定义模板广告
- 下一篇: 使用JDBC驱动程序访问SQL Serv