欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-14 21:54:48
...

1.FPGrowth 基本概念

T*:代表一次购物
项集:项的集合
支持度:项出现的次数或者概率
spark-30.spark机器学习_3_频繁项集挖掘FPGrowth
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()
}