2015-12-13 65 views
1

我想提取一組交易的關聯規則與下面的代碼火花斯卡拉:協會規則,頻繁模式挖掘

val fpg = new FPGrowth().setMinSupport(minSupport).setNumPartitions(10) 
val model = fpg.run(transactions) 
model.generateAssociationRules(minConfidence).collect() 

但產品數量都超過10K所以提取的規則對所有組合具有計算表現力,我也不需要它們。所以我想只提取成對:

Product 1 ==> Product 2 
Product 1 ==> Product 3 
Product 3 ==> Product 1 

,我不關心其他組合,如:

[Product 1] ==> [Product 2, Product 3] 
[Product 3,Product 1] ==> Product 2 

有沒有辦法做到這一點?

感謝, 阿米爾

+0

順便說一句,我正在做Spark-Scala – Amir

回答

3

假設您的交易看或多或少是這樣的:

val transactions = sc.parallelize(Seq(
    Array("a", "b", "e"), 
    Array("c", "b", "e", "f"), 
    Array("a", "b", "c"), 
    Array("c", "e", "f"), 
    Array("d", "e", "f") 
)) 

你可以嘗試手動生成頻繁項集,直接塗抹AssociationRules

import org.apache.spark.mllib.fpm.AssociationRules 
import org.apache.spark.mllib.fpm.FPGrowth.FreqItemset 

val freqItemsets = transactions 
    .flatMap(xs => 
    (xs.combinations(1) ++ xs.combinations(2)).map(x => (x.toList, 1L)) 
) 
    .reduceByKey(_ + _) 
    .map{case (xs, cnt) => new FreqItemset(xs.toArray, cnt)} 

val ar = new AssociationRules() 
    .setMinConfidence(0.8) 

val results = ar.run(freqItemsets) 

注意事項:

  • 不幸的是,你必須手動處理支持過濾。它可以通過應用過濾器上進行freqItemsets
  • 你應該考慮以前flatMap
  • 增加分區的數量,如果freqItemsets是大要處理,你可以拆分freqItemsets成幾個步驟,以模仿實際的FP-增長:

    1. 產生1圖案和過濾器通過支持
    2. 使用來自步驟1
  • 僅頻繁模式生成2-圖案
+0

謝謝!這非常有幫助。我如何增加分區數量? – Amir

+0

'transactions.repartition(some_number)'。 – zero323