八、频繁模式挖掘Frequent Pattern Mining
频繁模式挖掘(Frequent Pattern Mining):
频繁项集挖掘是通常是大规模数据分析的第一步,多年以来它都是数据挖掘领域的活跃研究主题。建议用户参考维基百科的association rule learning 了解更多信息。MLlib支持了一个并行的FP-growth,FP-growth是很受欢迎的频繁项集挖掘算法。
FP-growth:
FP-growth算法在论文Han et al., Mining frequent patterns without candidate generation 中有详细论述,其中FP指的是频繁 模式(frequent pattern)。给定一个事务数据集,FP-growth算法的第一步是计算项的频度并标记频繁项。跟Apriori这类挖掘频繁 项集算法不同的是,FP-growth的第二步使用了一个FP-tree结构来编码事务。第二部之后,频繁项集可以直接从FP-tree中提取。在 MLlib中,我们实现了一个FP-growth的并行版本(PFP),具体方法参见论文Li et al., PFP: Parallel FP-growth for query recommendation。
MLlib中FP-growth实现的参数:
minSupport: 最小支持度。用浮点数表示比例。例如某项在5个事务中出现3次,其支持度为3/5=0.6。
numPartitions: 计算的分区数量。
import java.util.Arrays; import java.util.List; import org.apache.spark.api.java.JavaRDD; import org.apache.spark.api.java.JavaSparkContext; import org.apache.spark.mllib.fpm.AssociationRules; import org.apache.spark.mllib.fpm.FPGrowth; import org.apache.spark.mllib.fpm.FPGrowthModel; JavaRDD<String> data = sc.textFile("data/mllib/sample_fpgrowth.txt"); JavaRDD<List<String>> transactions = data.map( new Function<String, List<String>>() { public List<String> call(String line) { String[] parts = line.split(" "); return Arrays.asList(parts); } }); FPGrowth fpg = new FPGrowth() .setMinSupport(0.2) .setNumPartitions(10); FPGrowthModel<String> model = fpg.run(transactions); for (FPGrowth.FreqItemset<String> itemset: model.freqItemsets().toJavaRDD().collect()) { System.out.println("[" + itemset.javaItems() + "], " + itemset.freq()); } double minConfidence = 0.8; for (AssociationRules.Rule<String> rule : model.generateAssociationRules(minConfidence).toJavaRDD().collect()) { System.out.println( rule.javaAntecedent() + " => " + rule.javaConsequent() + ", " + rule.confidence()); }
关联规则挖掘(Association Rule):
关联规则实现了一个并行的规则生成算法构建的规则,有一个单一的项目所产生的。
import java.util.Arrays; import org.apache.spark.api.java.JavaRDD; import org.apache.spark.api.java.JavaSparkContext; import org.apache.spark.mllib.fpm.AssociationRules; import org.apache.spark.mllib.fpm.FPGrowth; import org.apache.spark.mllib.fpm.FPGrowth.FreqItemset; JavaRDD<FPGrowth.FreqItemset<String>> freqItemsets = sc.parallelize(Arrays.asList( new FreqItemset<String>(new String[] {"a"}, 15L), new FreqItemset<String>(new String[] {"b"}, 35L), new FreqItemset<String>(new String[] {"a", "b"}, 12L) )); AssociationRules arules = new AssociationRules() .setMinConfidence(0.8);JavaRDD<AssociationRules.Rule<String>> results = arules.run(freqItemsets); for (AssociationRules.Rule<String> rule : results.collect()) { System.out.println( rule.javaAntecedent() + " => " + rule.javaConsequent() + ", " + rule.confidence()); }
序列模式分析算法(PrefixSpan):
主要是一个序列模式挖掘算法在裴等人描述,通过模式增长挖掘序列模式的改进方法:我们请读者去参考文化序列模式挖掘问题。
spark.PrefixSpan下列参数:
minSupport
:需考虑的最小支持度的频繁序列模式maxPatternLength
: 最大 长度 的 飞行 常客 英里 sequential pattern.Any 飞行 常客 英里 pattern 超过 这个 长度 不会 都 包括 在 results.maxLocalProjDBSize
:在一个前缀映射数据库之前的投影数据库局部迭代处理允许的最大项目数量开始。这个参数应该尊重你的遗嘱执行人的大小调整。import java.util.Arrays; import java.util.List; import org.apache.spark.mllib.fpm.PrefixSpan; import org.apache.spark.mllib.fpm.PrefixSpanModel; JavaRDD<List<List<Integer>>> sequences = sc.parallelize(Arrays.asList( Arrays.asList(Arrays.asList(1, 2), Arrays.asList(3)), Arrays.asList(Arrays.asList(1), Arrays.asList(3, 2), Arrays.asList(1, 2)), Arrays.asList(Arrays.asList(1, 2), Arrays.asList(5)), Arrays.asList(Arrays.asList(6))), 2);PrefixSpan prefixSpan = new PrefixSpan() .setMinSupport(0.5) .setMaxPatternLength(5); PrefixSpanModel<Integer> model = prefixSpan.run(sequences); for (PrefixSpan.FreqSequence<Integer> freqSeq: model.freqSequences().toJavaRDD().collect()) { System.out.println(freqSeq.javaSequence() + ", " + freqSeq.freq()); }