Chinaunix首页 | 论坛 | 博客
  • 博客访问: 58265
  • 博文数量: 22
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 221
  • 用 户 组: 普通用户
  • 注册时间: 2015-08-28 11:18
文章分类

全部博文(22)

文章存档

2021年(4)

2020年(1)

2016年(10)

2015年(7)

我的朋友

分类: 大数据

2016-05-17 18:51:40

主要是记录一下学到的一个简单的推荐程序的书写,同时对于这个推荐程序我们给出评价标准。包含差值评价、查全率、查准率评价。
输入数据:(用户ID,书籍ID,偏好程度)

点击(此处)折叠或打开

  1. 1,101,5.0
  2. 1,102,3.0
  3. 1,103,2.5

  4. 2,101,2.0
  5. 2,102,2.5
  6. 2,103,5.0
  7. 2,104,2.0

  8. 3,101,2.5
  9. 3,104,4.0
  10. 3,105,4.5
  11. 3,107,5.0

  12. 4,101,5.0
  13. 4,103,3.0
  14. 4,104,4.5
  15. 4,106,4.0

  16. 5,101,4.0
  17. 5,102,3.0
  18. 5,103,2.0
  19. 5,104,4.0
  20. 5,105,3.5
  21. 5,106,4.0



简单的推荐程序:

点击(此处)折叠或打开

  1. //DataModel 实现存储并为计算提供所需的所有偏好(Mahout中数据是以偏好的形式表示的 格式为用户ID、物品ID、偏爱程度的数值)、用户和物品数据
  2. //UserSimilarity 实现给出两个用户的相似度,可以从多种可能度量或计算中选用一种作为依据
  3. //UserNeighborhood 实现明确了与给定用户最相似的一组用户
  4. //Recommender实现合并所有这些组件为用户推荐商品

  5. //intro.csv中的数据含义是 前面是用户ID 中间是书籍ID 最后是偏好程度

  6. //程序最后的数据结果是 RecommendedItem[item:104, value:4.257081] 含义是将104号书籍推荐给用户1
  7. public class RecommenderIntro {

  8.     public static void main(String[] args) throws Exception{
  9.         // TODO Auto-generated method stub

  10.         DataModel model=new FileDataModel(new File("intro.csv"));
  11.         UserSimilarity similarity=new PearsonCorrelationSimilarity(model);
  12.         UserNeighborhood neighborhood=new NearestNUserNeighborhood(2, similarity, model);
  13.         Recommender recommender=new GenericUserBasedRecommender(model, neighborhood, similarity);
  14.         
  15.         List<RecommendedItem> recommendations=recommender.recommend(1, 2); //这个函数中前一个表示对哪一个用户进行推荐,后一个表示推荐几个
  16.         for(RecommendedItem recommendation:recommendations){
  17.             System.out.println(recommendation);
  18.         }
  19.     }

  20. }



对推荐程序做差值评价

