[mahout in action]mahout推荐引擎如何处理无rating数据

并不是所有的 user和item的关系都可以用评分来衡量的。例如 新闻应用,我们大多数情况下只有 user的浏览记录。电商网站,记录了user看过哪个商品。这些都代表着user的兴趣。

或许对于电影评分,我们可以理解为,用户对这一类电影感兴趣(不感兴趣的连看都不会看,更不用说评分了),但是对个别电影的观后感不同导致评分不同。但如果还有该类型的电影,用户依然会去看(看完可能 评5分,也可能评1分)。这个时候,基于无rating的推荐,就是预测用户会不会去看一部电影,而不是预测用户看完会评多少分

基于这种考虑,可能有时候进行 无rating的推荐会有更好的效果

GenericBooleanPrefDataModel , 就是与GenericDataModel相对应的存储 无prefvalue数据的DataModel 

DataModel model = new GenericBooleanPrefDataModel(
  GenericBooleanPrefDataModel.toDataMap(
    new FileDataModel(new File("ua.base"))));

GenericBooleanPrefDataModel 使用FastIDSets来处理数据,而不是PreferenceArrays。toDataMap() 提供了两者之间的转换

直接看代码: 
public class RecommenderIntro {
    public static void main(String[] args) throws Exception{
     
       // RandomUtils.useTestSeed();
        // FileDataModel 会内部自动使用 GenericBooleanPrefDataModel,如果输入数据每一行只包含 userID 和 itemID的话
        DataModel model = new FileDataModel(new File("train_data0"));

       // 包含Precision 和Recall的 evaluator
        RecommenderIRStatsEvaluator evaluator = 
                new GenericRecommenderIRStatsEvaluator();

        RecommenderBuilder recommenderBuilder = new RecommenderBuilder(){

            @Override
            public Recommender buildRecommender(DataModel model)
                    throws TasteException {
               // 这里使用 对数似然相似度
                UserSimilarity similarity = new LogLikelihoodSimilarity(model);
                UserNeighborhood neighborhood = new NearestNUserNeighborhood(10, similarity, model);

                return new GenericBooleanPrefUserBasedRecommender(model, neighborhood, similarity);
            }
        };
        DataModelBuilder modelBuilder = new DataModelBuilder(){

            @Override
            public DataModel buildDataModel(FastByIDMap<PreferenceArray> trainingData) {

                return new GenericBooleanPrefDataModel(
                        GenericBooleanPrefDataModel.toDataMap(trainingData));
            }
        };
        IRStatistics stats = evaluator.evaluate(recommenderBuilder, modelBuilder, model, null, 10, GenericRecommenderIRStatsEvaluator.CHOOSE_THRESHOLD, 1.0);

        System.out.println(stats.getPrecision());
        System.out.println(stats.getRecall());
    }
}

注意
1,皮尔逊相似度 和 欧拉距离相似度不能用于计算 该类型数据的相似度,因为根据两者的公式,PeasonCorrelationSImilarity计算得到分母是0,而EuclideanDistanceSimilarity计算的所有相似度都是1。所以,计算相似度矩阵一般用 LogLikelihoodSimilarity 或者 TanimotoCoefficientSimilarity
2,评测不能用 平均绝对误差,因为评分都是1.0(默认),绝对误差的结果最后是0.0。但可以用 precision 和 recall 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值