Mapreduce之购物篮分析

Mapreduce之购物篮分析

购物篮分析是一个流行的数据挖掘技术,在市场营销中这个技术可以揭示不同商品或商品组之间的相似度

MBA原理

通过MapReduce框架,设计相关的解决方案生成交易的关联规则,从而查找最常见的商品对

应用领域

  • 信用卡交易分析
  • 电话呼叫模式分析
  • 欺诈识别
  • 电信服务交易分析
  • 大型在线零售商的每日/每周交易分析

样例输入

crackers,bread,banana
crackers,coke,butter,coffee
crackers,bread
crackers,bread
crackers,bread
crackers,bread,coffee
butter,coke
butter,coke,bread,crackers

样例输出

在这里插入图片描述

mapper阶段任务

maper阶段的map()函数根据购物篮子中的商品生成如下键-值对
[<crackers,icecream>,1]
[<crackers,coke.,1]
但是在程序自动分类过程中会和出现如下现象
购物篮T1:crackers,icecream,coke
购物篮T2:icecream,coke,crackers
根据关联规则,对于T1会生成如下规则
[(crackers,icecream),1]
[(crackers,coke),1]
[(icecream,coke),1]
对于T2则会生成如下规则
[(icecream,coke),1]
[(icecream,crackers),1]
[(coke,crackers),1]
从中我们可以看到,有六对规则,但是我们发现(crackers,icecream)和(icecream,crackers)是一样的,在这里会被分成不同的规则,所以在生成规则之前需要对商品按照字母顺序进行排序,就可以避免这个问题

mapper阶段编码

在这个过程中使用快速排序算法对商品进行排序

package com.deng.MBA;
import java.io.IOException;
import java.util.List;
import java.util.ArrayList;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

public class MBAMapper extends Mapper<LongWritable,Text,Text,IntWritable>{
	int numberOfPairs;
    public static final int DEFAULT_NUMBER_OF_PAIRS=2;
    protected void setup(Context context) throws IOException,InterruptedException{
        this.numberOfPairs=context.getConfiguration().getInt("number.of.pairs",DEFAULT_NUMBER_OF_PAIRS);
    }
    public void map(LongWritable key,Text value,Context context) throws IOException,InterruptedException{
        String line=value.toString();
        List<String> items=convertItems(line);
        if((items==null)||items.isEmpty()){
            return ;
        }
        generateMapperOutput(numberOfPairs,items,context);
    }

    private static List<String> convertItems(String line){
        if((line==null)||line.length()==0){
            return null;
        }
        String[] tokens=line.split(",");
        if((tokens==null)||(tokens.length==0)){
            return null;
        }
        List<String> items=new ArrayList<String>();
        for(String token:tokens){
            if(token!=null){
                items.add(token.trim());
            }
        }
        return items;
    }
    private void generateMapperOutput(int numberOfPairs, List<String> items, Context context)
            throws IOException, InterruptedException{
        List<List<String>> sortedCombinations =Combination.findSortedCombinations(items,numberOfPairs);
        for(List<String> itemsList: sortedCombinations){
            context.write(new Text(itemsList.toString()),new IntWritable(1));
        }
    }
}

其中combinations是一个简单的工具,使用Combinations.generateCombinations(s1,s2,…,sn)方法可以生成给定的集合,如下所示
假设购物篮为{a,b,c}
假设生成具有两个商品的规则,则分类结果如下所示
[a,b],[a,c],[b,c]

Combination编码

package com.deng.MBA;

import java.util.List;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;

public class Combination {
   public static <T extends Comparable<? super T>> List<List<T>>
    findSortedCombinations(Collection<T> elements,int n){
       List<List<T>> result =new ArrayList<List<T>>();
       if(n==0){
           result.add(new ArrayList<T>());
           return result;
       }
       List<List<T>> combinations=findSortedCombinations(elements,n-1);
       for(List<T> combination:combinations){
           for(T element:elements){
               if(combination.contains(element)){
                   continue;
               }
               List<T> list=new ArrayList<T>();
               list.addAll(combination);

               if(list.contains(element)){
                   continue;
               }

               list.add(element);
               Collections.sort(list);
               if(result.contains(list)){
                   continue;
               }
               result.add(list);
           }
       }
       return result;
   }
    public static void main(String[] args) {
        List<String> elements = Arrays.asList("a", "b", "c", "d", "e");
        List<List<String>> combinations = findSortedCombinations(elements, 2);
        System.out.println(combinations);
    }
}

reduce阶段任务

这个阶段就是对规则的支持度进行统计

reduce阶段编码