点击(此处)折叠或打开

  1. //整个评估的原理就是将数据集中的一部分数据作为测试数据。也就是这一部分数据程序不可见,然后推荐引擎通过剩余的训练数据推测测试数据的值,然后将推测值与真实的测试数据进行比较。
  2. //比较的方法有平均差值,就是每一项与真实数据做差然后求平均值,另一种方式就是均方根。就是差值求平方和,然后求平方和的平均值,然后取平方根。这种方式会放大差值的影响,比如推荐的结果中差一个星值,产生的影响远大于1倍的影响就可以使用这种评估算法。
  3. //评估推荐引擎,此处使用的AverageAbsoluteDifferenceRecommenderEvaluator 采用的平均差值进行评估。这只是为了方便,通常会采用均方根的方式进行评估,也就是使用RMSRecommenderEvaluator替代前面的评估器

  4. public class RecommenderIntroEvaluator {

  5.     public static void main(String[] args) throws Exception{
  6.         // TODO Auto-generated method stub

  7.         RandomUtils.useTestSeed();
  8.         DataModel model=new FileDataModel(new File("ua.base")); //此处采用的是从网上下载的一个大数据集,最后的评价结果是0.8761682242990649,表示的是平均与真实结果的差值是0.9.
  9.         RecommenderEvaluator evaluator=new AverageAbsoluteDifferenceRecommenderEvaluator();
  10.         //我们创建了一个推荐器生成器,因为评估的时候我们需要将源数据中的一部分作为测试数据,其他作为算法的训练数据,需要通过新训练的DataModel构建推荐器,所以采用生成器的方式生成推荐器
  11.         RecommenderBuilder builder=new RecommenderBuilder() {
  12.             
  13.             @Override
  14.             public Recommender buildRecommender(DataModel model) throws TasteException {
  15.                 // TODO Auto-generated method stub
  16.                 UserSimilarity similarity=new PearsonCorrelationSimilarity(model);
  17.                 UserNeighborhood neighborhood=new NearestNUserNeighborhood(2, similarity, model);
  18.                 return new GenericUserBasedRecommender(model, neighborhood, similarity);
  19.             }
  20.         };
  21.         //参数中0.7代表训练数据为70%,测试数据是30%。最后的1.0代表的是选取数据集的多少数据做整个评估。如果你想更快的做出评估,可以选取0.1.表示的是10%的数据做整个评估测试,在这10%的数据集中70%作为训练,30%作为测试。
  22.         double score=evaluator.evaluate(builder, null, model, 0.7, 1.0); //此处第二个null处,使用null就可以满足基本需求,但是如果我们有特殊需求,比如使用特殊的DataModel,在这里可以使用DataModelBuilder的一个实例。
  23.         System.out.println(score);
  24.     }

  25. }



进行查全率和查准率的评价


点击(此处)折叠或打开

  1. public class IRStatsRecommender {

  2.     public static void main(String[] args) throws Exception{
  3.         // TODO Auto-generated method stub

  4.         RandomUtils.useTestSeed();
  5.         DataModel model=new FileDataModel(new File("intro.csv"));
  6.         RecommenderIRStatsEvaluator evaluator=new GenericRecommenderIRStatsEvaluator();
  7.         RecommenderBuilder recommenderBuilder=new RecommenderBuilder() {
  8.             
  9.             @Override
  10.             public Recommender buildRecommender(DataModel model) throws TasteException {
  11.                 // TODO Auto-generated method stub
  12.                 UserSimilarity similarity=new PearsonCorrelationSimilarity(model);
  13.                 UserNeighborhood neighborhood=new NearestNUserNeighborhood(2, similarity, model);
  14.                 return new GenericUserBasedRecommender(model, neighborhood, similarity);
  15.             }
  16.         };
  17.         
  18.         IRStatistics stats=evaluator.evaluate(recommenderBuilder, null, model, null, 2, GenericRecommenderIRStatsEvaluator.CHOOSE_THRESHOLD, 1.0);
  19.         System.out.println(stats.getPrecision()); //查准率为0.75 上面设置的参数为2,表示 Precision at 2(推荐两个结果时的查准率),平均有3/4的推荐结果是好的
  20.         System.out.println(stats.getRecall());//Recall at 2 推荐两个结果的查全率是1.0 表示所有的好的推荐都包含在这些推荐结果中
  21.     }

  22. }


另一种评价器:

点击(此处)折叠或打开

  1. //这种推荐器SlopeOneRecommender生成评价结果更快了一些。但是这并不是说Slope-one更好或者更快。每个算法都有其特征和属性。这种推荐器0.9版本之后就没有了。

  2. public class RecommenderIntroEvaluatorSlope {

  3.     public static void main(String[] args) throws Exception{
  4.         // TODO Auto-generated method stub

  5.         RandomUtils.useTestSeed();
  6.         DataModel model=new FileDataModel(new File("ua.base"));
  7.         RecommenderEvaluator evaluator=new RMSRecommenderEvaluator();
  8.         
  9.         RecommenderBuilder builder=new RecommenderBuilder() {
  10.             
  11.             @Override
  12.             public Recommender buildRecommender(DataModel model) throws TasteException {
  13.                 // TODO Auto-generated method stub
  14.                 
  15.                 return new SlopeOneRecommender(model);
  16.             }
  17.         };
  18.         
  19.         double score=evaluator.evaluate(builder, null, model, 0.7, 1.0);
  20.         System.out.println(score);
  21.     }

  22. }








阅读(1297) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~