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.

你可能感兴趣的:(Mahout)