转载自:http://blog.sina.com.cn/s/blog_68ffc7a40100uebi.html

前面的博客分析了关联分析中非常重要的一个算法-FP Growth.该算法根据数据库在内存中构造一个精巧的数据结构-FP Tree,通过对FP Tree不断的递归挖掘就可以得到所有的完备Frequent Patterns.但是在目前海量数据的现状下,FP Tree已经大到无法驻留在计算机的内存中。因此,并行化是唯一的选择。这篇博客主要讲一下如何在MapReduce框架下进行并行FP挖掘,它主要的算法在文献1中有详细描述。

如何进行FP Growth的并行化呢?一个很自然的想法就是,将原始的数据库划分成几个分区,这几个分区分别在不同的机器上,这样的话我们就可以对不同数据分区并行得进行FP Growth挖掘,最后将不同机器上的结果结合起来得到最终的结果。的确,这是一个正确的思路。但问题是:我们按照什么样的方法来把数据库划分成区块呢?如果FP Growth能够真正的独立进行并行化,那么就需要这些数据分区必须能够互相独立,也就是这些分区针对某一部分项目来说是完备的。于是就有一种方法:通过对数据库的一次扫描,构造一个Frequent Item列表F_List = {I1:count1, I2:count2, I3:count3…} ^ (count1> count2 > count3>…),然后将F_List分成几个Group,形成几个G_List.这时候我们再扫描数据库的每一条Transaction,如果这条Transaction中包含一条G_List中的Item,那么这条transaction就被添加到该group对应的数据库分区中去,这样就形成了几个数据库分区,每个数据库分区对应一个group和一个group_list。这种分区方法就保证对group_list里面的item而言,数据库分区是完备的。这种分区方式会导致数据会有冗余,因为一条transaction可能会在不同的分区中都有备份,但为了保持数据的独立性,这是一个不得已方法。

下面就简单谈谈该算法的步骤:

第一步:数据库分区.把数据库分成连续的不同的分区,每一个分区分布在不同的机器上.每一个这样的分区称之为shard。

第二步:计算F_list,也就是所有item的support count.这个计算通过一个MapReduce就可以完成.想想hadoop上word count的例子,本质上和这一步是一样的.

第三步:条目分组.将F_list里的条目分成Q个组,这样的话就行成了一个group_list,group_list里的每一个group都被分配一个group_id,每个group_list都包含一组item的集合.

第四步:并行FP Growth.这一步是关键.它也是由一个MapReduce来完成的.具体来看看.

Mapper:

这个Mapper完成的主要功能是数据库分区。它和第一步中的shard有所不同,它利用第一步shard的数据库分区,一个一个处理shard数据库分区中的每一条transaction,将transaction分成一个一个item,每一个item根据group_list映射到合适的group里去。这样的话,通过mapper,属于同一个group的item集合都被聚合到一台机器上,这样就形成了我们前面讲到的完备数据集,在下一步的reducer中就可以并行得进行FP Growth算法了。

Reducer:

基于mapper形成的完备数据集,进行local的FP_Growth算法

第五步:聚合,将各台机器上的结果聚合成最终我们需要的结果。

前面的博客分析了关联分析中非常重要的一个算法-FP Growth.该算法根据数据库在内存中构造一个精巧的数据结构-FP Tree,通过对FP Tree不断的递归挖掘就可以得到所有的完备Frequent Patterns.但是在目前海量数据的现状下,FP Tree已经大到无法驻留在计算机的内存中。因此,并行化是唯一的选择。这篇博客主要讲一下如何在MapReduce框架下进行并行FP挖掘,它主要的算法在文献1中有详细描述。

如何进行FP Growth的并行化呢?一个很自然的想法就是,将原始的数据库划分成几个分区,这几个分区分别在不同的机器上,这样的话我们就可以对不同数据分区并行得进行FP Growth挖掘,最后将不同机器上的结果结合起来得到最终的结果。的确,这是一个正确的思路。但问题是:我们按照什么样的方法来把数据库划分成区块呢?如果FP Growth能够真正的独立进行并行化,那么就需要这些数据分区必须能够互相独立,也就是这些分区针对某一部分项目来说是完备的。于是就有一种方法:通过对数据库的一次扫描,构造一个Frequent Item列表F_List = {I1:count1, I2:count2, I3:count3…} ^ (count1> count2 > count3>…),然后将F_List分成几个Group,形成几个G_List.这时候我们再扫描数据库的每一条Transaction,如果这条Transaction中包含一条G_List中的Item,那么这条transaction就被添加到该group对应的数据库分区中去,这样就形成了几个数据库分区,每个数据库分区对应一个group和一个group_list。这种分区方法就保证对group_list里面的item而言,数据库分区是完备的。这种分区方式会导致数据会有冗余,因为一条transaction可能会在不同的分区中都有备份,但为了保持数据的独立性,这是一个不得已方法。

下面就简单谈谈该算法的步骤:

第一步:数据库分区.把数据库分成连续的不同的分区,每一个分区分布在不同的机器上.每一个这样的分区称之为shard。

第二步:计算F_list,也就是所有item的support count.这个计算通过一个MapReduce就可以完成.想想hadoop上word count的例子,本质上和这一步是一样的.

第三步:条目分组.将F_list里的条目分成Q个组,这样的话就行成了一个group_list,group_list里的每一个group都被分配一个group_id,每个group_list都包含一组item的集合.

第四步:并行FP Growth.这一步是关键.它也是由一个MapReduce来完成的.具体来看看.

Mapper:

