fpgrowth算法实战 mlib_【spark】41.Spark Mlib:FPGrowth算法

简介

FP-Growth算法是韩嘉炜等人在2000年提出的关联分析算法,它采取如下分治策略:将提供频繁项集的数据库压缩到一棵频繁模式树(FP-tree),但仍保留项集关联信息。

在算法中使用了一种称为频繁模式树(Frequent Pattern Tree)的数据结构。FP-tree是一种特殊的前缀树,由频繁项头表和项前缀树构成。FP-Growth算法基于以上的结构加快整个挖掘过程。

众所周知,Apriori算法在产生频繁模式完全集前需要对数据库进行多次扫描,同时产生大量的候选频繁集,这就使Apriori算法时间和空间复杂度较大。但是Apriori算法中有一个很重要的性质:频繁项集的所有非空子集都必须也是频繁的。但是Apriori算法在挖掘额长频繁模式的时候性能往往低下,Jiawei Han提出了FP-Growth算法。

FP-Tree:将事务数据表中的各个事务数据项按照支持度排序后,把每个事务中的数据项按降序依次插入到一棵以 NULL为根结点的树中,同时在每个结点处记录该结点出现的支持度。

1、FPGrowth使用场景

FPGrowth关联规则算法主要用于发现频繁项集。如:沃尔玛啤酒加尿布。

2、FPGrowth基本概念

FPGrowth算法通过构造一个FPTree树结构来压缩数据记录,使得挖掘频繁项集只需要扫描两次数据记录,而且该算法不需要生成候选集合,所以效率会比较高。

那么,如何从购物篮里面发现尿布+啤酒这样的最佳组合呢?

我们以以下数据集为例,假设有如下的一张购物清单表,每条记录代表一次购物记录:

|TID|Items|

|-|-|

| T1 | { 面包 , 牛奶 } |

| T2 | { 面包 , 尿布 , 啤酒 , 鸡蛋 }|

| T3 | { 牛奶 , 尿布 , 啤酒 , 可乐 }|

| T4 | { 面包 , 牛奶 , 尿布 , 啤酒 }|

| T5 | { 面包 , 牛奶 , 尿布 , 可乐 }|

其中:

牛奶、面包叫做项;

{ 牛奶、面包}叫做项集;

项集出现的次数叫做支持度。

T* 表示用户每次的购物清单。

3、算法思想

该算法的核心就是生成一棵FPTree。前面提到过,FPTree是一种树结构。

构建的过程需要将表中的数据以及关系进行保存,我们先来看构建过程:

假设我们的最小支持度是3,这相当于是一个阈值。接下来我们开始按如下的步骤处理数据。

3.1、step1

扫描数据记录,生成一级频繁项集,并按出现次数由多到少排序,如下所示:

ItemCount

牛奶4

面包4

尿布4

啤酒3

可乐2(<3,删除)

鸡蛋1(<3,删除)

可以看到,鸡蛋和可乐在上表中要删除,因为可乐只出现2次,鸡蛋只出现1次,小于最小支持度,因此不是频繁项集,非频繁项集的超集一定不是频繁项集,所以可乐和鸡蛋不需要再考虑。

3.2、step2

再次扫描数据记录,对每条记录中出现在Step 1产生的表中的项,按表中的顺序排序。初始时,新建一个根结点,标记为null。然后依次扫描每条记录,构建FPTree。

1、第一条记录:{面包,牛奶}需要根据Step1中结果转换成:{牛奶,面包},新建一个结点,name为{牛奶},将其插入到根节点下,并设置count为1,然后新建一个{面包}结点,插入到{牛奶}结点下面,插入后如下所示:

2、第二条记录:{面包,尿布,啤酒,鸡蛋},过滤并排序后为:{面包,尿布,啤酒},发现根结点没有包含{面包}的儿子(有一个{面包}孙子但不是儿子),因此新建一个{面包}结点,插在根结点下面,这样根结点就有了两个孩子,随后新建{尿布}结点插在{面包}结点下面,新建{啤酒}结点插在{尿布}下面,插入后如下所示:

