关联规则与频繁模式挖掘
Association rules with Frequent Pattern Mining
我想使用以下代码 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
有什么办法吗?
谢谢,
阿米尔
假设您的交易大致如下所示:
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 模式
我想使用以下代码 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
有什么办法吗?
谢谢, 阿米尔
假设您的交易大致如下所示:
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 模式