接着前面的博客Frequent Pattern之四继续分析。
结果聚合
请看伪码如下:
这个mapreduce实际上完成了一个index的功能,把上一步的结果进行了一个处理,它把上一步得到的frequent pattern按照item做了索引,这要得到的最后结果就是某一个item对应着一组frequent pattern。它把这些frequent pattern放在一个堆里,便于按频率的高低顺序进行访问。伪码中的if-else其实就是把frequent pattern插入堆,如果堆满了,和频率最小的那个节点(也就是根节点)比较一下,如果新节点的值大的话,删掉根节点,插入新节点。这样做的目的是始终保持堆里存储着某一item频率最高的top K个frequent pattern。
这就是map reduce框架下FP Growth算法的具体实现。在apache的开源项目mathout中它已经得到了实现,大家可以直接使用。
最后再谈一点个人意见,这个FP Growth Mapreduce实现在对F_list进行分组时可以再考虑一些负载均衡的策略,因为不采用任何策略的话,有可能会导致频率高的item都在一组,那么发射到这一组所对应机器上transaction就会得特别多,处理压力也会特别大,而别的机器上任务却过于轻松,这对整个系统效率的提升是很不利的。如果加入一定的策略考量,把频率高的item均匀的分配到各台机器上,将会使效率更加提高。
[1]PFP: ParallelFP-Growth for Query Recommendation