1.HelloMahout.java
2.DistanceTest.java
3.MahoutDemo.java

1.HelloMahout.java

  1. package cn.crxy.mahout;
  2.  
  3. import java.io.File;
  4. import java.util.List;
  5.  
  6. import org.apache.log4j.Logger;
  7. import org.apache.mahout.cf.taste.impl.model.file.FileDataModel;
  8. import org.apache.mahout.cf.taste.impl.neighborhood.NearestNUserNeighborhood;
  9. import org.apache.mahout.cf.taste.impl.recommender.GenericUserBasedRecommender;
  10. import org.apache.mahout.cf.taste.impl.similarity.PearsonCorrelationSimilarity;
  11. import org.apache.mahout.cf.taste.model.DataModel;
  12. import org.apache.mahout.cf.taste.neighborhood.UserNeighborhood;
  13. import org.apache.mahout.cf.taste.recommender.RecommendedItem;
  14. import org.apache.mahout.cf.taste.recommender.Recommender;
  15. import org.apache.mahout.cf.taste.similarity.UserSimilarity;
  16.  
  17. public class HelloMahout {
  18.  
  19. public static void main(String[] args) {
  20.  
  21. Logger logger=Logger.getLogger(HelloMahout.class);
  22. try {
  23. //读取用户评分数据 封装成一个model
  24. DataModel model = new FileDataModel(new File("F:\\360Downloads\\超人学院\\第14期视频\\2016-09-12【mahout】\\样本数据\\info.csv"));
  25. // 根据相似度找出对应的好朋友的标准 物以类聚,人以群分
  26. UserSimilarity userSimilarity = new PearsonCorrelationSimilarity(model);
  27. // 邻域 选择两个好朋友帮我推荐
  28. UserNeighborhood userNeighborhood = new NearestNUserNeighborhood(2,userSimilarity, model);
  29. // 构建推荐引擎
  30. Recommender recommender = new GenericUserBasedRecommender(model,userNeighborhood, userSimilarity);
  31. // 进行推荐
  32. List<RecommendedItem> recommend = recommender.recommend(1, 5);
  33. for (RecommendedItem item : recommend) {
  34. logger.info(item);
  35. }
  36. } catch (Exception e) {
  37. logger.error(e.getMessage());
  38. }
  39. }
  40. }

2.DistanceTest.java

  1. package cn.crxy.mahout;
  2.  
  3. import org.junit.Before;
  4. import org.junit.Test;
  5.  
  6. public class DistanceTest {
  7.  
  8. // 水果维度依次为:苹果、梨、桃子、栗子、香蕉、橘子
  9. // 小明:5,4,2,1,5,5
  10. // 小丽:5,3,1,2,1,1
  11. // 小王:5,3,4,1,4,3
  12. private int[] a;
  13. private int[] b;
  14. private int[] c;
  15.  
  16. @Before
  17. public void initData(){
  18. a=new int[]{5,4,2,1,5,5};
  19. b=new int[]{5,3,1,2,1,1};
  20. c=new int[]{5,3,4,1,4,3};
  21. }
  22.  
  23. @Test
  24. public void Distance(){
  25. // a-b:5.916079783099616
  26. // a-c:3.1622776601683795
  27. // c-b:4.795831523312719
  28.  
  29. System.out.println(String.format("a-b:%s", 1.0/(1.0+Man(a, b))));
  30. System.out.println(String.format("a-c:%s", 1.0/(1.0+Man(a, c))));
  31. System.out.println(String.format("c-b:%s", 1.0/(1.0+Man(c, b))));
  32. // a-b:0.08333333333333333
  33. // a-c:0.14285714285714285
  34. // c-b:0.1
  35.  
  36. }
  37. //欧式距离
  38. private double ErluD(int[] a_array,int[] b_array){
  39. double result=0;
  40. for (int i = 0; i < a_array.length; i++) {
  41. result+=Math.pow(a_array[i]-b_array[i],2);
  42. }
  43. return Math.sqrt(result);
  44. }
  45. //曼哈顿距离
  46. private double Man(int[] a_array,int[] b_array){
  47. double result=0;
  48. for (int i = 0; i < a_array.length; i++) {
  49. result+=Math.abs(a_array[i]-b_array[i]);
  50. }
  51. return result;
  52. }
  53. //min式距离
  54. private double Min(int[] a_array,int[] b_array,int p){
  55. double result=0;
  56. for (int i = 0; i < a_array.length; i++) {
  57. result+=Math.pow(Math.abs(a_array[i]-b_array[i]),p);
  58. }
  59. return Math.pow(result,1.0/p);
  60. }
  61.  
  62. }

