• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

尼古拉斯豆

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

mahout:推荐系统入门学习(二)

转自:http://blog.chinaunix.net/uid-26711636-id-3086382.html

 

1)评价推荐系统优劣的方法

   mahout中提供了为用户推荐物品的工具,但如何评价推荐的item是否和实际情况相符合。在机器学习和AI领域,习惯的是利用一部分数据作为训练集数据,而留出一部分实际用户喜好的数据作为测试集数据,通过估计出的值与实际测试值之间的均差、均方根等方法下的大小来评判,通常是值越小说明推荐的情况和实际值越接近,若其值为0说明完全吻合。
   由于评判通过推荐系统得出的估计值和实际值之间的得分(通过均差、均方根等得到)直接关系到推荐系统的优劣,所以这里就有必要对此作出必要分析(由于均差方式简单,这里就以它为例)。
Item1Item2Item3
实际值3.05.04.0
 
估计值3.52.05.0
 
差值0.53.01.0
 
均差= (0.5 + 3.0 + 1.0)/ 3 = 1.5
   上面就展示了评价已定推荐系统根据均差方法测定其得分的过程,由于存在Item2,导致该系统得分偏高。当然在项目中自己也可以通过代码测试系统的得分(即优劣)。
 
2)下面的代码可以评估推荐系统的性能:
package com.loogn.valuaterecommender;

import org.apache.mahout.cf.taste.impl.model.file.*;//FileDataModel

import org.apache.mahout.cf.taste.model.*;//DAtaModel

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.neighborhood.*;

import org.apache.mahout.cf.taste.similarity.*;

import org.apache.mahout.cf.taste.recommender.*;

import org.apache.mahout.common.RandomUtils;

import org.apache.mahout.cf.taste.impl.eval.*;

import org.apache.mahout.cf.taste.eval.*;

import org.apache.mahout.cf.taste.common.TasteException;

import java.io.*;

public class ValuateRecommender {

/**

     * 

     * @param args

     * @throws Exception

     */

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

/**

         * 只用于结果可重复的例子

         */

        RandomUtils.useTestSeed();

/**

         * 加载数据文件

         */

        DataModel model = new FileDataModel(new

File("C:\\Users\\ZhouQiang\\Desktop\\my own task\\intro.csv"));

/**

         * 创建评价器

         */

        RecommenderEvaluator evaluator = new

        AverageAbsoluteDifferenceRecommenderEvaluator();

/**

         * 建立推荐系统

         */

        RecommenderBuilder builder = new RecommenderBuilder() {

            @Override

public Recommender buildRecommender(DataModel model)

throws TasteException {

                UserSimilarity similarity = new PearsonCorrelationSimilarity(model);

                UserNeighborhood neighborhood = new

                    NearestNUserNeighborhood(3,similarity,model);

return

new GenericUserBasedRecommender(model,neighborhood,similarity);

}

};

/**

             * 70%的数据作训练集,剩下30%的数据作测试集

             */

double score = evaluator.evaluate(builder, null, model, 0.7, 1.0);

System.out.println("评价得分:" + score);        // 输出评价得分

}

}

运行结果分析:

评价得分:1.0

 

 

每次运行结果都会是1.0,这是因为使用了RandomUtils.useTestSeed()强制将每次随机选取的集都能达到这个要求,如果将这行代码注释掉,会真的随机出现如下运行结果:
评价得分:NaN
评价得分:NaN
评价得分:0.0

posted on 2012-05-28 14:17  尼古拉斯豆  阅读(689)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3