FP-growth算法(仅理解部分,代码待更新)

2023-11-13

1.简介

FP-growth算法主要用于挖掘频繁项集,它只需要遍历两次数据库,因此在大数据集上的速度优于Apriori,通常性能要好两个数量级以上。其发现频繁项集的基本过程如下:
(1)构建FP树
(2)从FP树中挖掘频繁项集

2.构建FP树

2.1.FP树简介

FPFrequent Pattern的缩写。FP树根节点是空集,每个结点保存单个元素和它在数据集中的出现次数,出现次数越多越接近根节点。相同元素之间又会通过链表连接,方便后续的追溯步骤。

2.2.FP树的构建步骤:

  1. 扫描数据集,对所有元素项的出现次数进行计数,去掉不满足最小支持度的元素项;
  2. 对每个集合进行过滤和排序,过滤是去掉不满足最小支持度的元素项,排序基于元素项的绝对出现频率来进行;
  3. 创建只包含空集合的根节点,将过滤和排序后的每个项集依次添加到树中,如果树中已经存在该路径,则增加对应元素上的值。如果该路径不存在,则创建一条新路径。

2.3.FP树的构建实例

数据集如下:其中每一行是一次记录

instance id elements
1 r,z,h,j,p
2 z,y,x,w,v,u,t,s
3 z
4 r,x,n,o,s
5 y,r,x,z,q,t,p
6 y,z,x,e,q,s,t,m

step1: 扫描数据集,对所有元素项的出现次数进行计数

elements times
r 3
z 5
h 1
j 1
p 2
y 3
x 4
w 1
v 1
u 1
t 3
s 3
n 1
o 1
q 2
e 1
m 1

step2:去掉不满足最小支持度的元素项

令最小支持度为 0.5,那么将出现次数小于 3 的元素项过滤。

elements times
r 3
z 5
h 1
j 1
p 2
y 3
x 4
w 1
v 1
u 1
t 3
s 3
n 1
o 1
q 2
e 1
m 1

删除后的结果为

elements times
r 3
z 5
y 3
x 4
t 3
s 3

step3:降序排列step2所得结果

elements times
z 5
x 4
y 3
r 3
s 3
t 3

step4:将原数据集过滤支持度过小的元素并按出现次数降序排列

instance id elements filter&sort
1 r,z,h,j,p z,r
2 z,y,x,w,v,u ,t,s z,x,y,s,t
3 z z
4 r,x,n,o ,s x,s,r
5 y,r,x,z,q ,t,p z,x,y,r,t
6 y,z,x,e,q ,s,t,m z,x,y,s,t

step5:每条instance依次添加到FP树中

头结点是空结点,然后每条instance依次添加元素到FP树中,

  1. 若结点已经存在,频数+1
  2. 若结点不存在,另辟一条分支,添加该结点,并把频数记为1

例如,

  • 从根节点(空集)开始,读入项集 {z, r},为根节点增加一个子节点 z,然后给 z 节点创建一个子节点 r,形成一条 z->r 的路径。
  • 接着读入项集 {z, x, y, s, t},z 节点已经存在,那么就从根节点走到 z 节点,然而 z 节点不存在子节点 x,于是创建子节点 x,重复上述过程,直到创建一条 z->x->y->s->t 的路径。
  • 接着读入项集 {z},当前项集有存在的路径,于是就不需要创建新路径。

需要注意的是,在遍历路径的过程中,如果现有元素存在,则增加现有元素的值。例如项集 {z, r} 创建 z 节点,并将 z 节点的 频数 设置为 1,接着读入项集 {z, x, y, s, t},由于 z 节点已经存在,那么就为 z 节点的 频数加 1。
在这里插入图片描述
并且从头结点表依次链接在这里插入图片描述
最终构建得到如下的FP树
在这里插入图片描述

3.从FP树挖掘频繁项集

有了FP树之后,我们就可以来挖掘频繁项集了。这里的思路和Apriori算法大致类似,首先从单元素项集合开始,然后在此基础上逐步构建更大的集合。当然,这里使用的是FP树而不是原始数据集。

条件模式基: 头部链表中的某一点的前缀路径组合就是条件模式基,条件模式基的值取决于末尾节点的值。即条件模式基是以所查找元素项为结尾的路径集合。

3.1.从FP树中挖掘频繁项集的步骤:

  1. 从FP树中获得条件模式基;
  2. 利用条件模式基,构建一个条件FP树;
  3. 迭代:重复上述两个步骤,知道树包含一个元素项为止。

3.2. 1-频繁项集的前缀路径

例如我们要查找元素项 t的前缀路径,头结点链表t追溯到 <t:2>
在这里插入图片描述
然后继续沿着树向前追溯,即得前缀路径为{z, x, y, s}2,其中2就是当前结点t的值。因为t的出现次数最一个频繁项集的支持度由支持度最小的项决定。所以t节点的条件模式基的值可以理解为对于以t节点为末尾的前缀路径出现次数。

