Spark机器学习(9):FPGrowth算法
关联规则挖掘最典型的例子是购物篮分析,通过分析可以知道哪些商品经常被一起购买,从而可以改进商品货架的布局。
1. 基本概念
首先,介绍一些基本概念。
(1) 关联规则:用于表示数据内隐含的关联性,一般用X表示先决条件,Y表示关联结果。
(2) 支持度(Support):所有项集中{X,Y}出现的可能性。
(3) 置信度(Confidence):先决条件X发生的条件下,关联结果Y发生的概率。
2. Apriori算法
Apriori算法是常用的关联规则挖掘算法,基本思想是:
(1) 先搜索出1项集及其对应的支持度,删除低于支持度的项集,得到频繁1项集L1;
(2) 对L1中的项集进行连接,得到一个候选集,删除其中低于支持度的项集,得到频繁1项集L2;
...
迭代下去,一直到无法找到L(k+1)为止,对应的频繁k项集集合就是最后的结果。
Apriori算法的缺点是对于候选项集里面的每一项都要扫描一次数据,从而需要多次扫描数据,I/O操作多,效率低。为了提高效率,提出了一些基于Apriori的算法,比如FPGrowth算法。
3. FPGrowth算法
FPGrowth算法为了减少I/O操作,提高效率,引入了一些数据结构存储数据,主要包括项头表、FP-Tree和节点链表。
3.1 项头表
项头表(Header Table)即找出频繁1项集,删除低于支持度的项集,并按照出现的次数降序排序,这是第一次扫描数据。然后从数据中删除非频繁1项集,并按照项头表的顺序排序,这是第二次也是最后一次扫描数据。
下面的例子,支持度=0.4,阈值=0.4*10=4,因为D、F、G出现次数小于4次,小于阈值,所以被删除,项头表按照各一项集出现的次数重新排序。如ABCE=>EABC。
3.2 FP-Tree
3.2.1 FP-Tree的建立
FP-Tree(Frequent Pattern Tree)初始时只有一个根节点Null,将每一条数据里的每一项,按照排序后的顺序插入FP-Tree,节点的计数为1,如果有共用的祖先,则共用祖先的节点计数+1。
首先,插入第1条数据E:
插入第2条数据ABC:
插入第3条数据EABC:
以此类推,所有数据都插入以后:
3.2.2 FP-Tree的挖掘过程
FP-Tree的挖掘过程如下,从长度为1的频繁模式开始挖掘。可以分为3个步骤:
(1) 构造它的条件模式基(CPB, Conditional Pattern Base),条件模式基(CPB)就是我们要挖掘的Item的前缀路径;
(2) 然后构造它的条件FP-Tree(Conditional FP-tree);
(3) 递归的在条件FP Tree上进行挖掘。
从项头表的最下面一项(也就是C)开始,包含C的3个CPB分别是EAB、E、AB,其计数分别为2、1、2,可以表示为CPB{<EAB:2>,<E:1>,<AB:2>}。累加每个CPB上的Item计数,低于阈值的删除,得到条件FP Tree(Conditional FP-tree)。如CPB{<EAB:2>,<E:1>,<AB:2>},得到E:3,A:4,B:4,E的计数小于阈值4,所以删除,得到C的条件FP Tree如下:
在条件FP Tree上使用如下的算法进行挖掘:
procedure FP_growth(Tree, α){ if Tree 含单个路径P {for 路径 P 中结点的每个组合(记作β){产生模式β ∪ α,其支持度support = β中结点的最小支持度;} } else {for each a i 在 Tree 的头部 {产生一个模式β = ai ∪ α,其支持度support = ai.support;构造β的条件模式基,然后构造β的条件FP Tree Treeβ;if Treeβ ≠ ∅ then调用FP_growth (Treeβ, β);}} }
对于上面的条件FP Tree,可知是单个路径,可以得到以下的频繁模式:<AC:4>、<BC:4>、<ABC:4>。
4. MLlib的FPGrowth算法
直接上代码:
import org.apache.log4j.{ Level, Logger } import org.apache.spark.{ SparkConf, SparkContext } import org.apache.spark.rdd.RDD import org.apache.spark.mllib.fpm.{ FPGrowth, FPGrowthModel }/*** Created by Administrator on 2017/7/16.*/ object FPGrowth {def main(args:Array[String]) ={// 设置运行环境val conf = new SparkConf().setAppName("FPGrowth").setMaster("spark://master:7077").setJars(Seq("E:\\Intellij\\Projects\\MachineLearning\\MachineLearning.jar"))val sc = new SparkContext(conf)Logger.getRootLogger.setLevel(Level.WARN)// 读取样本数据并解析val dataRDD = sc.textFile("hdfs://master:9000/ml/data/sample_fpgrowth.txt")val exampleRDD = dataRDD.map(_.split(" ")).cache()// 建立FPGrowth模型,最小支持度为0.4val minSupport = 0.4val numPartition = 10val model = new FPGrowth().setMinSupport(minSupport).setNumPartitions(numPartition).run(exampleRDD)// 输出结果println(s"Number of frequent itemsets: ${model.freqItemsets.count()}")model.freqItemsets.collect().foreach { itemset =>println(itemset.items.mkString("[", ",", "]") + ":" + itemset.freq)}}}
样本数据:
D E A B C A B C E B E C D E A B C A B C E B E F G D F
运行结果:
参考文献:《数据挖掘概念与技术》。
Spark机器学习(9):FPGrowth算法相关推荐
- fpgrowth算法实战 mlib_【spark】41.Spark Mlib:FPGrowth算法
简介 FP-Growth算法是韩嘉炜等人在2000年提出的关联分析算法,它采取如下分治策略:将提供频繁项集的数据库压缩到一棵频繁模式树(FP-tree),但仍保留项集关联信息. 在算法中使用了一种称为 ...
- 机器学习实战-FP-growth算法
本章内容 发现事物数据中的公共模式 FP-growth算法 发现Twitter源中共现词 搜索引擎自动补全查询此项,可以找出互联网上经常一块出现的词对.这需要一种高效发现频繁项集的方法.FP-grow ...
- 机器学习-使用FP-Growth算法来高效发现频繁项集
FP-Growth算法是这里要介绍的第三个非监督学习算法,FP(Frequent Pattern)代表频繁模式.FP-Growth算法相对于Apriori算法来说效率更高,其只需要对数据集进行两轮扫描 ...
- python apriori算法 sklearn_sklearn(九)apriori 关联规则算法,以及FP-growth 算法
是什么: apriori算法是第一个关联规则挖掘算法,利用逐层搜索的迭代方法找出数据库中的项集(项的集合)的关系,以形成规则,其过程由连接(类矩阵运算)与剪枝(去掉没必要的中间结果)组成.是一种挖掘关 ...
- [机器学习]关联挖掘算法Apriori和FP-Growth以及基于Spark 实例
目录 Apriori 算法 FP-Growth算法 算法原理 步骤1 统计各个商品被购买的频次 步骤2 构建FP树 步骤3 频繁项的挖掘 阅读本文需要了解关联挖掘的基本知识,了解关联挖掘的基本原理,参 ...
- 【机器学习】Apriori 算法进行关联分析和FP-growth算法
[机器学习]Apriori 算法进行关联分析和FP-growth算法 文章目录 1 关联分析 2 FP-growth算法理解和实现 3 FP增长算法的频繁项集产生 4 FP-Growth关联分析算法在 ...
- 基于Apache Spark的机器学习及神经网络算法和应用
使用高级分析算法(如大规模机器学习.图形分析和统计建模等)来发现和探索数据是当前流行的思路,在IDF16技术课堂上,英特尔公司软件开发工程师王以恒分享了<基于Apache Spark的机器学习及 ...
- 机器学习-关联之FP-Growth算法原理及实战
FP-Growth 简介 FP-Growth算法是一种发现数据集中频繁模式的有效方法,它在Apriori算法的原理的基础上,采用FP(Frequent Pattern,频繁模式)树数据结构对原始数据进 ...
- Spark机器学习之协同过滤算法
Spark机器学习之协同过滤算法 一).协同过滤 1.1 概念 协同过滤是一种借助"集体计算"的途径.它利用大量已有的用户偏好来估计用户对其未接触过的物品的喜好程度.其内在思想是相 ...
最新文章
- 微服务应该这么搞,万字长文谈微服务经历!
- leetcode刷题笔记342 4的幂
- 数据竞赛:第四届工业大数据竞赛-虚拟测量
- (收藏)Html相关网址
- Groovy里的运行时元数据编程(metata programming)
- 一步步把SAP GUI的事务码配置到SAP Fiori Launchpad里
- Dll学习一_Dll 创建并动态引用窗体且释放窗体Demo
- yarn的配置 -- 无法将“yo”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。
- WCF 第二章 契约 系列文章
- pytorch Tensor
- CentOS7 安装git服务器
- 如何用 CNN 玩转 AlphaGo 版的五子棋?
- cc2530定时器和捕获比较_STM32定时器PWM和输入捕获事件
- 喜庆访问量达到10万
- MATLAB 快速傅里叶变换分析
- python程序加密狗_加密狗 超级狗 加密程序 程序授权示例 程序授权验证
- 【Python进阶】9- Pandas的应用
- 计算机课程设计-基于ssm+vue的物资管理系统(前后端分离)-物资出库入库管理系统java代码
- 爬虫 【第一章】爬虫基本原理
- mysql之联合索引