欢迎关注鄙人公众号,技术干货随时看!
首先介绍下频繁项集的相关知识!其实频繁项集是针对购物车提出来的,也就是在购物车中频繁出现的物品的集合。
2.相关概念:
关联规则的支持度:Support(A,B)=包含A和B的事务数/事务总数
关联规则的置信度:Confidence(A,B)= 包含A和B的事务数/包含A事务数
频繁项集:项集的频率大于等于最小支持度。
强相关规则:同时满足最小支持度和最小置信度。
3.关联规则挖掘的步骤:
生成频繁项集,然后生成规则
空谈理论是没有实际意义的,本文基于敝人一个实际的工程项目,来介绍如何应用频繁项集进行关联规则推荐物品。基于商业秘密,所用到的数据均进行了处理!本工程通过Map-Reduce实现,由三个map-reduce过程来完成。
第一个map-reduce类:CrossRecommendStep1,生成频繁一项集,输入文件为order_wash.txt,这个文件在具体的项目中一般都是由用户的定单数据统计而来,具体的日志清洗与统计不在本文讨论范畴,其实一个完整的推荐流程是由日志清单、用户常购清单、推荐算法等多个步骤才能完成的,本文专注于交叉推荐算法的实际应用!order_wash.txt 格式如下:
accessTime mem_guid category
2016-04-20 11:31:20 FN05916 CC204316,CC304119,CC404115
2016-04-20 11:31:20 FN05917 CC204315,CC304111,CC404115
2016-04-20 11:31:20 FN05918 CC204314,CC304112,CC404115
2016-04-20 11:31:20 FN05919 CC204311,CC304113,CC404117
2016-04-20 11:31:20 FN05920 CC204311,CC304115,CC404116
2016-04-20 11:31:20 FN05921 CC204311,CC304115,CC404115
下面看CrossRecommendStep1类具本的实现代码,此类主要是统计每个分类下的购买次数(包括不同用户的,一个用户多次购买算多次,当然你也可以根据自己的业务逻辑来完成这个统计)最终的输出如下,只贴出来一部分
category count
CC204316 1
CC204311 3
CC404115 4
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;
/*
* 交叉关联推荐:CC——CC
* 用于订单成交后向上交叉推荐
* Step1:生成频繁1项集
* @author jianting.zhao
* main函数就是驱动函数,固定的写法,in是输入文件路径,out是输出结果路径
*
*
*/
public class CrossRecommendStep1 {
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
Configuration conf = new Configuration();
String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
if (otherArgs.length != 2) {
System.err.println("Usage: Data Deduplication <in> <out> ");
System.exit(2);
}
FileSystem fs = FileSystem.get(conf);
Path outPath = new Path(otherArgs[1]);
fs.deleteOnExit(outPath);
Job job = new Job(conf, "CrossRecommendStep1");
job.setJarByClass(CrossRecommendStep1.class);
job.setMapperClass(CrossRecommendStep1Map.class);
job.setReducerClass(CrossRecommendStep1Reduce.class);
//设置输出类型
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
job.setNumReduceTasks(10);
//设置输入及输出文件格式
job.setInputFormatClass(TextInputFormat.class);
job.setOutputFormatClass(TextOutputFormat.class);
//设置输入和输出目录
FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
FileOutputFormat.setOutputPath(job, outPath);
job.waitForCompletion(true);
}
public static class CrossRecommendStep1Map extends Mapper<Object, Text, Text, IntWritable> {
private final static IntWritable one = new IntWritable(1);
@Override
protected void map(Object ke