回顾之前统计的频数:

elements times
r 3
z 5
y 3
x 4
t 3
s 3

下表为1-频繁项的前缀路径

频繁项 前缀路径
z {}5
r {x, s}1, {z, x, yy}1, {z}1
x {z}3, {}1
y {z, x}3
s {z, x, y}2, {x}1
t {z, x, y, s}2, {z, x, y, r}1

3.3. 创建条件FP树

  • 条件FP树:以条件模式基作为数据集构造的FP树叫做条件FP树。

对于每一个频繁项,都要创建一棵条件 FP 树。可以使用上一步发现的条件模式基作为输入数据,并通过相同的构建 FP 树的相同的步骤来构建条件 FP 树。然后,我们会递归地发现频繁项、发现条件模式基,以及发现另外的条件树。递归遍历头部链表生成FP树的过程,递归截止条件是生成的FP树的头部链表为空。

假定为频繁项 t 创建一个条件 FP 树,最小支持度为0.5(频数为 3)。根据3.2.得到的 1-频繁项的前缀路径,可知 t 的前缀路径为 {z, x, y, s}2, {z, x, y, r}1。

  • 因为最小支持度的频数为 3,所以 {z, x, y, s} 和 {z, x, y, r} 都不满足条件,分别去掉 s 和 r。(因为s只出现在第一个前缀路径中,故频数为2,2<3 去掉;同理r只出现在第二个条件模式基中,频数为1,1<3 去掉;而z x y均出现在两个条件模式基中,频数为1+2=3,故保留)
  • 去掉 s 和 r 后发现,这两条前缀路径重合了,{z, x, y} 的计数值变为 3,即满足条件。根据 Apriori 原理,频繁项集的超集自然也是频繁项集。
    在这里插入图片描述
    链接头结点表:
    在这里插入图片描述

然后根据t-条件FP树的头部链表进行遍历,从y开始。得到频繁项集ty。然后又得到y的条件模式基{z, x}3,构造出ty的条件FP树,即ty-条件FP树。
在这里插入图片描述

继续遍历ty-条件FP树的头部链表,得到频繁项集tyx,然后又得到频繁项集tyxz. 最后得到构造tyxz条件FP树的头部链表是空的,终止遍历。我们得到的频繁项集有t->ty->tyz->tyzx,这只是一小部分。

依次类推(t的条件模式基重复上述步骤,s的条件模式基重复上述步骤,y的条件模式基重复上述步骤……)

关于条件模式基的生成和频繁项集挖掘的具体操作,见:
传送门
在这里插入图片描述

最终得到所有的频繁项集:
[{‘r’},
{‘s’}, {‘x’, ‘s’},
{‘y’}, {‘y’, ‘z’}, {‘y’, ‘z’, ‘x’}, {‘y’, ‘x’},
{‘t’},{‘y’, ‘t’},{‘y’, ‘z’, ‘t’},{‘y’, ‘z’, ‘x’, ‘t’},   \space     \space     \space   {‘x’, ‘t’}, {‘y’, ‘x’, ‘t’}, {‘z’, ‘t’}, {‘z’, ‘x’, ‘t’},
{‘x’}, {‘z’, ‘x’},
{‘z’}]

参考文献

  1. 《机器学习实战》Peter Harrington著
  2. https://blog.csdn.net/qs17809259715/article/details/100023061
  3. https://blog.csdn.net/weixin_43378396/article/details/89606982
  4. https://zhuanlan.zhihu.com/p/117598874
  5. https://blog.csdn.net/huagong_adu/article/details/17739247?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163150089916780357212252%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=163150089916780357212252&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~hot_rank-3-17739247.first_rank_v2_pc_rank_v29&utm_term=fp+growth&spm=1018.2226.3001.4187
  6. https://www.cnblogs.com/pinard/p/6307064.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FP-growth算法(仅理解部分,代码待更新) 的相关文章

  • Csdn爬虫自动评论

    前言 因为发现自己的csdn博客被机器人自动评论 这些博客很多都是对别人进行评论 然后别人就有可能回访或者点赞关注等等 基本上总积分非常高 为了覆盖掉这些机器评论 本篇主要是实现java爬虫对自己的博客所有文章进行自动评论 一 准备分析工作
  • vscode插件一draw.io绘图工具

    vscode 插件推荐一draw io 日常工作中需要制作时序图 流程图等 这里推荐的是vscode的插件中draw io 先自行在官网下载vscode https code visualstudio com 安装后打开vscode 如图在