3、第三条记录:{牛奶,尿布,啤酒,可乐},过滤并排序后为:{牛奶,尿布,啤酒},这时候发现根结点有儿子{牛奶},因此不需要新建结点,只需将原来的{牛奶}结点的count加1即可,往下发现{牛奶}结点有一个儿子{尿布},于是新建{尿布}结点,并插入到{牛奶}结点下面,随后新建{啤酒}结点插入到{尿布}结点后面。插入后如下图所示:

4、第四条记录:{面包,牛奶,尿布,啤酒},过滤并排序后为:{牛奶,面包,尿布,啤酒},这时候发现根结点有儿子{牛奶},因此不需要新建结点,只需将原来的{牛奶}结点的count加1即可,往下发现{牛奶}结点有一个儿子{面包},于是也不需要新建{面包}结点,只需将原来{面包}结点的count加1,由于这个{面包}结点没有儿子,此时需新建{尿布}结点,插在{面包}结点下面,随后新建{啤酒}结点,插在{尿布}结点下面,插入后如下图所示:

5、按照1-4这样的方式迭代所有的记录,最终会生成一棵树,即FPTree。按上表中生成的最终的FPTree如下图所示:

树中每个路径代表一个项集,因为许多项集有公共项,而且出现次数越多的项越可能是公共项,因此按出现次数由多到少的顺序排序可以节省空间,实现压缩存储。

另外我们需要一个表头和对每一个name相同的结点做一个线索,方便后面使用,线索的构造也是在建树过程形成的(下图虚线)。

至此,整个FpTree就构造好了。

4、利用FPTree挖掘频繁项集

FPTree建好后,就可以进行频繁项集的挖掘,挖掘算法称为FPGrowth(Frequent Pattern Growth)算法,挖掘从表头header的最后一个项开始。

此处即从{啤酒}开始,根据{啤酒}的线索链找到所有{啤酒}结点,然后找出每个{啤酒}结点的分支:{牛奶,面包,尿布,啤酒:1},{牛奶,尿布,啤酒:1},{面包,尿布,啤酒:1},其中的“1”表示出现1次。

注意,虽然{牛奶}出现4次,但{牛奶,面包,尿布,啤酒}只同时出现1次,因此分支的count是由后缀结点{啤酒}的count决定的,除去{啤酒},我们得到对应的前缀路径{牛奶,面包,尿布:1},{牛奶,尿布:1},{面包,尿布:1},根据前缀路径我们可以生成一棵条件FPTree,构造方式跟之前一样,此处的数据记录变为:

T1{牛奶,面包,尿布 : 1}

T2{牛奶,尿布: 1}

T3{面包,尿布: 1}

绝对支持度依然是3,我们发现此时,牛奶的支持度为2、面包的支持度为2、尿布的支持度为3,由于我们的支持度为3,所以删除牛奶和面包。按照相同的算法构造得到的FPTree为:

构造好条件树后,对条件树进行递归挖掘,当条件树只有一条路径时,路径的所有组合即为条件频繁集,假设{啤酒}的条件频繁集为{S1,S2},则{啤酒}的频繁集为{S1+{啤酒},S2+{啤酒},S1+S2+{啤酒}},即{啤酒}的频繁集一定有相同的后缀{啤酒},此处的条件频繁集为:{{},{尿布}},于是{啤酒}的频繁集为{{啤酒}{尿布,啤酒}}。

接下来找header表头的倒数第二个项{尿布}的频繁集,同上可以得到{尿布}的前缀路径为:{面包:1},{牛奶:1},{牛奶,面包:2},条件FPTree的数据集为:

T1{面包 :1 }

T2{牛奶 :1}

T3{牛奶,面包 :2}

构造的条件FpTree为:

这颗条件树路径上的所有组合即为条件频繁集:

{{},{牛奶},{面包},{牛奶,面包}}

加上{尿布}后,又得到一组频繁项集

{{尿布},{牛奶,尿布},{面包,尿布},{牛奶,面包,尿布}}

同样,这组频繁项集一定包含一个相同的后缀:{尿布},也就是我们一开始分析的对象,并且不包含{啤酒},因此这一组频繁项集与上一组不会重复。

