由于course project需要,我最近看了一下Mahout的推荐实现。最初看到的是这篇文章。里面的代码毫无问题,不过引包的时候错误重重。因此重新写一下,希望能帮助到有同样问题的同学。废话不多说,上代码:

public static void main(String[] args) throws Exception {
		
	System.out.println("1");
	File f = new File("C:/Users/Administrator/Desktop/test.txt");
	System.out.println("2");

	//导入数据,计算相似度
	DataModel model = new FileDataModel(f);
	UserSimilarity similarity = new PearsonCorrelationSimilarity(model);
	//根据数据与相似度,再计算K紧邻
	UserNeighborhood neighborhood = new NearestNUserNeighborhood(2,
				similarity, model);
	//根据以上三个数据建立推荐引擎			
	Recommender recommender = new GenericUserBasedRecommender(model,
				neighborhood, similarity);
	//直接调用引擎,为用户1推荐两个ItemID。			
	List<RecommendedItem> recommendations = recommender.recommend(1, 2);
	
	for (RecommendedItem recommendation : recommendations) {
			System.out.println(recommendation);
		}
	}


代码上来看,跟那位同学的完全一样,我就直接粘贴过来的。引入的包与结果如下:

wKiom1X9v0yi8Xh5AACdpIO6Hoo423.jpg

wKioL1X9wYmQ9DZkAACEc_cBy_k194.jpg


既然我们已经知道了如何搭建最简单的Mahout推荐模型,那现在我们就来稍微详细地了解一下Mahout吧。Mahout属于Hadoop家族,给我的理解,只要能够使用MapReduce这种功能就算是Hadoop家族。Mahout能做三种事:聚类,分类以及推荐。我们使用的推荐功能,能够以两种策略推荐。假设说我们想给Amazon上的用户Tom推荐一些商品,UserCF就是找出与Tom的口味相似的用户,看看他们都喜欢什么,然后将这些东西推荐给Tom。ItemCF就是先看看Tom喜欢什么,然后看看对于这些东西有没有相似的物品能够推荐。

wKioL1X9xNewGf1rAAFNNndwH_U591.jpg

这张图很好地解释了刚刚写的代码中各个步骤之间的依赖关系。我是从Mahout学习路线里面找到的。ItemCF的代码如下。输入的是某个商品的id,得到的是跟这个商品类似的id。

//1.导入数据
DataModel dm = new FileDataModel(new File("data/user_preferences.csv"));
//2.计算物品之间的相似度
ItemSimilarity sim = new LogLikelihoodSimilarity(dm);
//3.构建ItemBase的推荐引擎
GenericItemBasedRecommender recommender = new GenericItemBasedRecommender(dm, sim);
//4.得到推荐列表
List<RecommendedItem> recommendations = recommender.mostSimilarItems(itemID, size);
for (RecommendedItem recommendation : recommendations) {
			System.out.println(recommendation);
		}
DataModel dm = new FileDataModel(f);
		ItemSimilarity sim = new LogLikelihoodSimilarity(dm);
		Recommender recommender = new GenericItemBasedRecommender(dm, sim);
		Recommender cachingRecommender=new CachingRecommender(recommender);
		List<RecommendedItem> recommendations = cachingRecommender.recommend(1, 7);
		for (RecommendedItem recommendation : recommendations) {
			System.out.println(recommendation);
		}

这段代码输入的是user的ID以及需要的推荐数,能够综合考虑当前用户喜欢的商品,然后给出一个推荐列表。