mahout中的完整基于用户的推荐系统

  1. 还是为学弟学妹们服务,mahout做推荐系统,今天讲解mahout比较完备的基于用户的推荐系统。
  2. 一、工具。
  3. 二、代码讲解
  4. 学弟学妹们,快去尝试吧~

还是为学弟学妹们服务,mahout做推荐系统,今天讲解mahout比较完备的基于用户的推荐系统。

一、工具。

IDE:Intellij IDEA或者eclipse
安装和配置:maven,mahout

二、代码讲解

由于所有的代码我都给了注释,所以这里我就直接贴代码了。首先导入如下jar包。

import org.apache.hadoop.metrics2.sink.ganglia.AbstractGangliaSink;
import org.apache.mahout.cf.taste.common.TasteException;
import org.apache.mahout.cf.taste.common.Weighting;
import org.apache.mahout.cf.taste.eval.RecommenderBuilder;
import org.apache.mahout.cf.taste.eval.RecommenderEvaluator;
import org.apache.mahout.cf.taste.impl.eval.AverageAbsoluteDifferenceRecommenderEvaluator;
import org.apache.mahout.cf.taste.impl.eval.RMSRecommenderEvaluator;
import org.apache.mahout.cf.taste.impl.model.file.FileDataModel;
import org.apache.mahout.cf.taste.impl.neighborhood.NearestNUserNeighborhood;
import org.apache.mahout.cf.taste.impl.neighborhood.ThresholdUserNeighborhood;
import org.apache.mahout.cf.taste.impl.recommender.GenericUserBasedRecommender;
import org.apache.mahout.cf.taste.impl.similarity.*;
import org.apache.mahout.cf.taste.model.DataModel;
import org.apache.mahout.cf.taste.neighborhood.UserNeighborhood;
import org.apache.mahout.cf.taste.recommender.Recommender;
import org.apache.mahout.cf.taste.similarity.UserSimilarity;
import org.apache.mahout.common.RandomUtils;
import java.io.File;

然后完整的代码部分,//部分是注释掉的内容,这些内容给了代码的详细讲解。

public class easy_recommender_eval {
    public static void main(String[] args) throws Exception{
        RandomUtils.useTestSeed();
        final DataModel model = new FileDataModel(new File("E:/mahout/u.data"));
//      System.out.println(model.getPreferenceValue(1,101));
//        System.out.println(model.getNumUsers());

//        RecommenderEvaluator evaluator = new RMSRecommenderEvaluator();
        //上面这个用来计算RMSE
        RecommenderEvaluator evaluator = new AverageAbsoluteDifferenceRecommenderEvaluator();
        //上面这个用来计算MAE
        RecommenderBuilder builder = new RecommenderBuilder() {
            @Override
            public Recommender buildRecommender(DataModel model) throws TasteException {
                UserSimilarity similarity = new PearsonCorrelationSimilarity(model);
//                similarity.setPreferenceInferrer(new AveragingPreferenceInferrer(model));
                //这个可以实现给用户没有评分的数据直接填充平均值

                /*当我们查看皮尔森的源码发现其实他还有一个参数是weight,这个是权重,这个权重在于体验用户的共同观影数,越多权值越大,
                默认是没有权值的,即Weight.UNWEIGHT,我们可以给他加上,
                UserSimilarity similarity = new PearsonCorrelationSimilarity(model, Weighting.WEIGHTED);
                他预测的MAE会小一点点,另外补充一点,其实这个不仅仅是皮尔森相似度的计算公式,也是余弦相似度的计算公式。
                因为Mahout实现中会将输入中心化,导致这两个度量标准变成一样的。
                * */
//                UserSimilarity similarity = new EuclideanDistanceSimilarity(model);
                //上面这个是欧氏距离,这种算法求出来的并不是相似度,因此相似度是以计算出来的距离d,经过1/1+d得到相似度。并且其计算结果在0到1之间。另外欧式距离也可以加上权重。

//                UserSimilarity similarity = new CachingUserSimilarity(new SpearmanCorrelationSimilarity(model),model);
                /*
                这个是斯皮尔曼计算相似度的方式,这个相似度的计算方式,首先给用户对每一个项目按评分的大小排序,比如评分最低的
                评分值会被改成1,次低的被改成2,以此类推,然后再使用皮尔森相似度的计算方法计算相似度,这个算法实现起来的效率
                是非常低的,因为他会先排序。这里大家可能发现,多了一个CachingUserSimilarity,他封装了Usersimliarity的实现
                并且缓存结果,可以这么理解,比如我们已经算过了用户1和其他所有用户的相似度了,然后后面我们算用户2的时候,就不
                需要再去计算和用户1的相似度了,因为已经被缓存了。可以提高程序的计算效率,但是会消耗内存。
                 */

//                UserSimilarity similarity = new TanimotoCoefficientSimilarity(model);
                /*
                这个是谷本系数,也叫做Jaccard系统,他的计算方式两个用户看过的电影的交集除以两个用户看的电影的并集。
                 */

//                UserSimilarity similarity = new LogLikelihoodSimilarity(model);
                /*
                这个是基于对数似然比计算相似度,相比与谷本系数,这个方面比较智能化,他旨在计算两个用户由于机缘巧合发生重叠
                的不可能性。比如其实两个不相似的用户,巧合的评价过一些电影,但是这些重叠的电影不太可能是巧合的概率。由于比较
                智能,这个算出来的值还是比较小的。
                 */

//                UserNeighborhood neighborhood = new ThresholdUserNeighborhood(0.5, similarity, model);
                //上面是基于阈值的邻域
                UserNeighborhood neighborhood = new NearestNUserNeighborhood(100, similarity, model);
                //上面是固定大小的邻域,只前相似度最高的前10
                return new GenericUserBasedRecommender(model, neighborhood, similarity);

            }
        };

        double score = evaluator.evaluate(builder, null, model, 0.9, 1.0);
//最后两个参数的第一个参数是选取百分之90的数据做训练,最后一个参数是选取百分之百的数据。比如说你的数据集比较大,最后一个数据你可以写0.5,也就是说取一半的数据,然后再一半的数据里面在取百分之90作为训练集。
        System.out.println(score);
    }
}

最后输出的score是MAE值,也就是我们说的平均绝对误差。

学弟学妹们,快去尝试吧~


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1990858822@qq.com

文章标题:mahout中的完整基于用户的推荐系统

本文作者:XIAOK Z

发布时间:2019-09-05, 20:19:15

最后更新:2019-09-05, 20:30:43

原始链接:http://yoursite.com/2019/09/05/mahout中的完整基于用户的推荐系统/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