由于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);
}
}
代码上来看,跟那位同学的完全一样,我就直接粘贴过来的。引入的包与结果如下:
既然我们已经知道了如何搭建最简单的Mahout推荐模型,那现在我们就来稍微详细地了解一下Mahout吧。Mahout属于Hadoop家族,给我的理解,只要能够使用MapReduce这种功能就算是Hadoop家族。Mahout能做三种事:聚类,分类以及推荐。我们使用的推荐功能,能够以两种策略推荐。假设说我们想给Amazon上的用户Tom推荐一些商品,UserCF就是找出与Tom的口味相似的用户,看看他们都喜欢什么,然后将这些东西推荐给Tom。ItemCF就是先看看Tom喜欢什么,然后看看对于这些东西有没有相似的物品能够推荐。
这张图很好地解释了刚刚写的代码中各个步骤之间的依赖关系。我是从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以及需要的推荐数,能够综合考虑当前用户喜欢的商品,然后给出一个推荐列表。
转载于:https://blog.51cto.com/mengcao/1696438