大数据进阶必修课!Spark实战关联规则挖掘算法

9.SparkMLlib关联规则挖掘算法

9.1关联规则算法

研究规则挖掘算法的目的是发下商品交易数据库中不同类型商品之间的潜在联系,找出客户在购买商品时的行为模式。例如客户购买了某个产品,会对客户购买其他产品产生何种影响,通过分析诸如此类的结果,可以应用到实际的商业规划中,比如超市商品货架的分布排放、商品库存的计划以及如何跟客户的购买习惯对客户进行分类从而进行有针对的精准营销。
在MLlib中,主要实现了FP-Tree关联规则算法,这种方法基于Apriori算法,对频繁项集数据进行挖掘,优点是效率和鲁棒性上有很大的提高。通过一个简单的例子介绍关联规则算法—啤酒和尿布:上世纪沃尔玛超市销售人员发现在某些日子,啤酒和尿布这两样表面看起来毫无关联的东西出现在同一份购物清单上,经调查发现是,有些日子是父亲外出工作回家前会去超市购买婴儿用品,同时也会购买啤酒之类的产品,于是根据此发现,超市将啤酒鱼尿布放的尽可能远,在中间的通道上摆放吸引这些年轻父亲的产品,促进购买。在这里项就是指的一个个物品,项集就是所有物品中某几项组成的集合,在本教程中是两两组合。
据此案例,Apriori算法是一种挖掘关联规则的频繁项集算法,核心思想是通过候选集生成和情节的向下封闭检测两个阶段来挖掘频繁项集。其过程是计算一份购物清单中所有商品中每两件商品同时出现的次数,从而可以算出两件商品同时出现的概率即支持度,也可以算出其中一件商品出现时另一件商品出现的概率即置信度。然后根据计算结果,跑去数据支持个数过少的物品项。重新相互组合商品开始下一轮的计算,属于候选消除算法。
MLlib中支持的FP-growth频繁模式增长算法,将提供频繁项集的数据库压缩到FP树即频繁模式树,保留物品集合的关联信息。可以解决多次扫描数据库带来的大量小频繁项集的问题,在理论上只对数据库进行两次扫描,直接压缩数据库生成一个频繁模式树从而生成关联规则。主要分以下两步骤完成:

(1)利用数据库中已有样本数据建立FP树;

(2)建立频繁项集规则。

9.2算法源码分析

MLlib中是使用并行FPGrowth算法挖掘频繁项集的方法完成FPGrowth关联规则的挖掘,分为频繁项的挖掘和频繁项集的挖掘:

(1)class FPGrowth:含有run方法基于FPGrowth算法计算频繁项集,需要设置的参数为:

  • minSupport——频繁模式的最小支持度,默认为0.3;
  • numPartitions——分区数,应用于FPGrowth并行计算,默认为输入的样本数据的分区数

(2)频繁项集挖掘:
genFreqItems:频繁项计算;genFreqItemsets:频繁项集计算;

(3)FPTree类:
Add方法:树增加;
Merge:树合并;
Project:取后缀树;
GetTransactions:取节点下的所有事务;
Extract:提取频繁项集

(4)FPGrowthModel:FPGrowth模型
FreqItemsets:频繁项集,格式为RDD(freqItemset)

9.3应用实战

9.3.1 数据说明

数据集为用英文小写字母代表的物品组成的购物清单,如下所示:

r z h k p
z y x w v u t s
s x o n r
x z y m t s q e
z
x z y r q t p

每个字母代表一个物品

9.3.2代码详解

//导入需要的机器学习包和相关基础包
import org.apache.log4j.{ Level, Logger }
import org.apache.spark.{ SparkConf, SparkContext }
import org.apache.spark.rdd.RDD
import org.apache.spark.mllib.fpm.{ FPGrowth, FPGrowthModel }

//构建Spark对象
val conf = new SparkConf().setAppName("fpg")
val sc = new SparkContext(conf)
Logger.getRootLogger.setLevel(Level.WARN)

//读取样本数据
val data_path = "/mnt/hgfs/thunder-download/MLlib_rep/
data/sample_fpgrowth.txt"
val data = sc.textFile(data_path)
val examples = data.map(_.split(" ")).cache()

//建立模型
val minSupport = 0.2
val numPartition = 10
val model = new FPGrowth().
	  setMinSupport(minSupport).
      setNumPartitions(numPartition).
      run(examples)

//打印结果
println(s"Number of frequent itemsets: ${model.freqItemsets.count()}")
      model.freqItemsets.collect().foreach { itemset =>
      println(itemset.items.mkString("[", ",", "]") + ", " + itemset.freq)
}

最后输出关联规则:

[z], 5
[x], 4
[x,z], 3
[y], 3
[y,x], 3
[y,x,z], 3
[y,z], 3
[r], 3
[r,x], 2
[r,z], 2
……
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值