随机推荐

  • c++ map 析构函数_C++核心准则C.36:析构函数不应该失败

    C 36 A destructor may not fail析构函数不应该失败 Reason 原因 In general we do not know how to write error free code if a destructor
  • Crazyswarm framework

    Crazyswarm framework 1 Tools Crazyfile Chooser Simulation sim flag 2 软件架构 使用方法 参考论文 应用的论文 3使用教程 参考网页 配置文件 example 基础 轨迹生
  • k8s 部署dubbo

    docker pull chenchuxin dubbo admin docker tag chenchuxin dubbo admin hub redblue ai com dubbo admin cat lt lt END gt dub
  • sql 数据查询返回值问题

    1 create 返回值 若发生错误 返回false 成功则返回创建的数据 2 add 返回值 addAll 返回值 成功 id或true 失败 false 成功 如果主键是自动增长型 返回值为新增记录Id值 addAll为最大值 否则返回
  • Microsoft Store打不开的解决方案

    Microsoft Store无法打开的解决方案 一 方案一 1 按Win i键 点击 网络和internet 2 转到 代理 关闭 使用代理服务器 3 尝试打开 microsoft store 二 方案二 1 按Win R键 输入inet
  • PHP请求微信接口获取用户电话号

    前言情景剧 业务场景是为了在用户登录的时候判断其是否已经成功注册 没有成功注册的话就将获取到的openid和session key加密后作为token传给前端 然后让前台通过组件获得code之后连着token一起传给后端 后端拿着code再
  • 服务机器人串口配置

    服务机器人串口配置 1 确定串口号 2 查看串口号对应的kernels 3 修改rules 1 确定串口号 如下图 以雷达为了例子 插拔之后 可知串口号为 ttyUSB1 2 查看串口号对应的kernels 3 修改rules 更改KERN
  • 搭建Zerotier内网穿透网络及彻底删除zerotier方法

    搭建Zerotier内网穿透网络 1 注册zerotier账号并登录https my zerotier com 2 访问https my zerotier com network 点击Create a Network 之后再Your Net
  • Java 【基础】 模拟log4j,输出当前语句的行数,和类路径

    一直很好奇log4j 是如何获取到当前输出的行数的 今天学到了 原来是堆栈跟踪 把代码贴出来给大家看一下 模拟log4j public static void debug String string System out println 调
  • declare-styleable的使用

    declare styleable是给自定义控件添加自定义属性用的 可以定义多种类型 int Boolean string等等 参考链接
  • 正则表达式去除冗长代码,tppabs

    利用正则表达式去除网页中的冗长没用代码 1 btppabs h 2 tpa http 3 清除css内的 tpa http s gif png jpg 4 tpa
  • org.springframework.http.converter.HttpMessageNotWritableException

    这里说无法将 对应对象转换 原因在于没有导入json 依赖 所以无法转换 org springframework http converter HttpMessageNotWritableException No converter fou
  • SD/MMC存储器启动方案在SoC中的设计与实现

    原文地址 http blog csdn net allen6268198 article details 7745208 引言 SD MMC存储器以其成本低廉 存储容量大 性能优良 安全性高等特点越来越广泛地应用于便携式设备和家用电子设备
  • Android Studio中设置鼠标悬停显示文档提示方法

    有些小伙伴在开发的过程中可能会习惯使用文档注释 那么在Android Studio中如何设置启用文档注释呢 1 首先打开Android Studio 点击菜单栏中的 File选项菜单 点击如下的Settings 进行设置 2 点击Edito
  • Windows10系统下swin-transformer目标检测环境搭建

    Swin Transformer Object Detection环境搭建 前言 1 环境准备 2 虚拟环境创建 3 安装pytorch 4 安装mmcv 5 安装mmdet 6 安装apex 7 测试 前言 刚搞明白了分类 又进来了检测这
  • 基于 Linux 安装 web 服务及基本配置

    在网络环境中 web 服务无疑是最为流行的应用系统 有了 web 站点 企业可以充分展示自己的作品 宣传企业形象 web 站点还为企业提供了与客户交流 电子商务交易平台等丰富的网络应用 Apache HTTP Server 是 ASF 旗下
  • mycat实现mysql读写分离,热切换,集群

    在互联网时代 实现mysql读写分离 热切换 集群能大大提高mysql数据库访问压力 防止数据丢失 使用mycat能帮我们实现这些 我们要实现的是这种架构 1 Mycat能实现数据库的垂直切分和水平切分 这里用户写数据的时候 通过mycat
  • Linux 上的NetworkManager示例

    如果您是一位经验丰富的系统管理员 并且专注于网络管理 那么您可能已经听说过NetworkManager NetworkManager于 2004 年发布 由 Red Hat 开发 是一组不同的工具 主要是接口 旨在促进系统上的网络管理 如果
  • C - 选票统计

    Description 某校学生会主席由全校学生投票选举产生 共有 名候选人报名参选 编号为1到 0 1000 全校有 名学生 0 30000 每人都可以投票 但每人只能投一票 每票只能选1名候选人 请你设计一个程序能够统计出哪个候选人得票
  • FP-growth算法(仅理解部分,代码待更新)

    FP growth算法 仅理解部分 代码待更新 1 简介 2 构建FP树 2 1 FP树简介 2 2 FP树的构建步骤 2 3 FP树的构建实例 step1 扫描数据集 对所有元素项的出现次数进行计数 step2 去掉不满足最小支持度的元素