重复以上步骤,对header表头的每个项进行挖掘,即可得到整个频繁项集,频繁项集即不重复也不遗漏。

最终,我们可以得到多个集合列表,每一个集合代表一个频繁项集。

总结下来,FPTree的开发流程为2个:

1、生成树过程

2、挖掘树过程:挖掘树的过程也是一个生成树的过程,每次挖掘一个节点的目的,都是为了发现该节点的频繁项集,将最终生成的结果取所有子集然后将每一项与挖掘的节点组合,作为我们最后得到的结果。

Spark Mlib实现

训练集如下:

面包 牛奶

面包 尿布 啤酒 鸡蛋

牛奶 尿布 啤酒 可乐

面包 牛奶 尿布 啤酒

面包 牛奶 尿布 可乐

存储在路径data/sample_fpgrowth.txt中。

接下来调用FPGrouwth算法训练数据集。

package com.zhaoyi;// $example on$

import java.util.Arrays;

import java.util.List;

import org.apache.spark.api.java.JavaRDD;

import org.apache.spark.api.java.JavaSparkContext;

import org.apache.spark.mllib.fpm.AssociationRules;

import org.apache.spark.mllib.fpm.FPGrowth;

import org.apache.spark.mllib.fpm.FPGrowthModel;

// $example off$

import org.apache.spark.SparkConf;

public class JavaSimpleFPGrowth {

public static void main(String[] args) {

SparkConf conf = new SparkConf().setMaster("local[*]").set("spark.testing.memory","2140000000")

.setAppName("JavaLinearRegressionWithSGDExample");

JavaSparkContext sc = new JavaSparkContext(conf);

// $example on$

JavaRDD data = sc.textFile("data/sample_fpgrowth.txt");

JavaRDD> transactions = data.map(line -> Arrays.asList(line.split(" ")));

// 最小支持度为0.5

FPGrowth fpg = new FPGrowth()

.setMinSupport(0.5)

.setNumPartitions(10);

FPGrowthModel model = fpg.run(transactions);

for (FPGrowth.FreqItemset itemset: model.freqItemsets().toJavaRDD().collect()) {

System.out.println("[" + itemset.javaItems() + "], " + itemset.freq());

}

double minConfidence = 0.8;

for (AssociationRules.Rule rule

: model.generateAssociationRules(minConfidence).toJavaRDD().collect()) {

System.out.println(

rule.javaAntecedent() + " => " + rule.javaConsequent() + ", " + rule.confidence());

}

// $example off$

sc.stop();

}

}

面包 牛奶

面包 尿布 啤酒 鸡蛋

牛奶 尿布 啤酒 可乐

面包 牛奶 尿布 啤酒

面包 牛奶 尿布 可乐

可以看到,我们设置的最小支持度为0.5,也就是说,过滤过程中,会将低于出现次数小于3/5>0.5>2/5次的话,显然可乐(出现一次,支持度为2/5=0.4)以及鸡蛋(出现1次,支持度为1/5=0.2)都不会纳入频繁项集之中,在step1中就会被T除。

最终的输出结果

[[尿布]], 4

[[牛奶]], 4

[[牛奶, 尿布]], 3

[[面包]], 4

[[面包, 牛奶]], 3

[[面包, 尿布]], 3

[[啤酒]], 3

[[啤酒, 尿布]], 3

[啤酒] => [尿布], 1.0

可以看到,该输出结果完美的实现了牛奶尿布实例中的预测结果。即{啤酒,尿布}这样的组合频繁项集。

那么,我们可以考虑将这两种商品摆放到一起,从而起到一定的增加销售业绩的作用(事实上沃尔玛的确这么做了)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/527964.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《管理系统中计算机应用》上机题,《管理系统中计算机应用》上机试题

管理系统中计算机应用《管理系统中计算机应用》上机试题一、数据表操作题1、新建数据表jk.dbf&#xff0c;表结构如下&#xff1a;课程编号(c,8),课程名称(C,10)&#xff0c;考试日期(D)&#xff0c;考核(L)&#xff0c;成绩(N,6,1)2、为数据表增加两条记录1011121 数学 2005年…

父子组建传值_浅谈Vue父子组件和非父子组件传值问题