package com.deng.MBA;
import java.io.IOException;
import java.io.WriteAbortedException;

import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.mapreduce.Reducer;

public class MBAReduce extends Reducer<Text,IntWritable,Text,IntWritable> {
    public void reduce(Text key,Iterable<IntWritable> values,Context context)
        throws IOException,InterruptedException{
        int sum=0;
        for(IntWritable value:values){
            sum+=value.get();
        }
        context.write(key,new IntWritable(sum));
    }
}

完整代码

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
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.output.FileOutputFormat;

import java.io.IOException;
import java.util.*;

public class MBADriver  {
    public static class Combination {
        public static <T extends Comparable<? super T>> List<List<T>>
        findSortedCombinations(Collection<T> elements, int n){
            List<List<T>> result =new ArrayList<List<T>>();
            if(n==0){
                result.add(new ArrayList<T>());
                return result;
            }
            List<List<T>> combinations=findSortedCombinations(elements,n-1);
            for(List<T> combination:combinations){
                for(T element:elements){
                    if(combination.contains(element)){
                        continue;
                    }
                    List<T> list=new ArrayList<T>();
                    list.addAll(combination);

                    if(list.contains(element)){
                        continue;
                    }

                    list.add(element);
                    Collections.sort(list);
                    if(result.contains(list)){
                        continue;
                    }
                    result.add(list);
                }
            }
            return result;
        }
    }

    public static class MBAMapper extends Mapper<LongWritable,Text,Text,IntWritable> {
        int numberOfPairs;
    	public static final int DEFAULT_NUMBER_OF_PAIRS=2;
    	protected void setup(Context context) throws IOException,InterruptedException{
        	this.numberOfPairs=context.getConfiguration().getInt("number.of.pairs",DEFAULT_NUMBER_OF_PAIRS);
    	}
        public void map(LongWritable key,Text value,Context context) throws IOException,InterruptedException{
            String line=value.toString();
            List<String> items=convertItems(line);
            if((items==null)||items.isEmpty()){
                return ;
            }
            generateMapperOutput(numberOfPairs,items,context);
        }

        private static List<String> convertItems(String line){
            if((line==null)||line.length()==0){
                return null;
            }
            String[] tokens=line.split(",");
            if((tokens==null)||(tokens.length==0)){
                return null;
            }
            List<String> items=new ArrayList<String>();
            for(String token:tokens){
                if(token!=null){
                    items.add(token.trim());
                }
            }
            return items;
        }
        private void generateMapperOutput(int numberOfPairs, List<String> items, Context context)
                throws IOException, InterruptedException{
            List<List<String>> sortedCombinations = com.deng.MBA.Combination.findSortedCombinations(items,numberOfPairs);
            for(List<String> itemsList: sortedCombinations){
                context.write(new Text(itemsList.toString()),new IntWritable(1));
            }
        }
    }

    public static class MBAReduce extends Reducer<Text,IntWritable,Text,IntWritable> {
        public void reduce(Text key,Iterable<IntWritable> values,Context context)
                throws IOException,InterruptedException{
            int sum=0;
            for(IntWritable value:values){
                sum+=value.get();
            }
            context.write(key,new IntWritable(sum));
        }
    }
   public static void main(String[] args) throws Exception{
        FileUtil.deleteDirs("output");
        Configuration conf=new Configuration();
        String[] otherArgs=new String[]{"input/MBA","output","3"};
        if(otherArgs.length!=3){
            System.out.println("参数错误");
        }
        Job job=new Job(conf,"MBA");
        job.getConfiguration().setInt("number.of.pairs",Integer.parseInt(otherArgs[2]));
        FileInputFormat.addInputPath(job,new Path(otherArgs[0]));
        FileOutputFormat.setOutputPath(job,new Path(otherArgs[1]));
        job.setJarByClass(MBADriver.class);
        job.setMapperClass(MBAMapper.class);
        job.setReducerClass(MBAReduce.class);
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(IntWritable.class);
        job.setOutputValueClass(Text.class);
        job.setOutputKeyClass(IntWritable.class);
        job.setCombinerClass(MBAReduce.class);
        System.exit(job.waitForCompletion(true)?0:1);
    }
}

写在最后

