Mahout推荐系统引擎UserCF中的IRStats部分源码解析

Mahout提供推荐系统引擎是模块化的,分为5个主要部分组成:
这里写图片描述
1. 数据模型
2. 相似度算法
3. 近邻算法
4. 推荐算法
5. 算法评分器
今天好好看了看关于推荐算法以及算法评分部分的源码。
http://blog.csdn.net/jianjian1992/article/details/46582713
里边数据的为例进行实验。

整体流程的代码如下,依照上面的5个模块,看起来倒是很简单呀。

public static RecommenderBuilder userRecommender(final UserSimilarity us, final UserNeighborhood un, boolean pref) throws TasteException {
            return pref ? new RecommenderBuilder() {

                public Recommender buildRecommender(DataModel model) throws TasteException {
                    //user对每个item都有评价preference的时候使用
                    return new GenericUserBasedRecommender(model, un, us);
                }
            } : new RecommenderBuilder() {

                public Recommender buildRecommender(DataModel model) throws TasteException {
                    //user对item没有评价preference的时候使用
                    return new GenericBooleanPrefUserBasedRecommender(model, un, us);
                }
            };
        }
final static int NEIGHBORHOOD_NUM = 3;
final static int RECOMMENDER_NUM = 2;
public static void main(String[] args) throws IOException, TasteException {
        String file = "item.csv";
        //1.构建数据模型
        DataModel model = new FileDataModel(new File(file));
        //2.相似度算法,采用欧式距离
        UserSimilarity user = new EuclideanDistanceSimilarity(model);
        //3.近邻算法,采用K = NEIGHBORHOOD_NUM最近邻
        NearestNUserNeighborhood neighbor = new NearestNUserNeighborhood(NEIGHBORHOOD_NUM, user, model);
        //4.基于以上三个模块构建推荐器,构造好之后就已经确定了
        UserBasedRecommender r = new GenericUserBasedRecommender(model, neighbor, user);
        //5.a推荐器的构造方法,用于评价时根据新采集的训练集生成推荐器
        RecommenderBuilder recommenderBuilder = userRecommender(user, neighbor, false);
        //5.b评价算法,采用平均绝对值距离,也即L1距离
        RecommenderEvaluator evalutor = new AverageAbsoluteDifferenceRecommenderEvaluator();
        System.out.println("eval:"+ evalutor.evaluate(recommenderBuilder, null, model, 0.5, 1));
        //5.c评价算法,计算推荐系统的准确率,召回率等指标
        RecommenderIRStatsEvaluator evaluator = new GenericRecommenderIRStatsEvaluator();
        IRStatistics stats = evaluator.evaluate(recommenderBuilder, null, model, null, 2, GenericRecommenderIRStatsEvaluator.CHOOSE_THRESHOLD, 1.0);
        System.out.printf("Recommender IR Evaluator: [Precision:%s,Recall:%s,F1:%s,FallOut:%s,nDCG:%s]\n", stats.getPrecision(), stats.getRecall(), stats.getF1Measure(), stats.getFallOut(), stats.getNormalizedDiscountedCumulativeGain());

运行结果如下:

eval:2.368176281452179
Recommender IR Evaluator: [Precision:0.5,Recall:1.0,F1:0.6666666666666666,FallOut:0.16666666666666666,nDCG:1.0]

RecommenderIRStatsEvaluator源码解析

RecommenderIRStatsEvaluator是一个接口,用于得到推荐系统的准确率,召回率等统计指标。
它定义的函数如下

/**
   * @param recommenderBuilder
   * 它通过public Recommender buildRecommender(DataModel model)定义推荐系统创建的方式;       

   * @param dataModelBuilder
   * 数据模型创建的方式,如果已经创建好了数据模型,一般这个参数可以为null

   * @param dataModel
   * 推荐系统使用的数据模型
   * 
   * @param rescorer
   * 推荐排序的方式,一般情况下可以为null
   * 
   * @param at
   * 这个参数起的名字挺奇怪的,它用来定义计算准确率的时候,一个user可以拥有的相关项items的最大个数,相关项item定义为user对这个item的评价是超过了relevanceThreshold的

   * @param relevanceThreshold
   * 和at一起使用定义一个user的相关项
   *    
   * @return {@link IRStatistics} with resulting precision, recall, etc.
   * @throws TasteException
   *           if an error occurs while accessing the {@link DataModel}
   */
IRStatistics evaluate(RecommenderBuilder recommenderBuilder,
                        DataModelBuilder dataModelBuilder,
                        DataModel dataModel,
                        IDRescorer rescorer,
                        int at,
                        double relevanceThreshold,
                        double evaluationPercentage) throws TasteException;

在代码中是使用

RecommenderIRStatsEvaluator evaluator = new GenericRecommenderIRStatsEvaluator();

来创建这个评价器的。
关于GenericRecommenderIRStatsEvaluator的介绍是

For each user, these implem

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值