本文介绍了浅谈Vue父子组件和非父子组件传值问题&#xff0c;分享给大家&#xff0c;具体如下&#xff1a;1.如何创建组件1.新建一个组件&#xff0c;如&#xff1a;在goods文件夹下新建goodsList.vuegoodsList组件export default {data() {return{}},created() {},methods: {}…

大学计算机课第二章内容总结,第四周市政系《大学计算机基础》课程总结

本周大一的新生终于在漫长的等待、报到、军训之后开始了大学课程的学习&#xff0c;在《大学计算机基础》课程的学习中&#xff0c;其实只是需要大学确立一种新的学习思想&#xff1a;计算机是人类智慧的结晶&#xff0c;它给予我们这样一种工具&#xff0c;通过对它的使用&…

在maven项目中打开jsp_零基础在intellij中打开一个项目复制粘贴内容即可运行的java拼图...

我刚学java语言&#xff0c;在学习java简单的拼图游戏时发现网上有些居然要导入调试&#xff0c;而且网上有些说的调试方法不明不白&#xff0c;所以我就分享了我的可直接复制在新项目中的源码&#xff0c;如果要直接要搞好的话就可以用结尾的分享提取链接进行百度网盘获取(该项…

计算机考试报名无法弹出支付界面,教资报名支付页面不弹出怎么办 2021教师资格证报名入口网址...

2021教师资格证报名入口是中小学教师资格考试网站&#xff0c;教师资格证报名时间是1月14-17日&#xff0c;请大家请及时登陆教师资格证报名官网报名以防错过考试。点击进入&#xff1a;2021年教师资格考试报名入口教师资格证报名缴费进不了支付页面的话原因可能有以下几点&…

绵阳市公文写作和计算机应用,【绵阳】绵阳市事业单位公开招聘工作人员公文写作和计算机应用笔试和复习大纲...

本大纲供参加绵阳市事业单位其他类岗位公开招聘工作人员业务基础知识考试-《公文写作和计算机应用》笔试的考生复习参考。请考生重点掌握以下知识内容。第一部分 公文写作一、公文基础知识(一)公文的定义与特点(二)公文的分类与作用(三)法定公文文种及各文种的概念、特点、分类…

gcn在图像上的应用_GCN总结 - nxf_rabbit75 - 博客园

一、GCN简介GNN模型主要研究图节点的表示(Graph Embedding)&#xff0c;图边结构预测任务和图的分类问题&#xff0c;后两个任务也是基于Graph Embedding展开的。目前论文重点研究网络的可扩展性、动态性、加深网络。谱卷积有理论支持&#xff0c;但有时候会受到拉普拉斯算子的…

神舟计算机主板bios,最详细的各种主板bios设置方法

bios是我们系统软件内置的设定作用&#xff0c;如今许多 盆友问各种各样电脑主板bios的详尽设定方式是什么呢?我也以前科学研究过各种各样电脑主板bios设定&#xff0c;也算作bios界的老鸟了。听到大伙儿有一些疑惑&#xff0c;我特意梳理了一篇最详尽的各种各样电脑主板bios设…

计算机控制常用数据通信标准,计算机系统第6章通信ppt课件.ppt

《计算机系统第6章通信ppt课件.ppt》由会员分享&#xff0c;提供在线免费全文阅读可下载&#xff0c;此文档格式为ppt&#xff0c;更多相关《计算机系统第6章通信ppt课件.ppt》文档请在天天文库搜索。1、第四章 计算机控制系统中的数据通信技术 Data Communication Technology …

mysql源码_MySql轻松入门系列——第一站 从源码角度轻松认识mysql整体框架图

一&#xff1a;背景1. 讲故事最近看各大技术社区&#xff0c;不管是知乎&#xff0c;掘金&#xff0c;博客园&#xff0c;csdn基本上看不到有小伙伴分享sqlserver类的文章&#xff0c;看来在国内大环境下是不怎么流行了&#xff0c;看样子我再写sqlserver是不可能再写了&#x…

测试图片色域软件,显示器色域检测

