2015-12-13 50 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