Mahout in Action-2.简介

一、推荐的定义

  推荐:是一种用户体验的预测模式,采用这个模式发现你原先不知道,并且对你来说是新颖和感兴趣的事物。

  推荐引擎算法分两种:

  1. 找出和你喜好相类似的人,把他们的喜好推荐给你。基于用户(user-base);
  2. 根据你已经喜欢的产品,找出其他明显满足你喜好的产品。
  协同过滤(CF)产品推荐:主要特点,它是依据用户以往的行为做出推荐,而非兴趣集里各个条目内容的差异,所以CF不需要领域知识,在进行推荐前也不需要对内容进行事先收集和分析;(观其友,知其人)
  基于内容推荐:依据产品的某些属性进行推荐。例如:你的朋友推荐你买Manning的书,因为你的朋友喜欢Maning其他的书,你的朋友就是是根据“出版商”这个属性做的推荐。
  基于内容的推荐技术没有错,相反它能够很好的工作。但是,它需要很多预先设定的域,否则很难构建一个有效的框架。想构建一个有效的基于内容推荐,必须先定义书的属性:作者、出版商、颜色、页数、格式,这些属性有什么意义,达到什么程度。没有这些领域知识采用这种推荐方式很不靠谱。
  所以Mahout只提供协同过滤算法。

二、运行第一个推荐引擎

  数据准备:

 

  数据所展现出的趋势:

  

  给User1推荐那本书?101、102、103?No,这些书User1已经看过了,应该推荐给他新东西。直觉上,User4和User5与User1喜好相似,应该把User4和User5喜好并且User1没有看过的书推荐给User1,也就是104、105、106推荐给User1。其中104分数最高4.5,所以推荐104。

  Java代码:

public static void main(String[] args) throws Exception {

    DataModel model = new FileDataModel(new File("src/main/java/mia/recommender/ch02/intro.csv"));

    UserSimilarity similarity = new PearsonCorrelationSimilarity(model);
    UserNeighborhood neighborhood =
      new NearestNUserNeighborhood(2, similarity, model);

    Recommender recommender = new GenericUserBasedRecommender(
        model, neighborhood, similarity);                         // Create recommender engine
    List<RecommendedItem> recommendations =
        recommender.recommend(1, 1);                              // For user 1,recommend 1 item
for (RecommendedItem recommendation : recommendations) {
      System.out.println(recommendation);
    }

输出结果:
RecommendedItem[item:104, value:4.257081]

  分析代码:

DataModel:实现数据的存储,提供输入数据入口;

UserSimilarity:计算或度量用户有多相似;

UserNeighborhood:定义了给定用户最相似的一组用户;

Recommender:汇集这些组件,最终推荐给用户产品。

三、评估推荐结果

  对于用户什么是最好的推荐?

  推荐的产品应该是用户非常可能喜欢的产品(准确率),推荐的产品应该覆盖用户将来感兴趣的所有产品(召回率)

  如何度量预测的准确性?(训练集和评分)

  分为测试级和训练集,通过训练集预测测试级的喜好,然后与测试级的真实情况作比较,最后评分。

 

MAE(Mean Average difference):平均绝对误差

RMSE(Root Mean Square):均方根误差,对预测不准的用户物品(item2)进行惩罚,因而对系统的评测更加苛刻。

   Java代码:        

public static void main(String[] args) throwsException {
    RandomUtils.useTestSeed(); // the same random choices each time
    DataModel model = new FileDataModel(new File("src/main/java/mia/recommender/ch02/intro.csv"));

    RecommenderEvaluator evaluator =
      new AverageAbsoluteDifferenceRecommenderEvaluator();
  // new RMSRecommenderEvaluator();
// Build the same recommender for testing that we did last time: RecommenderBuilder recommenderBuilder = new RecommenderBuilder() { @Override public Recommender buildRecommender(DataModel model) throws TasteException { UserSimilarity similarity = new PearsonCorrelationSimilarity(model); UserNeighborhood neighborhood = new NearestNUserNeighborhood(2, similarity, model); return new GenericUserBasedRecommender(model, neighborhood, similarity); } }; // Use 70% of the data to train; test using the other 30%. double score = evaluator.evaluate(recommenderBuilder, null, model, 0.7, 1.0); // 1.0 how much of the overall input data is used.
    System.out.println(score);
  }

  分析代码与结果:

  RecommenderEvaluator:将数据集分为训练集和测试集,构造一个新的训练DataModel和Recommender用于预测测试集,最后评估测试集预测喜好与真实喜好的差别。

  AverageAbsoluteDifferenceRecommenderEvaluator:可替换为RMSE的RMSRecommenderEvaluator.

  结果为1.0:意味着预测的推荐喜好平均与真实喜好差别1.0.

四、评估准确率和召回率

  TopN推荐:网站提供推荐服务时,一般给用户一个个性化的推荐列表,这种推荐叫做TopN推荐。

  准确率:(根据用户在训练集上的行为给用户做出的推荐列表,也在测试集里)/根据用户在训练集上的行为给用户做出的推荐列表;

  召回率:(根据用户在训练集上的行为给用户做出的推荐列表,也在测试集里)/该用户在测试集里的行为;

posted @ 2012-07-11 18:58  跳刀的兔子  阅读(1707)  评论(0编辑  收藏  举报