色域是颜色的一种编码&#xff0c;也是某一个规定的色彩空间或者输出装置呈现出来的一个颜色范围&#xff0c;展示给用户看到的颜色&#xff0c;使用显示器色域检测工具&#xff0c;可以检测到电脑显示器的色域情况&#xff0c;并且提供具体的参数&#xff0c;这款软件对于需要…

mysql连接代替子查询_MySQL优化之使用连接(join)代替子查询

使用连接(JOIN)来代替子查询(Sub-Queries)MySQL从4.1开始支持SQL的子查询。这个技术可以使用SELECT语句来创建一个单列的查询结果&#xff0c;然后把这个结果作为过滤条件用在另一个查询中。例如&#xff0c;我们要将客户基本信息表中没有任何订单的客户删除掉&#xff0c;就可…

计算机专业研究生应该如何规划,【图片】2020考研,老学长教你如何规划!【计算机考研吧】_百度贴吧...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼二、关键一步——院校选择我把各位同学的院校选择阶段分为以上几个阶段&#xff0c;因为考研这一年中&#xff0c;很多人的目标院校并不是固定不变的&#xff0c;而是随着不同阶段而改变的。学长我在大三下学期这一时间段内也多次更…

mysql devel 编译_mysql编译安装

下载软件到usr/local目录下&#xff1a;cd /usr/localwget http://cdn.mysql.com//Downloads/MySQL-5.7/mysql-boost-5.7.19.tar.gzwget http://downloads.sourceforge.net/project/boost/boost/1.59.0/boost_1_59_0.tar.gzwget http://cdn.mysql.com//Downloads/MySQL-5.7/mys…

计算机存储技术及应用,计算机数据安全存储技术及应用

【摘要】数据安全是计算机安全问题的核心&#xff0c;对于很多具有高度保密要求的单位&#xff0c;安全地存储重要数据&#xff0c;并且在不需要这些数据时作彻底销毁不被他人恢复是至关重要的。本文详细介绍了数据安全存储技术的发展现状&#xff0c;并结合典型的企业信息安全…

mysql执行存储过程提示out of_PHP执行MYSQL存储过程报错:Commands out of sync; you can't run...

php中在同时执行2个存储过程时&#xff0c;有一个程序2个储存过程都执行&#xff0c;有一个程序只执行第一个调用。2个都执行的调用如下&#xff1a;$mydb->query("delete from pinfo where id in(" . $id .")");SaveLog($Ptype, $_SESSION["usern…

哈尔滨大学计算机和金融,山东153所大学最新排名,46所公办本科,看看有你喜欢的吗...

作为人口大省的山东&#xff0c;也是我国有名的教育大省&#xff0c;不但经济发达&#xff0c;地理位置优越&#xff0c;教育资源也是比较丰富的&#xff0c;山东省有153所大学&#xff0c;在大学数量上还是比较多的。但是山东省在高端教育上一直被吐槽&#xff0c;全国知名大学…

mysql俩个表之间关联语法_MySQL多表关联SQL语句调优

本文不涉及复杂的底层数据结构&#xff0c;是通过explain解释SQL&#xff0c;并根据当前可能出现的情况&#xff0c;来做具体的优化&#xff0c;使百万级、千万级数据表关联查询第一页结果能在几秒内完成(真实业务告警系统优化结果)。希望对您有一定的帮助。需要优化的查询&…

如何设置计算机http端口号,服务器http端口设置

弹性云服务器 ECS弹性云服务器(Elastic Cloud Server)是一种可随时自助获取、可弹性伸缩的云服务器&#xff0c;帮助用户打造可靠、安全、灵活、高效的应用环境&#xff0c;确保服务持久稳定运行&#xff0c;提升运维效率三年低至5折&#xff0c;多种配置可选了解详情修改弹性公…

dubbo protocol port 消费者端_企业级 SpringBoot 与 Dubbo 的并用

点击上方“匠心零度”&#xff0c;选择“设为星标”做积极的人&#xff0c;而不是积极废人作者&#xff1a;SimpleWucnblogs.com/SimpleWu/p/10833555.htmlSpringBoot 和 Dubbo 又能碰撞出什么火花呢&#xff1f;我们来看看企业级 SpringBoot 与 Dubbo 的并用。版本:Springboot…