1. 程式人生 > >Spark MLlib 1.6 -- 頻度模式挖掘

Spark MLlib 1.6 -- 頻度模式挖掘

挖掘頻繁關聯物品,頻繁關聯物品集,頻繁關聯子序列,或其它子結構是分析海量資料的第一步,並且連續幾年作為資料探勘主要研究方向。此處引用維基中關聯規則學習()作為本章節基礎。spark.mllib 提供並行FP-growth演算法,這個演算法經常用於挖掘頻度物品集。

8.1 FP-growth

FP-growth 演算法描述見論文此處’FP’是頻度模式的縮寫。不同於Apriori類演算法,FP-growth演算法第二步使用字尾樹 (FP-)來對交易進行編碼,而不會顯示計算可能的備選集,但這個演算法的缺點在於計算FP-樹演算法耗時太多。但頻度關聯物品集依賴於FP-樹的生成,因此,在spark.mllib

中,我們實現了並行FP-growth演算法,稱為PFP,詳見論文(PFPFP-tree生成演算法並行分發到多臺主機上執行,每臺主機使用獨立的交易集來計算。

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"