Spark MLlib FPGrowth关联规则算法实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_41455420/article/details/89532574

一、基本概念

1、项与项集

这是一个集合概念,在一个篮子商品中的一件消费品即一项(iten),若干项的集合为项集,如{啤酒,尿布}构成一个二元项集。

2、关联规则

关联规则用于表示数据内隐含的关联性,一般记X为先决条件、Y为相应的关联结果。
关联性强度由支持度、置信度、提升度来控制和评价。
举个栗子:有10000个消费者购买了商品,其中购买尿布的有1000人,购买啤酒2000人,购买面包500人,同时购买尿布和啤酒有800人,同事购买尿布和面包100人。

3、支持度

支持度是指在所有项集中{X,Y}出现的可能性,即项集中同时含有X和Y的概率:该指标作为建立强关联规则的第一个门槛,衡量了所考察关联规则在量上的多少。通过设定最小的阈值(minsup),剔除出镜率较低的无意义规则,保留出现较频繁的项集所隐含的规则。

设定最小阈值5%,由于{尿布,啤酒}支持度为800/10000=8%,满足最小阈值要求成为频繁项集,保留规则;{尿布,面包}支持度为100/10000=1%,则被剔除。

4、置信度

置信度表示在先决条件X发生的条件下Y发生的概率:这是生成强关联规则的第二个门槛,衡量了所考察的关联规则在“质”上的可靠性。相似的对置信度设定最小阈值(mincon)来实现进一步筛选。

当设置置信度最小阈值70%时,例如{尿布,啤酒}中,购买尿布时会购买啤酒置信度为800/1000=80%,保留规则;购买啤酒是会购买尿布置信度为800/2000=40%,则被剔除。

5、提升度

提升度表示在含有X的条件下同时含有Y的可能性与没有X这个条件下项集中含有Y的可能性之比:公式为置信度/支持度。该指标与置信度同样衡量规则的可靠性,可看作是置信度的一种互补指标。

二、FPGrowth算法

FPGrowth(频繁模式增长)算法是韩嘉炜在2000年提出的关联分析算法,他采用如下分治策略:将提供频繁项集的数据库压缩到一颗频繁树(FP树),但仍保留项集关联信息。该算法和Apriori算法最大的不同有两点:不产生候选集,只需要遍历2遍数据库。

1、构造FP树

扫描数据库D一次。收集频繁项的集合F和他们的支持度。对F按支持度降序排序,结果为频繁项表L。
创建FP树根节点,以null标记它。对于D中的每个事物Trans执行:选择Trans中的频繁项,并按L中次序排序。设排序后的频繁表为[p|P],其中p是第一个元素,而P是剩余元素的表。调用insert_tree([p|P],T)。该过程执行如下:如果T有子节点N使得N.item-name=p.item-name,则N的计数增加1;否则创建一个新节点N将其计数设置为1,链接到它的父节点T,并且通过节点的链结构将其链接到具有相同的item-name的节点中。如果P非空,则递归调用insert_tree(P,N)。

2、FP树的挖掘

通过调用FP_growth(FP_tree,null)实现,具体过程可以参考伪代码

三、训练数据

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

四、实战代码

import org.apache.log4j.{Level, Logger}
import org.apache.spark.mllib.fpm.{FPGrowth, FPGrowthModel}
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

object Fpg {

  def main(args: Array[String]): Unit = {
    //1.构建spark对象
    val conf: SparkConf = new SparkConf().setAppName("fpg").setMaster("local[2]")
    val sc = new SparkContext(conf)
    Logger.getRootLogger.setLevel(Level.WARN)

    //2.读取数据
    val data_path = "hdfs://node-1:9000/spark_data/sample_fpgrowth.txt"
    val data: RDD[String] = sc.textFile(data_path)
    val examples: RDD[Array[String]] = data.map(_.split(" ")).cache()

    //3.建立模型
    val minSupport = 0.2
    val numPartition = 10
    val model: FPGrowthModel[String] = new FPGrowth().setMinSupport(minSupport).setNumPartitions(numPartition).run(examples)

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

    sc.stop()
  }
}

五、运行结果

关联规则:

Number of frequent itemsets:54
[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
[s],3
[s,y],2
[s,y,x],2
[s,y,x,z],2
[s,y,z],2
[s,x],3
[s,x,z],2
[s,z],2
[t],3
[t,y],3
[t,y,x],3
[t,y,x,z],3
[t,y,z],3
[t,s],2
[t,s,y],2
[t,s,y,x],2
[t,s,y,x,z],2
[t,s,y,z],2
[t,s,x],2
[t,s,x,z],2
[t,s,z],2
[t,x],3
[t,x,z],3
[t,z],3
[p],2
[p,r],2
[p,r,z],2
[p,z],2
[q],2
[q,y],2
[q,y,x],2
[q,y,x,z],2
[q,y,z],2
[q,t],2
[q,t,y],2
[q,t,y,x],2
[q,t,y,x,z],2
[q,t,y,z],2
[q,t,x],2
[q,t,x,z],2
[q,t,z],2
[q,x],2
[q,x,z],2
[q,z],2

Process finished with exit code 0

喜欢就点赞评论+关注吧

在这里插入图片描述

感谢阅读,希望能帮助到大家,谢谢大家的支持!

展开阅读全文

没有更多推荐了,返回首页