本文首发于我的个人博客QIMING.INFO,转载请带上链接及署名。
FPGrowth(频繁模式增长)是一种关联规则分析算法,本文通过代码演示用spark运行FPGrowth算法的一个小例子。
关联规则简介
举例说明:假如10000个消费者购买了商品,购买尿布1000个,购买啤酒2000个,购买面包500个,同时购买了尿布和啤酒800个,同时购买了尿布和面包100个。
支持度:在所有项集中出现的可能性,即项集同时含有x与y的概率。是第一道门槛,衡量量是多少,可以理解为“出镜率”,一般通过设定最小支持度,过滤掉“出镜率”较低的无意义规则。
如设定最小阈值为5%,尿布和啤酒的支持度为:800/10000=8% ,保留;尿布和面包的支持度为100/10000=1%,剔除。置信度:在X发生的条件下,Y发生的概率。这是第二道门槛,衡量的是“质”,设置最小的置信度筛选可靠的规则。
如设定最小阈值为70%,尿布->啤酒的置信度为:800/1000=80%,保留;啤酒->尿布的置信度为:800/2000=40%,剔除。
运行步骤
数据说明
[xuqm@cu01 mllib]$ cat sample_fpgrowth.txt
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
代码及说明
package nwpuhpc.antirisk.ml
import org.apache.log4j.{Level, Logger}
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.mllib.fpm.FPGrowth
object FPGrowthTest {
def main(args: Array[String]) {
// 0 构建Spark对象
val conf = new SparkConf().setAppName("fpg")
val sc = new SparkContext(conf)
Logger.getRootLogger.setLevel(Level.WARN)
// 1 读取样本数据
val data_path = "/home/hadoop/ML_Data/input/sample_fpgrowth.txt"
val data = sc.textFile(data_path)
val examples = data.map(_.split(" ")).cache()
// 2 建立模型
//设置最小支持度
val minSupport = 0.2
//设置并行分区数
val numPartition = 10
val model = new FPGrowth().
setMinSupport(minSupport).
setNumPartitions(numPartition).
run(examples)
// 3 查看所有的频繁项集,并且列出它出现的次数
println(s"Number of frequent itemsets: ${model.freqItemsets.count()}")
model.freqItemsets.collect().foreach { itemset =>
println(itemset.items.mkString("[", ",", "]") + ", " + itemset.freq)
}
// 4 通过置信度筛选出推荐规则
//antecedent表示前项
//consequent表示后项
//confidence表示规则的置信度
val minConfidence = 0.8
model.generateAssociationRules(minConfidence).collect().foreach(rule=>{
println(rule.antecedent.mkString(",")+"-->"+
rule.consequent.mkString(",")+"-->"+ rule.confidence)
})
//查看规则生成的数量
println(model.generateAssociationRules(minConfidence).collect().length)
}
}
结果展示
频繁项集及次数:
推荐规则: