Eclipse下mahout实现推荐的简单实例
来源:互联网 发布:java 时间戳转为date 编辑:程序博客网 时间:2024/06/04 18:11
本BLOG转自here,感谢作者的辛苦~
数据准备:test.txt
第一列为UserID ,第二列为ItemID,第三列为Preference Value 即评分
- 1,101,5
- 1,102,3
- 1,103,2.5
- 2,101,2
- 2,102,2.5
- 2,103,5
- 2,104,2
- 3,101,2.5
- 3,104,4
- 3,105,4.5
- 3,107,5
- 4,101,5
- 4,103,3
- 4,104,4.5
- 4,106,4
- 5,101,4
- 5,102,3
- 5,103,2
- 5,104,4
- 5,105,3.5
- 5,106,4
eclipse中新建一个java工程,然后在src目录下新建一个类RecommenderIntro (这里只是做测试,就放在默认包下,不新建包了),代码如下:
- import org.apache.mahout.cf.taste.impl.model.file.*;
- 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.model.*;
- import org.apache.mahout.cf.taste.neighborhood.*;
- import org.apache.mahout.cf.taste.recommender.*;
- import org.apache.mahout.cf.taste.similarity.*;
- import java.io.*;
- import java.util.*;
- public class RecommenderIntro {
- private RecommenderIntro(){};
- public static void main (String args[])throws Exception{
- // step:1 构建模型 2 计算相似度 3 查找k紧邻 4 构造推荐引擎
- DataModel model =new FileDataModel(new File("/home/test/test-in/test.txt"));//文件名一定要是绝对路径
- UserSimilarity similarity =new PearsonCorrelationSimilarity(model);
- UserNeighborhood neighborhood =new NearestNUserNeighborhood(2,similarity,model);
- Recommender recommender= new GenericUserBasedRecommender(model,neighborhood,similarity);
- List<RecommendedItem> recommendations =recommender.recommend(1, 2);//为用户1推荐两个ItemID
- for(RecommendedItem recommendation :recommendations){
- System.out.println(recommendation);
- }
- }
- }
此时肯定会报错,因为还没有导入任何相关Jar包,将mahout-core-0.4.jar导到工程中,此时代码不会显示有错了
然后Run As 选择Java Application,单机运行(当然集群如果成功启动的话,也可以在集群上运行的)。此时在运行后,会相继报一些包不存在,根据提示,依次将包导到工程中。我在测试的过程中,先后导入了slf4j-api-1.6.0.jar,slf4j-jcl-1.6.0.jar,google-collection-1.0-rc2.jar,commons-logging-1.1.1.jar,mahout-math-0.4.jar,uncommons-maths-1.2.jar,这些包都可以在mahout安装目录下的lib目录下找到。经过一步步差包导包(控制台报什么包不存在,我就找到相应包导入)调试后,最后运行成功,结果如下:
RecommendedItem[item:104, value:4.257081]
RecommendedItem[item:106, value:4.0]
结果分析:找到用户1的相似用户2和用户5,用户2和用户5共同有104,所以推荐分数高,但我不知道这个分数是怎么算出来的?用户2中没有其它可以推荐,然后用户5中还有105和106可以推荐,而106的评分比105高,所以第二个结果是106,不知道理解的对不对?只是自己猜测的,有知道其中内幕的和知道推荐分数怎么算的,请留言分享一下,开源是促进相互学习的好方法,呵呵
然后看了一下mahout的taste工作原理,我将mahout安装目录下的mahout-taste-webapp-0.4.war放在tomcat安装目录下的webapps中,然后启动tomcat,然后在浏览器中输入:http://localhost:8080/mahout-taste-webapp-0.4/RecommenderService.jws
,可以看到Taste 提供的Web 服务访问接口(即WebServices服务),但却不能根据用户ID查询,估计应该还要下载相应的数据集和jar包,详见 基于 Apache Mahout 构建社会化推荐引擎
Mahout 连接数据库Mysql
import org.apache.mahout.cf.taste.common.TasteException;
import org.apache.mahout.cf.taste.impl.model.jdbc.MySQLJDBCDataModel;
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.model.DataModel;
import org.apache.mahout.cf.taste.model.JDBCDataModel;
import org.apache.mahout.cf.taste.neighborhood.*;
import org.apache.mahout.cf.taste.recommender.*;
import org.apache.mahout.cf.taste.similarity.*;
import com.mysql.jdbc.jdbc2.optional.*;
import java.util.*;
public class mahout_main {
public static void main(String[] args) throws TasteException {
long t1 = System.currentTimeMillis();
MysqlDataSource dataSource = new MysqlDataSource();// import com.mysql.jdbc.jdbc2.optional.*;
dataSource.setServerName("localhost");
dataSource.setUser("root");
dataSource.setPassword("*********");
dataSource.setDatabaseName("summer");
JDBCDataModel dataModel = new MySQLJDBCDataModel(dataSource, "test", "user", "item", "score", "time");
DataModel model = dataModel;
UserSimilarity similarity = new PearsonCorrelationSimilarity(model);
UserNeighborhood neighborhood = new NearestNUserNeighborhood(2, similarity, model);
Recommender recommender = new GenericUserBasedRecommender(model, neighborhood, similarity);
List<RecommendedItem> recommendations = recommender.recommend(1, 2);
for (RecommendedItem recommendation: recommendations) {
System.out.println(recommendation);
}
System.out.println("done and time spend:" + (System.currentTimeMillis() - t1));
}
}
参考资料:
1.http://www.ibm.com/developerworks/cn/java/j-mahout/
2.http://blog.csdn.net/zhzhl202/article/details/6316570
3.http://www.ibm.com/developerworks/cn/java/j-lo-mahout/
- Eclipse下mahout实现推荐的简单实例
- Eclipse下mahout实现推荐的简单实例
- Eclipse下mahout实现推荐的简单实例
- Eclipse下mahout实现推荐的简单实例
- Eclipse下mahout实现推荐的简单实例淹
- Mahout协同推荐简单实例
- Mahout协同推荐简单实例
- Eclipse中mahout运行环境的搭建以及推荐实例
- 基于hadoop下的mahout推荐系统实现
- 基于hadoop下的mahout推荐系统实现
- mahout评估一个简单的推荐程序
- mahout实现基于用户的Mahout推荐程序
- 基于Mahout的电影推荐系统实现
- 第一篇:win7下mahout搭建简单推荐系统
- Eclipse 下mahout的配置与使用
- mahout在eclipse下的开发环境
- Eclipse 下mahout的配置与使用
- Eclipse 下mahout的配置与使用
- STM32 + RT Thread OS 学习笔记[六]
- automake和autoconf学习小结
- 服务的生命周期
- 快速迭代失败
- 找回ArcGIS 10.1 for Server的用户密码
- Eclipse下mahout实现推荐的简单实例
- POJ 2049 Finding Nemo
- Android 自定义控件----( 原生控件修改 onDraw )
- JS截取字符串substr 和 substring方法的区别
- hdu2602 Bone Collector(背包问题)
- java基本概念
- 代码大全阅读记录-(1)software construnction
- eclipse 连接hadoop 错误
- PHP生命周期,内核执行过程