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

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

   mahout中提供了为用户推荐物品的工具,但如何评价推荐的item是否和实际情况相符合。在机器学习和AI领域,习惯的是利用一部分数据作为训练集数据,而留出一部分实际用户喜好的数据作为测试集数据,通过估计出的值与实际测试值之间的均差、均方根等方法下的大小来评判,通常是值越小说明推荐的情况和实际值越接近,若其值为0说明完全吻合。 
   由于评判通过推荐系统得出的估计值和实际值之间的得分(通过均差、均方根等得到)直接关系到推荐系统的优劣,所以这里就有必要对此作出必要分析(由于均差方式简单,这里就以它为例)。 
        Item1        Item2        Item3 
实际值        3.0        5.0        4.0 


估计值        3.5        2.0        5.0 


差值        0.5        3.0        1.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

你可能感兴趣的:(Mahout)