Spark MLlib 1.6 -- 頻度模式挖掘
挖掘頻繁關聯物品,頻繁關聯物品集,頻繁關聯子序列,或其它子結構是分析海量資料的第一步,並且連續幾年作為資料探勘主要研究方向。此處引用維基中關聯規則學習()作為本章節基礎。spark.mllib 提供並行FP-growth演算法,這個演算法經常用於挖掘頻度物品集。
8.1 FP-growth
FP-growth 演算法描述見論文此處’FP’是頻度模式的縮寫。不同於Apriori類演算法,FP-growth演算法第二步使用字尾樹 (FP-樹)來對交易進行編碼,而不會顯示計算可能的備選集,但這個演算法的缺點在於計算FP-樹演算法耗時太多。但頻度關聯物品集依賴於FP-樹的生成,因此,在spark.mllib
Spark.mllibFP-growth演算法配置以下引數
1) minSupport : 頻度物品滿足的最小支援度,如,某個物品在5次交易中出現3次,則最小支援度為 3 / 5 = 0.6
2)numPartitions: 並行執行的分割槽數
8.1.1 例子
FPGrowth 實現FP-growth演算法。它接收交易集RDD資料結構,此處每個交易是物品的陣列。呼叫FPGrowth.run 方法返回FPGrowthModel 模型,這個模型儲存每個頻度物品集以及頻度。下例展示如何挖掘頻度物品集,和交易資料的關聯規則。
importorg.apache.spark.mllib.fpm.FPGrowth
importorg.apache.spark.rdd.RDD
val data = sc.textFile("data/mllib/sample_fpgrowth.txt")
val transactions:RDD[Array[String]]= data.map(s => s.trim.split(' '))
val fpg =newFPGrowth()
.setMinSupport(0.2)
.setNumPartitions(10)
val model = fpg.run(transactions
model.freqItemsets.collect().foreach { itemset =>
println(itemset.items.mkString("[",",","]")+", "+ itemset.freq)
}
val minConfidence =0.8
model.generateAssociationRules(minConfidence).collect().foreach { rule =>
println(
rule.antecedent.mkString("[",",","]")
+" => "+ rule.consequent .mkString("[",",","]")
+", "+ rule.confidence)
}
完整例子見"examples/src/main/scala/org/apache/spark/examples/mllib/SimpleFPGrowth.scala"
8.2 關聯規則
AssociationRules實現並行規則生成演算法,這個演算法構造的規則,是生成單個物品作為規則的結果。
importorg.apache.spark.mllib.fpm.AssociationRules
importorg.apache.spark.mllib.fpm.FPGrowth.FreqItemset
val freqItemsets = sc.parallelize(Seq(
newFreqItemset(Array("a"),15L),
newFreqItemset(Array("b"),35L),
newFreqItemset(Array("a","b"),12L)
))
val ar =newAssociationRules()
.setMinConfidence(0.8)
val results = ar.run(freqItemsets)
results.collect().foreach { rule =>
println("["+ rule.antecedent.mkString(",")
+"=>"
+ rule.consequent.mkString(",")+"],"+ rule.confidence)
}
完整例子見"examples/src/main/scala/org/apache/spark/examples/mllib/AssociationRulesExample.scala"
8.3 PrefixSpan
Spak.mllib PrefixSpan 需要配置以下引數
1) minSupport : 滿足頻度序列模式的最小支援度
2) maxPatternLength: 頻度序列的最大長度。凡是超過此長度的頻度序列都會被乎略。
3) maxLocalProjDBSize:本地迭代處理投影資料庫(projected database)之前,需要滿足字首投影資料庫(prefix-projecteddatabase)中最大的物品數。
8.3.1 例子
下面例子展示 PrefixSpan 執行的序列結果
<(12)3>
<1(32)(12)>
<(12)5>
<6>
PrefixSpan 實現 PrefixSpan演算法,調動PrefixSpan.run 返回PrefixSpanModel 模型,此模型保留頻度序列及相應頻度.
詳細例子見"examples/src/main/scala/org/apache/spark/examples/mllib/PrefixSpanExample.scala"