mahout数据模型,具有重复的用户、项输入,但具有不同的首选项值

iyr7buue  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(393)

我想知道分发的mahout推荐程序是如何工作的 org.apache.mahout.cf.taste.hadoop.item.RecommenderJob 处理csv文件,其中存在重复和三次重复的用户、项目条目,但具有不同的首选项值。例如,如果我有一个.csv文件 1,1,0.7 1,2,0.7 1,2,0.3 1,3,0.7 1,3,-0.7 mahout的数据模型如何处理这个问题?它是将给定用户的首选项值相加(例如,对于用户项1,2,首选项为(0.7+0.3)),还是平均值(例如,对于用户项1,2,首选项为(0.7+0.3)/2),还是默认为最后一个用户,它检测到的项项(例如,对于用户1,2,首选项值设置为0.3)。
我问这个问题是因为我正在考虑基于多个偏好指标(项目视图、喜欢、不喜欢、保存到购物车等)的建议。如果数据模型将首选项值视为线性权重(例如,项目视图加上“保存到希望列表”的首选项得分高于项目视图),则会很有帮助。如果datamodel已经通过求和来处理这个问题,那么我就可以省去额外的map reduce来排序和计算基于多个度量的总分。任何人都可以在mahout.csv数据模型上对此进行澄清 org.apache.mahout.cf.taste.hadoop.item.RecommenderJob 非常感谢。谢谢。

bihw5rsg

bihw5rsg1#

在开始计算之前合并它。
示例:

import java.io.IOException;
import java.util.Iterator;
import java.util.StringTokenizer;

import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.FloatWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.FileInputFormat;
import org.apache.hadoop.mapred.FileOutputFormat;
import org.apache.hadoop.mapred.JobClient;
import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.mapred.MapReduceBase;
import org.apache.hadoop.mapred.Mapper;
import org.apache.hadoop.mapred.OutputCollector;
import org.apache.hadoop.mapred.Reducer;
import org.apache.hadoop.mapred.Reporter;
import org.apache.hadoop.mapred.TextInputFormat;
import org.apache.hadoop.mapred.TextOutputFormat;

public final class Merge {
    public Merge() {
    }

    public static class MergeMapper extends MapReduceBase implements
            Mapper<LongWritable, Text, Text, FloatWritable> {

        public void map(LongWritable key, Text value, OutputCollector<Text, FloatWritable> collector,
                Reporter reporter) throws IOException {
            // TODO Auto-generated method stub
            String line = value.toString();
            StringTokenizer tokenizer = new StringTokenizer(line);
            if (tokenizer.hasMoreTokens()) {
                String userId = tokenizer.nextToken(",");
                String itemId = tokenizer.nextToken(",");
                FloatWritable score = new FloatWritable(Float.valueOf(tokenizer.nextToken(",")));
                collector.collect(new Text(userId + "," + itemId), score);
            }
            else {
                System.out.println("empty line " + line);
            }

        }
    }

    public static class MergeReducer extends MapReduceBase implements
            Reducer<Text, FloatWritable, Text, FloatWritable> {

        public void reduce(Text key, Iterator<FloatWritable> scores,
                OutputCollector<Text, FloatWritable> collector, Reporter reporter) throws IOException {
            // TODO Auto-generated method stub
            float sum = 0.0f;
            while (scores.hasNext()) {
                sum += scores.next().get();
            }
            if (sum != 0.0)
                collector.collect(key, new FloatWritable(sum));
        }
    }

    public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {

        JobConf conf = new JobConf(Merge.class);
        conf.setJobName("Merge Data");

        conf.setOutputKeyClass(Text.class);
        conf.setOutputValueClass(FloatWritable.class);

        conf.setMapperClass(MergeMapper.class);
        // combine the same key items
        conf.setCombinerClass(MergeReducer.class);
        conf.setReducerClass(MergeReducer.class);

        conf.setInputFormat(TextInputFormat.class);
        conf.set("mapred.textoutputformat.separator", ",");
        conf.setOutputFormat(TextOutputFormat.class);

        FileInputFormat.setInputPaths(conf, new Path("hdfs://localhost:49000/tmp/data"));
        FileOutputFormat.setOutputPath(conf, new Path("hdfs://localhost:49000/tmp/data/output"));

        JobClient.runJob(conf);
    }
}
0g0grzrc

0g0grzrc2#

不,它覆盖了。模型不是可加的。然而,myrrix中的模型,这个代码的一个派生版本(我正在商业化)有一个基本的可加性数据模型,这正是您给出的原因。输入值是权重,总是相加。

相关问题