MLlib的关联算法FPgrowth(与APriori比较)

来源:互联网 发布:结构化面试 知乎 编辑:程序博客网 时间:2024/03/28 18:06

1,

频繁项集挖掘是一个关联式规则挖掘问题。关联挖掘是数据挖掘中研究最早也是最活跃的领域,其中频繁模式的挖掘是关联挖掘的核心和基础,是产生关联规则挖掘的基础。频繁项集最经典的应用就是超市的购物篮分析。

2,

频繁项:在多个集合中,频繁出现的元素项。

频繁项集:在一系列集合中每项都含有某些相同的元素,这些元素形成一个子集,满足一定阀值就是频繁项集。

K项集:K个频繁项组成的一个集合。

支持度:包含频繁项集(F)的集合的数目。

可信度:频繁项与某项的并集的支持度与频繁项集支持度的比值。


简 单来说。频繁项集的挖掘就是将数据集(一般是多行数据,每行数据的第一个元素的交易编号,后面的是物品编号)中出现频率超过支持度的频繁项找出来,而首先 找出的单个频繁项的集合就是1-频繁项集。而2-频繁项就是某两个频繁项都同时出现在一行中并且出现频率超过支持度的,那么2-频繁项集就是这些2-频繁 项的集合,依次类推,K-频繁项集就是K-频繁项的集合。目前针对频繁项集的算法,主要有Apriori,FP-Growth和Eclat算法。

3,

FP树的结构和建数过程:

假设最小支持度是40%,那么b e j c的支持度就是50%,a是67%。过滤掉非频繁项集后即如上表中最后一列。并使这些元素按照出现的次序排序。


这一步其实就是预处理,减少需要计算的频繁项集的候选集,排序的目的是频繁项集关注的是组合而不是排列,在后面生成树的时候需要避免生成重复不必要的分支。


然后遍历过滤后的候选集和出现的次序,构建FP-tree如下:

发现频繁项集的过程和Apriori一样,也是逐步递增的发现,即先找到1频繁项集,然后再在1频繁项集的基础上找2频繁项集。基于上面的FP-tree树,也就是支持度大于百分之40的所有元素,在找2频繁项集时,需要先抽取条件模式基(以每个频繁项为结尾的,在FP树中所有的前缀路径)


然后对上图的频繁项集元素,用它的条件模式基建立FP树,再找2频繁项集。


建树的过程和上面是一样的,然后再得到2频繁项集。依次类推,挖掘K频繁项集只需要在K-1频繁项集上挖掘,重复上面的过程即可。


 从 这里就可以发现一旦建立了FP树之后就可以不断递归挖掘K频繁项集,对于Hadoop就会产生多次IO操作,严重影响程序运行效率,而Spark这种弹性 式内存计算框架可以试中间输出和结果保存在内存中,不需要重复读写HDFS,所以Spark能更好地适用于数据挖掘需要递归的Map-Reduce算法。


4,

在spark中:


分析大规模数据集的第一个步骤通常是挖掘频繁项目,项目集,亚序列或其他子结构,这在数据挖掘中作为一个活跃的研究主题已经很多年了。

MLlib提供了频繁模糊挖掘的并行实现---FP-growth算法。

FP-growth

给定一个交易数据集,FP-growth的第一步骤是计算项目的频率,并确定频繁项目。

FP-growth虽然与Apriori类算法有相同的设计,但是FP-growth的第二步使用后缀树(FP树)结构对交易数据编码且不会显示生成候选集(生成的候选集通常开销非常大)。

第二步之后,就可以从FP-growth的工作分发到其他机器,比单机运行有更好的效果


FP-Growth有以下参数:

minSupport:项目集被确定为频繁的最小数量

numPartition:分发任务的数量


代码如下:

  1. package test

  1. import org.apache.spark.mllib.fpm.FPGrowth
  1. import org.apache.spark.{SparkConf, SparkContext}

  1. /**
  1.   * Created by zengxiaosen on 16/6/13.
  1.   */
  1. object FP_growth_test {
  1.   def main(args: Array[String]) {

  1.     val conf=new SparkConf()
  1.     conf.setMaster("local")
  1.     conf.setAppName("FP_growth")
  1.     val sc=new SparkContext(conf)
  1.     //数据格式是:物品1,物品2,物品3
  1.     val data_path="/Users/zengxiaosen/test/item.txt"
  1.     val data=sc.textFile(data_path)
  1.     val examples=data.map(_.split(" ")).cache()

  1.     //建立模型
  1.     val minSupport=0.7
  1.     val numPartition=10
  1.     val model=new FPGrowth()
  1.       .setMinSupport(minSupport)
  1.       .setNumPartitions(numPartition)
  1.       .run(examples)

  1.     //打印结果


  1.     model.freqItemsets.collect().foreach { itemset =>

  1.       println(itemset.items.mkString("[", ",","]") + ", " + itemset.freq)
  1.     }


  1.   }

  1. }



结果如下:

16/06/13 15:44:08 INFO TaskSetManager: Finished task 9.0 in stage 4.0 (TID 22) in 3 ms on localhost (10/10)

16/06/13 15:44:08 INFO DAGScheduler: ResultStage 4 (collect at FP_growth_test.scala:32) finished in 0.047 s

16/06/13 15:44:08 INFO TaskSchedulerImpl: Removed TaskSet 4.0, whose tasks have all completed, from pool 

16/06/13 15:44:08 INFO DAGScheduler: Job 2 finished: collect at FP_growth_test.scala:32, took 0.089328 s

[x], 3

[z], 3

[s], 3

[s,x], 3

16/06/13 15:44:08 INFO SparkContext: Invoking stop() from shutdown hook

16/06/13 15:44:08 INFO SparkUI: Stopped Spark web UI at http://192.168.201.114:4040

16/06/13 15:44:08 INFO MapOutputTrackerMasterEndpoint: MapOutputTrackerMasterEndpoint stopped!

16/06/13 15:44:08 INFO MemoryStore: MemoryStore cleared

16/06/13 15:44:08 INFO BlockManager: BlockManager stopped

16/06/13 15:44:08 INFO BlockManagerMaster: BlockManagerMaster stopped

16/06/13 15:44:08 INFO OutputCommitCoordinator$OutputCommitCoordinatorEndpoint: OutputCommitCoordinator stopped!

16/06/13 15:44:08 INFO SparkContext: Successfully stopped SparkContext

16/06/13 15:44:08 INFO ShutdownHookManager: Shutdown hook called

16/06/13 15:44:08 INFO ShutdownHookManager: Deleting directory /private/var/folders/8f/z66_0clj43s9sq2207bd78jw0000gn/T/spark-c824ae29-d0c5-4f56-97bc-58e1f915f0cf


Process finished with exit code 0






0 0