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算法的结果一致。