3.MahoutDemo.java

  1. package cn.crxy.mahout;
  2.  
  3. import java.io.File;
  4. import java.util.List;
  5.  
  6. import org.apache.mahout.cf.taste.impl.common.FastByIDMap;
  7. import org.apache.mahout.cf.taste.impl.common.FastIDSet;
  8. import org.apache.mahout.cf.taste.impl.model.GenericPreference;
  9. import org.apache.mahout.cf.taste.impl.model.GenericUserPreferenceArray;
  10. import org.apache.mahout.cf.taste.impl.model.file.FileDataModel;
  11. import org.apache.mahout.cf.taste.impl.neighborhood.NearestNUserNeighborhood;
  12. import org.apache.mahout.cf.taste.impl.neighborhood.ThresholdUserNeighborhood;
  13. import org.apache.mahout.cf.taste.impl.recommender.GenericBooleanPrefItemBasedRecommender;
  14. import org.apache.mahout.cf.taste.impl.recommender.GenericItemBasedRecommender;
  15. import org.apache.mahout.cf.taste.impl.recommender.GenericUserBasedRecommender;
  16. import org.apache.mahout.cf.taste.impl.similarity.CachingItemSimilarity;
  17. import org.apache.mahout.cf.taste.impl.similarity.CachingUserSimilarity;
  18. import org.apache.mahout.cf.taste.impl.similarity.PearsonCorrelationSimilarity;
  19. import org.apache.mahout.cf.taste.impl.similarity.TanimotoCoefficientSimilarity;
  20. import org.apache.mahout.cf.taste.model.DataModel;
  21. import org.apache.mahout.cf.taste.model.PreferenceArray;
  22. import org.apache.mahout.cf.taste.neighborhood.UserNeighborhood;
  23. import org.apache.mahout.cf.taste.recommender.RecommendedItem;
  24. import org.apache.mahout.cf.taste.recommender.Recommender;
  25. import org.apache.mahout.cf.taste.similarity.ItemSimilarity;
  26. import org.apache.mahout.cf.taste.similarity.UserSimilarity;
  27. import org.junit.Before;
  28. import org.junit.Ignore;
  29. import org.junit.Test;
  30.  
  31. public class MahoutDemo {
  32.  
  33. //组装datamodel
  34.  
  35. // userid itemid score
  36. // 101 102 103 104
  37. // 1(5,4,2,)
  38. // 2(,2,4,1)
  39. // 3(4,3,1,)
  40. DataModel dataModel;
  41.  
  42. @Before
  43. public void initData() throws Exception{
  44. //每一个用户的喜好列表 key:用户id value:该用户的偏好列表
  45. FastByIDMap<PreferenceArray> data=new FastByIDMap<PreferenceArray>();
  46. //组装第一个用户 偏好列表
  47. PreferenceArray array1=new GenericUserPreferenceArray(3);
  48. //PreferenceArray index 指:偏好列表的index 序号。
  49. array1.setUserID(0, 1);
  50. array1.setItemID(0, 101);
  51. array1.setValue(0, 5);
  52.  
  53. array1.setUserID(1, 1);
  54. array1.setItemID(1, 102);
  55. array1.setValue(1, 4);
  56.  
  57. array1.setUserID(2, 1);
  58. array1.setItemID(2, 103);
  59. array1.setValue(2, 2);
  60.  
  61. data.put(1, array1);
  62.  
  63. //组装第二个喜好
  64. PreferenceArray array2=new GenericUserPreferenceArray(3);
  65. //2(,2,4,1)
  66. array2.set(0, new GenericPreference(2,102,2));
  67. array2.set(1, new GenericPreference(2,103,4));
  68. array2.set(2, new GenericPreference(2,104,1));
  69. data.put(2, array2);
  70. //组装第三个喜好
  71. PreferenceArray array3=new GenericUserPreferenceArray(3);
  72. //3(4,3,1,)
  73. array3.set(0, new GenericPreference(3,101,4));
  74. array3.set(1, new GenericPreference(3,102,3));
  75. array3.set(2, new GenericPreference(3,103,1));
  76. data.put(3, array3);
  77.  
  78. //dataModel=new GenericDataModel(data);
  79. // dataModel=new GenericBooleanPrefDataModel(userData);
  80. // System.out.println(dataModel.getPreferenceValue(1, 102));//获得1用户对102的评分
  81. // System.out.println(dataModel.getItemIDsFromUser(1));
  82. // System.out.println(dataModel.getUserIDs());
  83.  
  84. //1 101 102 103
  85. //2 102 103
  86. // key为userid value:物品的集合 set
  87. FastByIDMap<FastIDSet> userData=new FastByIDMap<FastIDSet>();
  88.  
  89. FastIDSet userSet1=new FastIDSet(3);
  90. userSet1.add(101);
  91. userSet1.add(102);
  92. userSet1.add(103);
  93. userData.put(1,userSet1);
  94.  
  95. FastIDSet userSet2=new FastIDSet(2);
  96. userSet2.add(102);
  97. userSet2.add(103);
  98. userData.put(2,userSet2);
  99.  
  100. //无偏好的构建
  101. // dataModel=new GenericBooleanPrefDataModel(userData);
  102.  
  103. //读取文件 有偏好的
  104. dataModel=new FileDataModel(new File("F:\\360Downloads\\超人学院\\第14期视频\\2016-09-12【mahout】\\样本数据\\info.csv"));
  105. //读取文件 无偏好的 无偏好的数据只有用户和其关联的商品 没有对应商品的评分
  106. // dataModel=new FileDataModel(new File("F:\\360Downloads\\超人学院\\第14期视频\\2016-09-12【mahout】\\样本数据\\ubool.data"));
  107.  
  108. // 对于无偏好数据:getvalue:如果存在记录则是1.0;否则为null。
  109. // System.out.println(dataModel.getPreferenceValue(1, 103));
  110. // System.out.println(dataModel.getItemIDsFromUser(1));
  111. // System.out.println(dataModel.getUserIDs());
  112.  
  113. }
  114. @Ignore
  115. public void testUserSimi() throws Exception{
  116.  
  117. //利用model和相似度函数 计算用户相似度
  118. // UserSimilarity userSimilarity=new TanimotoCoefficientSimilarity(dataModel);
  119. UserSimilarity userSimilarity=new PearsonCorrelationSimilarity(dataModel);
  120. userSimilarity=new CachingUserSimilarity(userSimilarity, dataModel);
  121. //查询用户之间的相似度 0.9999999999999998 0.944911182523068
  122. //如果使用CachingUserSimilarity userSimilarity(1,5) 第二次不会再次计算了
  123. System.out.println(userSimilarity.userSimilarity(1, 5));
  124. System.out.println(userSimilarity.userSimilarity(1, 5));
  125. }
  126. @Ignore
  127. public void testItemSimi() throws Exception{
  128.  
  129. //利用model和相似度函数 计算物品相似度
  130. ItemSimilarity itemSimilarity=new PearsonCorrelationSimilarity(dataModel);
  131. itemSimilarity =new CachingItemSimilarity(itemSimilarity,dataModel);
  132. //查询物品之间的相似度 0.9449111825230729
  133. System.out.println(itemSimilarity.itemSimilarity(101, 102));
  134. }
  135. @Test
  136. public void testuserNeighborhood() throws Exception{
  137. //相似度 有相似度才能算邻居是谁
  138. UserSimilarity userSimilarity=new PearsonCorrelationSimilarity(dataModel);
  139. //1.固定数目的邻居 如果取邻居 只取前三个
  140. UserNeighborhood userNeighborhood=new NearestNUserNeighborhood(3,userSimilarity,dataModel);
  141. long[] userNeighborhoods = userNeighborhood.getUserNeighborhood(1);//为1用户取得用户
  142. for (long l : userNeighborhoods) {
  143. System.out.println(l+"NearestNUserNeighborhoodsimi---"+userSimilarity.userSimilarity(1, l));
  144. }
  145. // 4NearestNUserNeighborhoodsimi---0.9999999999999998
  146. // 5NearestNUserNeighborhoodsimi---0.944911182523068
  147. // 2NearestNUserNeighborhoodsimi--- -0.7642652566278799这个是负0.7
  148.  
  149. //2.固定阈值的邻居 只要0.8以上的
  150. userNeighborhood=new ThresholdUserNeighborhood(0.7,userSimilarity,dataModel);
  151. long[] userNeighborhoodsnew = userNeighborhood.getUserNeighborhood(1);
  152. System.out.println(userSimilarity.userSimilarity(1, 2)); //查看1和2的相似度
  153. for (long l : userNeighborhoodsnew) {
  154. System.out.println(l+"ThresholdUserNeighborhoodsimi---"+userSimilarity.userSimilarity(1, l));
  155. }
  156.  
  157. }
  158. @Test
  159. public void testItemCmd() throws Exception{
  160. //1.基于物品的有偏好的推荐 基于物品的不需要邻居
  161. // ItemSimilarity itemSimilarity=new PearsonCorrelationSimilarity(dataModel);
  162. // Recommender recommender=new GenericItemBasedRecommender(dataModel,itemSimilarity);
  163.  
  164. //2.基于物品的无偏好推荐
  165. ItemSimilarity itemSimilarity=new TanimotoCoefficientSimilarity(dataModel);
  166. Recommender recommender=new GenericBooleanPrefItemBasedRecommender(dataModel,itemSimilarity);
  167.  
  168. List<RecommendedItem> recommend = recommender.recommend(1, 3);//给用户1推荐3个.
  169. for (RecommendedItem recommendedItem : recommend) {
  170. System.out.println(recommendedItem);
  171. //1.基于物品的有偏好的推荐RecommendedItem[item:104, value:5.0]其他的推荐不出来了....所以只推荐出了1个
  172.  
  173. //2.基于物品的无偏好的推荐
  174. //RecommendedItem[item:104, value:1.8]
  175. //RecommendedItem[item:106, value:1.15]
  176. //RecommendedItem[item:105, value:0.85]
  177. }
  178. }
  179. @Test
  180. public void testUserCmd() throws Exception{
  181. //1.基于用户的有偏好的推荐
  182. //UserSimilarity userSimilarity=new PearsonCorrelationSimilarity(dataModel);
  183. //2.基于用户的无偏好的推荐
  184. UserSimilarity userSimilarity=new TanimotoCoefficientSimilarity(dataModel);
  185.  
  186. UserNeighborhood userNeighborhood=new NearestNUserNeighborhood(3,userSimilarity,dataModel);//Top 3
  187. //构建推荐对象
  188. Recommender recommender=new GenericUserBasedRecommender(dataModel,userNeighborhood,userSimilarity);
  189. List<RecommendedItem> recommend = recommender.recommend(1, 3);
  190. for (RecommendedItem recommendedItem : recommend) {
  191. System.out.println(recommendedItem);
  192. //1.基于用户的有偏好推荐
  193. //RecommendedItem[item:104, value:5.0]
  194. //RecommendedItem[item:106, value:4.0]
  195. //2.基于用户的无偏好推荐
  196. //RecommendedItem[item:106, value:4.0]
  197. //RecommendedItem[item:104, value:3.2121212]
  198.  
  199. }
  200. }
  201.  
  202. }

