本BLOG转自here,感谢作者的辛苦~
数据准备:test.txt
第一列为UserID ,第二列为ItemID,第三列为Preference Value 即评分
eclipse中新建一个java工程,然后在src目录下新建一个类RecommenderIntro (这里只是做测试,就放在默认包下,不新建包了),代码如下:
此时肯定会报错,因为还没有导入任何相关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/