代码是个很神奇的东西,多看看别人优秀的代码才能提升自己的代码风格

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据分析·原理与实践 11、大数据分析算法数据分析算法全文共29页,当前为第1页。 目录 概述 关联规则挖掘算法 分类算法 聚类算法 1 2 3 4 大数据分析算法全文共29页,当前为第2页。 目录 概述 关联规则挖掘算法 分类算法 聚类算法 1 2 3 4 大数据分析算法全文共29页,当前为第3页。 概述 大数据分析算法的分类 实时分析算法 实时获取数据,响应时间要求为秒级甚至毫秒级。 弱实时分析算法 面向有用户参与的分析任务,响应时间要求为分钟到小时。 非实时分析算法 处理数据仓库中的大规模数据,响应时间比较宽松,可以达到天甚至月。 按实时性的要求分类 大数据分析算法全文共29页,当前为第4页。 概述 应用实例 一些分析任务必须实时处理 在工业生产过程中,一些分析任务必须实时处理,例如生产线上的产品错误的实时发现和纠正、设备故障的实时监测和修理。 获取实时数据 这些任务需要使用生产线的实时数据,只有这样,使用的数据才能体现出产品或者设备的当前状态。 实时分析算法数据分析算法全文共29页,当前为第5页。 概述 应用实例 与用户交互 工业企业的一些分析任务需要和管理者交互完成,例如库存优化等。 时间约束 这些任务的实时性不强,但参与者不可能等太久。此外,太长时间也会导数数据的参考价值降低。 弱实时分析算法数据分析算法全文共29页,当前为第6页。 概述 应用实例 长期决策 一些工业大数据分析任务涉及长期决策,为了做出正确的决策,需要尽可能全面地使用大规模历史数据,例如工艺优化。 准确性更为重要 这些分析的结果对于企业的生产和经营有着较重要的影响,相对于计算时间,分析的准确性更加重要。 非实时分析算法 红土镍矿全元素分解工艺流程图 大数据分析算法全文共29页,当前为第7页。 概述 大数据分析算法的设计技术 什么是随机算法 随机算法是使用了随机函数的算法,且随机函数的返回值直接或者简介地影响了算法的执行流程或执行结果。 只分析少部分数据 利用随机算法,我们可以用少部分数据分析结果实现对整体数据分析结果的估计。 随机算法数据分析算法全文共29页,当前为第8页。 概述 大数据分析算法的设计技术 什么是外存算法 外存算法指的是在算法执行过程中用到外存的算法。 为什么要使用外存 在很多情况下,由于内存的限制,大数据必须存储在外存中。在一些情况下,大数据分析过程中的中间结果无法放到内存中,而必须使用外存。 外存算法数据分析算法全文共29页,当前为第9页。 概述 大数据分析算法的设计技术 什么是并行算法 并行算法是指用多台处理器联合求解问题的算法MapReduce算法是比较典型的数据密集型并行算法。 并行算法 MapReduce体系结构 大数据分析算法全文共29页,当前为第10页。 概述 大数据分析算法的设计技术 什么是Anytime算法 Anytime算法,也称"任意时间算法"。在Anytime算法结束前,终止其执行,我们也能得到一个合法的结果。 这类算法跑的时间越久,返回的结果越准确。 Anytime算法 为什么需要Anytime算法 由于大数据规模很大,计算资源和时间约束不足以对数据进行精确分析,这就需要根据结果质量要求调配资源或者根据资源自适应调整结果质量。如在线聚集算法。 大数据分析算法全文共29页,当前为第11页。 目录 概述 关联规则挖掘算法 分类算法 聚类算法 1 2 3 4 大数据分析算法全文共29页,当前为第12页。 关联规则挖掘算法 频繁模式挖掘 频繁模式挖掘 一个经典的案例是购物篮分析分析顾客的购物习惯。比如,顾客购买了牛奶,有多大可能也购买面包?将二者放在一起,是否会增加二者的销量。 在医疗方面,患者患有某种疾病后,患其他一些疾病的概率会增大。通过对疾病的频繁模式进行挖掘,有助于医生为患者设计治疗方案。 频繁模式 频繁模式时指频繁出现在数据集中的模式。 频繁模式挖掘 大数据分析算法全文共29页,当前为第13页。 关联规则挖掘算法 Apriori算法 问题 寻找频繁项集,即满足给定的最小支持度的项集。 支持度 在数据库 中支持度是 中事务同时包含 、 的百分比。 如"A C"的支持度为0.4。 要解决的问题 交易数据库D 事务编号 商品 10 A, C, D 20 B, C, E 30 A, B, C, E 40 B, E 大数据分析算法全文共29页,当前为第14页。 关联规则挖掘算法 Apriori算法 暴力搜索? 一个简单的想法是使用枚举的出所有D中的子集,然后分别计算它们的支持度。但这计算量是极大的。 Apriori的思想 从小到大,逐层搜索。 算法思想 交易数据库D 事务编号 商品 10 A, C, D 20 B, C, E 30 A, B, C, E 40 B, E 大数据分析

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值