与频繁模式挖掘的关联规则

时间:2015-12-13 02:35:02

标签: scala apache-spark apache-spark-mllib

我想使用以下代码Spark-Scala提取一组事务的关联规则:

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

有没有办法做到这一点?

谢谢, 阿米尔

1 个答案:

答案 0 :(得分:4)

假设您的交易看起来或多或少是这样的:

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个模式