Mahout使用(一)的更多相关文章

  1. [Mahout] 完整部署过程

    概述        Mahout底层依赖Hadoop,部署Mahout过程中最困难的就是Hadoop的部署      本文假设用户本身没有进行Hadoop的部署,记述部署Mahout的过程       ...

  2. Mahout之数据承载

    转载自:https://www.douban.com/note/204399134/ 推荐数据的处理是大规模的,在集群环境下一次要处理的数据可能是数GB,所以Mahout针对推荐数据进行了优化. Pr ...

  3. Mahout推荐算法API详解

    转载自:http://blog.fens.me/mahout-recommendation-api/ Hadoop家族系列文章,主要介绍Hadoop家族产品,常用的项目包括Hadoop, Hive, ...

  4. 从源代码剖析Mahout推荐引擎

    转载自:http://blog.fens.me/mahout-recommend-engine/ Hadoop家族系列文章,主要介绍Hadoop家族产品,常用的项目包括Hadoop, Hive, Pi ...

  5. mahout 安装测试

    1 下载 在http://archive.apache.org/dist/mahout下载相应版本的mahout 版本,获取官网查看http://mahout.apache.org 相关的信息

  6. Hadoop里的数据挖掘应用-Mahout——学习笔记<三>

    之前有幸在MOOC学院抽中小象学院hadoop体验课. 这是小象学院hadoop2.X的笔记 由于平时对数据挖掘做的比较多,所以优先看Mahout方向视频. Mahout有很好的扩展性与容错性(基于H ...

  7. 初学Mahout测试kmeans算法

    预备工作: 启动hadoop集群 准备数据 Synthetic_control.data数据集下载地址http://archive.ics.uci.edu/ml/databases/synthetic ...

  8. Mahout安装与配置

    一.安装mahout 1.下载mahout(mahout-distribution-0.9.tar.gz) http://pan.baidu.com/s/1kUtOMQb 2.解压至指定目录 我平时都 ...

  9. Mahout 的安装

    Mahout 的安装 Mahout是Hadoop的一种高级应用.运行Mahout需要提前安装好Hadoop,Mahout只在Hadoop集群的NameNode节点上安装一个即可,其他数据节点上不需要安 ...

  10. Mahout源码分析之 -- 文档向量化TF-IDF

    fesh个人实践,欢迎经验交流!Blog地址:http://www.cnblogs.com/fesh/p/3775429.html Mahout之SparseVectorsFromSequenceFi ...

随机推荐

  1. mysql学习之路_乱码问题

    中文数据问题: 中文数据问题本质就说字符集问题, 计算机只识别二进制,人类识别符号:需要友谊个二进制与字符对应关系(字符集). 报错:服务器没有识别对应的四个字节. 服务器认为的数据是utf—8,一个 ...

  2. [置顶] AngularJS实战之路由ui-sref-active使用

    当我们使用angularjs的路由时,时常会出现一个需求,当选中菜单时把当前菜单的样式设置为选中状态(多数就是改变颜色) 接下来就看看Angular-UI-Router里的指令ui-sref-acti ...

  3. WebGIS实现在线要素编辑之ArcGIS Server 发布Feature Service 过程解析

    WebGIS实现在线要素编辑之ArcGIS Server 发布Feature Service 过程解析 FeatureService也称要素服务,其最大的好处就是支持在线要素编辑,并将编辑同步更新到后 ...

  4. Kafka常用命令收录

    目录 目录 1 1. 前言 2 2. Broker默认端口号 2 3. 安装Kafka 2 4. 启动Kafka 2 5. 创建Topic 2 6. 列出所有Topic 3 7. 删除Topic 3 ...

  5. crontab使用环境变量

    两种方式: 1)直接在crontab中定义变量,如: A=123 * * * * * echo $A > /tmp/a.txt 注意在定义变量时不能使用$引用其它变量,如下面的做法错误: A=1 ...

  6. 在Ubuntu上建立Arm Linux 开发环境

    我使用的是友善2410的板子,以前都是用Fedora,现在家里的电脑被我转为Linux专用的了,装的是Ubuntu.但是嵌入式还是要玩的,在装载过程中也遇到一些小麻烦.在此记录一下,一来自己比较健忘, ...

  7. Beta阶段第二篇Scrum冲刺博客-Day1

    1.站立式会议 提供当天站立式会议照片一张 2.每个人的工作 (有work item 的ID),并将其记录在码云项目管理中: 昨天已完成的工作. 张晨晨:交接进组 郭琪容:明确任务并学习 吴玲:明确接 ...

  8. ASP.NET Web API 框架研究 Web Host模式路由及将请求转出到消息处理管道

    Web Host 模式下的路由本质上还是通过ASP.NET 路由系统来进行路由的,只是通过继承和组合的方式对ASP.NET路由系统的内部的类进行了一些封装,产生自己专用一套类结构,功能逻辑基本都是一样 ...

  9. 《principal component analysis based cataract grading and classification》学习笔记

    Abstract A cataract is lens opacification caused by protein denaturation which leads to a decrease i ...

  10. [ASE][Daily Scrum]11.11

    各位1111快乐,不知道大家的卡上还剩多少钱啊~~~ TCP server目前遇到一点小瓶颈,不过server的两个人承诺说明天就可以搞定,给他们加油!~! 今天的plan~ View Shilin ...