这个Mapper完成的主要功能是数据库分区。它和第一步中的shard有所不同,它利用第一步shard的数据库分区,一个一个处理shard数据库分区中的每一条transaction,将transaction分成一个一个item,每一个item根据group_list映射到合适的group里去。这样的话,通过mapper,属于同一个group的item集合都被聚合到一台机器上,这样就形成了我们前面讲到的完备数据集,在下一步的reducer中就可以并行得进行FP Growth算法了。

Reducer:

基于mapper形成的完备数据集,进行local的FP_Growth算法

第五步:聚合,将各台机器上的结果聚合成最终我们需要的结果。

上面的图就给出了算法步骤的框图。有了这个框图,大家可能对算法的步骤就有一定的认识了。后面的博客就针对每一步进行具体的分析。

上面的图就给出了算法步骤的框图。有了这个框图,大家可能对算法的步骤就有一定的认识了。后面的博客就针对每一步进行具体的分析。

MapReduce框架下的FP Growth算法概述相关推荐

  1. MapReduce框架下的FP Growth算法详解

    转载自:http://blog.sina.com.cn/s/blog_68ffc7a40100uebk.html Sharding 这一步没什么好讲的,将数据库分成连续的大小相等的几个块,放置在不同的 ...

  2. FP Growth算法

    转载自:http://blog.sina.com.cn/s/blog_68ffc7a40100uebg.html FP树构造 FP Growth算法利用了巧妙的数据结构,大大降低了Aproir挖掘算法 ...

  3. FP Growth算法详解

    看了n多资料,就这篇说的比较详细,适合初学者 FP树构造 FP Growth算法利用了巧妙的数据结构,大大降低了Aproir挖掘算法的代价,他不需要不断得生成候选项目队列和不断得扫描整个数据库进行比对 ...

  4. Frequent Pattern 挖掘之二(FP Growth算法)(转)

    FP树构造 FP Growth算法利用了巧妙的数据结构,大大降低了Aproir挖掘算法的代价,他不需要不断得生成候选项目队列和不断得扫描整个数据库进行比对.为了达到这样的效果,它采用了一种简洁的数据结 ...

  5. pagerank算法c语言,在hadoop的map-reduce框架下实现经典的pagerank算法

    编程环境: Ubuntu16.4 uklin Hadoop3.2.0 openjdk version "1.8.0_191" spark 2.3.0 ( 集群环境 ) 完整代码已经 ...

  6. 学习记录575@网络分层下各层密码算法概述

    网络分层协议 互联网通信主要是在TCP/IP通信协议的基础上建立起来的.TCP/IP体系结构共分5层,由上到下分别是应用层.传输层(TCP).网络层(IP).数据链路层和实体层.实体层也称为物理层.使 ...

  7. FP Tree算法原理总结(转)

    FP Tree算法原理总结 转自: https://www.cnblogs.com/zhengxingpeng/p/6679280.html 总结得太好了. FP Tree算法原理总结 在Aprior ...

  8. FP Tree算法原理

    作为一个挖掘频繁项集的算法,Apriori算法需要多次扫描数据,I/O是很大的瓶颈.为了解决这个问题,FP Tree算法(也称FP Growth算法)采用了一些技巧,无论多少数据,只需要扫描两次数据集 ...

  9. CV:计算机视觉技最强学习路线之CV简介(传统视觉技术/相关概念)、早期/中期/近期应用领域(偏具体应用)、经典CNN架构(偏具体算法)概述、常用工具/库/框架/产品、环境安装、常用数据集、编程技巧

    CV:计算机视觉技最强学习路线之CV简介(传统视觉技术/相关概念).早期/中期/近期应用领域(偏具体应用).经典CNN架构(偏具体算法)概述.常用工具/库/框架/产品.环境安装.常用数据集.编程技巧 ...

最新文章

  1. 从源码角度来读Handler
  2. 开发人员学Linux(4):使用JMeter对网站和数据库进行压力测试
  3. RepositoryBase文件解析
  4. 蒙特卡洛积分与重要性采样详解
  5. c mysql批量添加数据类型_mybatis学习之路----mysql批量新增数据
  6. [福建集训2011][LOJ10111]相框
  7. 仔细学习CSS(一)
  8. 【转】无服务计算(Serverless Computing)核心知识
  9. 【Python 必会技巧】使用 zip() 函数对序列进行压缩和解压操作
  10. pythonmysql查询转list_python 数据库查询结果转对象
  11. 建立Groovy开发环境
  12. 负债会让你有多大改变?
  13. [WPF] 嵌入资源到DLL,并解决PNG图片问题
  14. 求解线性方程的数值方法——Matlab中实现算法
  15. JVM之类的加载与类加载器
  16. access阿里云 mysql_如何使用access数据库
  17. Python学习笔记(15) 网络爬虫使用proxy实现自动换IP防封锁
  18. IOS视频播放器VKVideoPlayer
  19. vue实现答题考试功能(上一题下一题)
  20. 怎样在excel中通过出生日期计算年龄

热门文章

  1. linux unlink 与 rm区别_从 lsof 开始,深入理解 Linux 虚拟文件系统
  2. Emacs快速切换行号开关
  3. Android Binder Driver流程分析
  4. android 几个快速编译images指令
  5. 成人教育计算机教育论文,【计算机教育论文】成人计算机教育应把握原则(共3460字)...
  6. python json转xml_Python中xml和json格式相互转换操作示例
  7. 计算机是怎样跑起来的pdf_程序是怎样跑起来的 -- 通过汇编语言了解程序的实际构成(中篇)...
  8. linux shell 后台执行脚本的方法 脚本后台运行 后台运行程
  9. vivado ip xdc 和user xdc 编译顺序
  10. lambda stream 循环_jdk8-lambda-stream的使用