1.FPGrowth 基本概念
T*:代表一次購物
項集:項的集合
支持度:項出現的次數或者概率
FPGrowth的目標是發現有那些項頻繁在一起出現。
2.挖掘過程
1.構建FPTree
2.根據數進行遞歸挖掘【子樹沒有分叉則停止】
3.構建FPTree
1.根據每一項出現的次數重新排列你的購物集。
2.根據重新排列的購物集構造FPTree。【tree有一個空Root節點】
4.挖掘步驟
- 排列項集是根據出現次數從高往低排列,那麼挖掘的時候是從低向高開始挖掘。
- 先找到當前挖掘項的所有結點,然後順次找到Root結點,將走過的路徑形成一棵子樹。
- 如果子樹中有項的出現次數小於最小支持度,則刪除。
- 如果子樹有分叉,則遞歸挖掘,否則停止挖掘。
- 停止挖掘後,將子樹中的所有結點做排列組合【不關心先後順序】,將排列組合後的所有組合和當前挖掘的項集合並,即得到最終的結果。
- 對所有挖掘出來的項集進行排序,選擇前集合即可。
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()
}