spark-30.spark机器学习_3_频繁项集挖掘FPGrowth

1.FPGrowth 基本概念

T*:代表一次购物
项集:项的集合
支持度:项出现的次数或者概率
在这里插入图片描述
FPGrowth的目标是发现有那些项频繁在一起出现。

2.挖掘过程

1.构建FPTree
2.根据数进行递归挖掘【子树没有分叉则停止】

3.构建FPTree

1.根据每一项出现的次数重新排列你的购物集。
2.根据重新排列的购物集构造FPTree。【tree有一个空Root节点】

4.挖掘步骤

  1. 排列项集是根据出现次数从高往低排列,那么挖掘的时候是从低向高开始挖掘。
  2. 先找到当前挖掘项的所有结点,然后顺次找到Root结点,将走过的路径形成一棵子树。
  3. 如果子树中有项的出现次数小于最小支持度,则删除。
  4. 如果子树有分叉,则递归挖掘,否则停止挖掘。
  5. 停止挖掘后,将子树中的所有结点做排列组合【不关心先后顺序】,将排列组合后的所有组合和当前挖掘的项集合并,即得到最终的结果。
  6. 对所有挖掘出来的项集进行排序,选择前集合即可。

5.程序实现

1.创建SparkContext对象。
2.读取数据集,将数据集转换为RDD[Array[String]]
3.训练模型。
4.将频繁项集输出即可。
5.关闭sparkContext。

代码实现:

package com.dengdan

import org.apache.spark.mllib.fpm.FPGrowth
import org.apache.spark.{SparkConf, SparkContext}

object FPGrowth extends App {
  val sc = new SparkContext(new SparkConf().setMaster("local[*]").setAppName("FPGrowth"))
  //加载数据样本
  val path = "D:\\idea_workspace2020\\spark\\sparkMLib\\fpgrowth\\src\\main\\resources\\fpgrowth.txt"
  //创建交易样本
  val transactions = sc.textFile(path).map(_.split(" ")).cache()

  println(s"交易样本的数量为:${transactions.count()}")

  //最小支持度
  val minSupport = 0.4
  //计算的并行度
  val numPartition = 2
  //训练模型
  val model = new FPGrowth()
    .setMinSupport(minSupport)
    .setNumPartitions(numPartition)
    .run(transactions)

  //打印模型结果
  println(s"经常一起购买的物品集的数量为:${model.freqItemsets.count()}")
  model.freqItemsets.collect().foreach { itemset =>
    println(itemset.items.mkString("[", ",", "]") + "," + itemset.freq)
  }

  sc.stop()
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章