代码改变世界

Apriori算法与PFP-Growth算法推演比较

2014-03-31 13:43  Digging4  阅读(1026)  评论(0编辑  收藏  举报

    Apriori算法是机器学习的一个基础算法,用于找出频繁项集,也即为购物篮算法。但是Apriori算法要多次遍历全量数据,效率较低,FP-Growth算法是对Apriori算法的改进(见韩家炜《数据挖掘:概念与技术》),而PFP-Growth算法是对FP-Growth进行了Map-Reduce化,使FP-Growth能够处理海量的数据。

    PFP-Growth算法论文见http://infolab.stanford.edu/~echang/recsys08-69.pdf,该算法的说明如下图

    为验证PFP-Growth算法,使用《数据挖掘:概念与技术》书中例6.1的购物篮数据,进行手工推演,并检验与Apriori算法能否得到同样的结果。

购物篮数据如下,需找出所有的频繁项集(支持度为2):

---------------------------------------

---购物篮-          项目

T100                  I1,I2,I5              

T200                  I2,I4

T300                  I2,I3

T400                  I1,I2,I4

T500                  I1,I3

T600                  I2,I3

T700                  I1,I3

T800                  I1,I2,I3,I5

T900                  I1,I2,I3


步骤1:计算所有购物篮中每个项目出现的次数,并删除出现次数小于支持度的项目(本例中支持度为2)

I2:7, I1:6, I3:6, I4:2, I5:2。 

步骤2:按照项目出现的总次数对每个购物篮中的项目排序(map)

---------------------------------------

---购物篮-          根据项目                         生成Key-value对,

                     出现总次数排序                    即每个项目的上级项路径

T100                  I2,I1,I5                             I5:I2 I1         I1:I2              

T200                  I2,I4                                 I2:I4

T300                  I2,I3                                 I2:I3

T400                  I2,I1,I4                             I4:I2 I1        I1:I2

T500                  I1,I3                                 I1:I3

T600                  I2,I3                                 I2:I3        

T700                  I1,I3                                 I1:I3

T800                  I2,I1,I3,I5                         I5:I2 I1 I3     I3:I2,I1       I1:I2

T900                  I2,I1,I3                             I3:I2,I1         I1:I2   

步骤3:按项目进行汇总,得到每个项目的所有路径(reduce)

I1 : { I2/ I2/ I2/ I2  }                            ---> {(I2:4)}|I1

I2 : {  }                                                --->  { }|I2

I3 : { I2/ I1/ I2/ I2 / I2I1 /I2I1 }          --->  {( I2:4, I1:4, I2I1:2 )}|I3

I4 : { I2/ I2I1 }                                    --->  {( I2:2 )}|I4

I5 : { I2I1/ I2I1I3 }                              --->  {( I2:2, I1:2, I2I1:2 )}|I5

步骤4:得到频繁项集

--集合----------支持度计数--

(I2, I1)               4

(I2, I3)               4

(I1, I3)               4

(I2, I1, I3)          2

(I2, I4)               2

(I2, I5)               2

(I1, I5)               2

(I2,I1, I5)           2


结论:Apriori算法与PFP算法的结果一致。