mahout:推荐系统入门学习(一)
转自:http://blog.chinaunix.net/uid-26711636-id-3085923.html
最近因为公司项目的需要,进入了mahout的相关学习,在hadoop论坛找到了一份入门级别的学习资料,在各大论坛mahout板块的介绍还是相当少,闲话不多说,直接切入正题。
Mahout是一个基于Hadoop实现各种机器学习与数据挖掘的算法库,它由Lucene的几个代码贡献者发起成立,整个项目是从Taste这个项目发展起来的,目前Mahout已经发布0.6.0最新版本,实现了分布式协同过滤、聚类、分类等算法,已经和Hadoop整合到了一起,成为强大的分布式数据挖掘的工具。
要想实现和运行代码,需要从apache官方下载mahout包,将其导入Eclipse Java项目中,下载地址为:http://labs.mop.com/apache-mirror//mahout/0.6/,apache mahout官网网址为:http://mahout.apache.org/。
下面代码是本人学习mahout过程中第一个动手写的程序,另带附件,数据排列格式亦有说明。这是一个简单的实例,因为实际推荐系统的训练数据集都是海量的,通过机器学习能得到更加值得信赖的结果。
1,101,5.0 // 第一列为用户ID,第二列为物品ID,第三列为该用户对对应物品的喜好程度 1,102,3.0 // 1表示讨厌,5表示非常喜爱,范围为1--5 1,103,2.5 2,101,2.0 2,102,2.5 2,103,5.0 2,104,2.0 3,101,2.5 3,104,4.0 3,105,4.5 3,107,5.0 4,101,5.0 4,103,3.0 4,104,4.5 4,106,4.0 5,101,4.0 5,102,3.0 5,103,2.0 5,104,4.0 5,105,3.5 5,106,4.0
package com.loogn.chart02; import org.apache.mahout.cf.taste.impl.model.file.*;//FileDataModel import org.apache.mahout.cf.taste.model.*;//DAtaModel import org.apache.mahout.cf.taste.impl.neighborhood.*; import org.apache.mahout.cf.taste.impl.recommender.*; import org.apache.mahout.cf.taste.impl.similarity.*; import org.apache.mahout.cf.taste.neighborhood.*; import org.apache.mahout.cf.taste.similarity.*; import org.apache.mahout.cf.taste.recommender.*; import java.io.*; import java.util.*; public class RecommenderIntro { public static void main(String[] args) throws Exception{ DataModel model = new FileDataModel(new File("E:\\my own task\\mahout\\intro.csv")); //A /** * A 加载数据文件 */ UserSimilarity similarity = new PearsonCorrelationSimilarity(model); UserNeighborhood neighborhood = new NearestNUserNeighborhood(2,similarity,model); Recommender recommender = new GenericUserBasedRecommender( model,neighborhood,similarity); // B 建立推荐系统 List<RecommendedItem> recommendations = recommender.recommend(1, 2); //C /** * C为用户1,推荐两个物品 */ for(RecommendedItem recommendation : recommendations) { System.out.println(recommendation);// 按mapreduce键/值对的形式呈现推荐项目 } } }
最后运行结果如下:
RecommendedItem[item:104, value:4.257081]
RecommendedItem[item:106, value:4.0]
分析该运行结果,之所以没有给用户1推荐item107,是考虑到与用户1历史购买记录和用户4以及用户5具有更高的相似度,而107号物品只被用户3喜欢,而且从过往喜好来看,用户1和3存在较大差异,所以选择了具有在4.0和4.5数值的item104,也可以看出其被推荐的优先级高于106.