為豆瓣電影實現Item-based協同過濾的推薦系統
前面的兩篇文章分別使用Spark mllib ALS實現了Model-based協同過濾推薦系統和使用Mahout實現了User-based的協同過濾推薦系統。
我們再來回顧一下item-base CF算法的特點:
- 物品數明顯小于用戶數的場合,否則物品相似度矩陣計算代價很大
- 適合長尾物品豐富,用戶個性化需求強的領域
- 對新用戶友好,對新物品不友好,因為物品相似度矩陣不需要很強的實時性
- 利用用戶歷史行為做推薦解釋,比較令用戶信服 </ul>
所以item-base挺適合做電影的推薦。當用戶瀏覽某個電影的時候,我們可以推薦給他類似的電影,或者根據用戶以前的觀影記錄,推薦他感興趣的電影。
本文還是以mahout 非分布式計算的方式實現。因為電影的記錄比較少(166條),計算量不是很大。
代碼也非常的簡單,我們還是以皮爾遜算法計算相似度:
public class DoubanItemBasedRecommender { public static void main(String[] args) throws Exception { String base = args[0]; File file = new File(base + "user_movies.csv"); DoubanFileDataModel model = new DoubanFileDataModel(file); ItemSimilarity similarity = new PearsonCorrelationSimilarity(model); ItemBasedRecommender recommender = new GenericItemBasedRecommender(model, similarity); BatchItemSimilarities batch = new MultithreadedBatchItemSimilarities(recommender, 5); int numSimilarities = batch.computeItemSimilarities(Runtime.getRuntime().availableProcessors(), 1, new FileSimilarItemsWriter(new File(base + "item_result.csv"))); System.out.println("Computed " + numSimilarities + " similarities for " + model.getNumItems() + " items " + "and saved them to file " + base + "item_result.csv"); } }
第 8行和第 9行使用多線程批處理的方式,把計算結果寫入到一個文件中。
生成的文件如下:
...... 25821461,26253733,0.8279288411140442 25821461,26252196,0.819756031036377 25821461,26366634,0.8181818127632141 25821461,25919385,0.7033082246780396 25821585,26328118,0.794719398021698 25821585,22556810,0.7655318379402161 25821585,1972724,0.6770924925804138 25821585,25809260,0.6347297430038452 ......
推薦還不錯,基本都屬于劇情,喜劇類型,而且都是國外的,沒有推薦戰爭,科幻或者武俠類的。
來自:http://colobu.com/2015/12/03/item-based-recommender-for-douban-movies/ 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!