清华《数据挖掘算法与应用》FP-Growth算法

【例 8.7】实现FP 树算法,并对模拟数据集 simpDat挖掘频繁项集,最小支持度为2,绘制 FP树并输出频繁项集。 

运行结果:

 

声明:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

# -*- coding: utf-8 -*-
"""
Created on Mon Mar 31 10:14:48 2025@author: 破无差
"""
# - * - coding: utf-8 - * -class treeNode:    # FP 树的类定义def __init__(self, nameValue, numOccur, parentNode):self.name = nameValueself.count = numOccurself.nodeLink = None    # 不同项集的相同项通过 nodeLink 连接self.parent = parentNodeself.children = {}# 存储叶子节点def inc(self, numOccur):    # 节点出现次数累加self.count += numOccurdef disp(self, ind=1):    # 将树以文本形式显示print(' ' * ind, self.name, ' ', self.count)for child in self.children.values(): # 绘制子节点child.disp(ind + 1)    # 缩进处理def createTree(dataSet, minSup=1):    # 构建 FP 树headerTable = {}for trans in dataSet:    # 遍历数据表中的每一行数据# 遍历每一行的每一个数据元素,统计每一项出现的次数,将次数保存在 headerTable 中for item in trans:# get 函数返回指定键的值,如果值不在字典中返回 0,其中 dataSet[trans]=1headerTable[item] = headerTable.get(item, 0) + dataSet[trans]lessThanMinsup = list(filter(lambda k:headerTable[k]<minSup, headerTable .keys()))# 遍历 headerTable 中的每一项,若一项出现的次数小于 minSup,则把该项删除for k in lessThanMinsup:del(headerTable[k])for k in list(headerTable):if headerTable[k]<minSup:del(headerTable[k])# 将出现次数在 minSup 次以上的项保存在 freqItemSet 中freqItemSet = set(headerTable.keys())if len(freqItemSet) == 0:    # 如果 freqItemSet 为空,则返回 Nonereturn None, Nonefor k in headerTable:# 保存计数值及指向每种类型第一个元素的指针headerTable[k] = [headerTable[k], None]retTree = treeNode('Null Set', 1, None)   # 初始化 FP 树for tranSet, count in dataSet.items():   # 遍历 dataSet 的数据,累计出现次数localD = {}for item in tranSet:    #遍历一组数据中的每一项if item in freqItemSet:localD[item] = headerTable[item][0]if len(localD)>0:ordereItems = [v[0] for v in sorted(localD.items(), key=lambda p: (p[1],p[0]), reverse=True)]updateTree(ordereItems, retTree, headerTable, count)return retTree, headerTable    #对 FP 树进行更新def updateTree(items, infree, headerTable, count):    #返回 FP 树和头指针表if items[0] in infree.children:    #更新 FP 树infree.children[items[0]].inc(count)    #检查是否存在该节点else:    #存在则计数增加infree.children[items[0]] = treeNode(items[0], count, infree)#创建新节点if headerTable[items[0]][1] == None:    #若不存在该类别,则更新头指针列表headerTable[items[0]][1] = infree.children[items[0]]else:updateHeader(headerTable[items[0]][1], infree.children[items[0]])if len(items)>1:    #仍有未分配的项updateTree(items[1:], infree.children[items[0]], headerTable, count)def updateHeader(nodeToTest, targetNode):    #更新 FP 树while(nodeToTest.nodeLink !=None):nodeToTest = nodeToTest.nodeLinknodeToTest.nodeLink = targetNodedef loadSimpDat():    #创建数据集simpDat = [['11', '12', '15'],['12', '14'], ['12', '13'], ['11', '12', '14'], ['11', '13'], ['12', '13'], ['11', '13'], ['11', '12', '13', '15'],['11', '12', '13']]return simpDatdef createInitSet(dataSet):#将数据集中的数据项转换为 frozenset 并保存在字典中,其值均为 1retDict = {}for trans in dataSet:fset = frozenset(trans)retDict.setdefault(fset, 0)retDict[fset] += 1# retDict[frozenset(trans)] = 1return retDictdef ascendTree(leafNode, prefixPath):    #寻找当前非空节点的前缀if leafNode.parent != None:prefixPath.append(leafNode.name)    #将当前节点添加到前缀列表中ascendTree(leafNode.parent, prefixPath)    #递归遍历所有前缀路径中的节点def findPrefixPath(basePat, treeNode):    #返回条件模式基condPats = {}while treeNode != None:prefixPath = []ascendTree(treeNode, prefixPath)    #寻找当前非空节点的前缀if len(prefixPath)>1:condPats[frozenset(prefixPath[1:])] = treeNode.count#将前缀路径保存入字典treeNode = treeNode.nodeLink    #到下一个频繁项集出现的位置return condPats    #返回条件模式基def mineTree(inTree, headerTable, minSup, prefix, freqItemList):#从头指针表的底端开始,递归查找频繁项集bigL = [v[0] for v in sorted(headerTable.items(), key=lambda p: str(p[1]))]for basePat in bigL:newFreqSet = prefix.copy()    #加入频繁项表newFreqSet.add(basePat)freqItemList.append(newFreqSet)condPattBases = findPrefixPath(basePat, headerTable[basePat][1])#创造条件基myContTree, myHead = createTree(condPattBases, minSup)#构建条件 FP 树if myHead != None:    #挖掘条件 FP 树,直到其中没有元素为止print('conditional tree for: ', newFreqSet)myContTree.disp(1)mineTree(myContTree, myHead, minSup, newFreqSet, freqItemList)if __name__ == '__main__': simpDat = loadSimpDat()initSet = createInitSet(simpDat)myFptree, myHeaderTab = createTree(initSet, 2)freqItems = []mineTree(myFptree, myHeaderTab, 2, set([]), freqItems)print(freqItems)

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

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

相关文章

npm 项目命名规则

以下是 npm 项目命名规则的详细说明&#xff1a; 一、核心命名规则 必须使用小写字母 名称中不能包含大写字母。原因&#xff1a; 跨平台兼容性&#xff08;如 Linux 区分大小写&#xff0c;而 Windows 不区分&#xff09;。避免命令行和 URL 中的大小写冲突&#xff08;例如包…

Ubertool 的详细介绍、安装指南及使用说明

Ubertool&#xff1a;多协议网络分析与调试平台 一、Ubertool 简介 Ubertool 是一款开源的 多协议网络分析工具&#xff0c;专为物联网&#xff08;IoT&#xff09;、嵌入式系统和工业自动化领域设计。它支持蓝牙、Wi-Fi、LoRa、CAN总线等多种通信协议的实时监控、数据包捕获…

AI重构农业:从“面朝黄土“到“数字原野“的产业跃迁—读中共中央 国务院印发《加快建设农业强国规划(2024-2035年)》

在东北黑土地的万亩良田上&#xff0c;无人机编队正在执行精准施肥作业&#xff1b;在山东寿光的智慧大棚里&#xff0c;传感器网络实时调控着番茄生长的微环境&#xff1b;在云南的咖啡种植园中&#xff0c;区块链溯源系统记录着每粒咖啡豆的旅程。这场静默的农业革命&#xf…

FogFL: Fog-Assisted Federated Learning for Resource-Constrained IoT Devices

摘要 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 -在本文中&#xff0c;我们提出了一个支持雾的联邦学习框架–FogFL–来促进资源受限的物联网环境中延迟敏感应用的分布式学习。联邦学习&#xff08;FL&#xff09;是一种流行的分…

linux下编译Websocketpp,适用x86和armv8

编译boost库 下载源文件&#xff1a;Version 1.79.0 编译&#xff1a; sudo ./bootstrap.sh sudo ./b2 install 安装websocketpp git clone https://github.com/zaphoyd/websocketpp.git cd websocketpp #进入目录 mkdir build cd build cmake .. make sudo make ins…

Linux学习笔记——零基础详解:什么是Bootloader?U-Boot启动流程全解析!

零基础详解&#xff1a;什么是Bootloader&#xff1f;U-Boot启动流程全解析&#xff01; 一、什么是Bootloader&#xff1f;&#x1f4cc; 举个例子&#xff1a; 二、U-Boot 是什么&#xff1f;三、U-Boot启动过程&#xff1a;分为两个阶段&#x1f539; 第一阶段&#xff08;汇…

Word 页眉设置(不同章节不同页眉)

需求分析 要给文档设置页眉&#xff0c;但是要不同的页眉不同的页眉 问题点&#xff1a;一旦设置页眉 每个页眉都是一样的 现在要设置不一样的 设置了页眉但是整个文章的页眉都一样 问题解决 取消链接 前一节&#xff08;不和前面的页眉同步更新&#xff09; 小结 不同的…

Debezium日常分享系列之:Debezium3.1版本之增量快照

Debezium日常分享系列之&#xff1a;Debezium3.1版本之增量快照 按需快照触发一次临时增量快照触发临时阻塞快照增量快照增量快照过程如何 Debezium 解决具有相同主键的记录之间的冲突快照窗口触发增量快照使用附加条件运行临时增量快照使用 Kafka 信号通道触发增量快照临时增量…

音视频开发从入门到精通:编解码、流媒体协议与FFmpeg实战指南

音视频开发从入门到精通&#xff1a;编解码、流媒体协议与FFmpeg实战指南 音视频技术作为数字媒体领域的核心&#xff0c;正在成为互联网和移动应用的重要组成部分。本文将全面介绍音视频开发的学习路径&#xff0c;从基础概念到高级应用&#xff0c;从编解码原理到实战案例&a…

bookkeeper基本概念

Apache BookKeeper 架构与基本概念 Apache BookKeeper 的架构 Apache BookKeeper 是一个高性能的分布式日志存储系统&#xff0c;主要用于存储和管理顺序写入的数据。它被设计用来提供低延迟、高吞吐量和强一致性的服务&#xff0c;常用于分布式系统中的日志存储需求&#xf…

Scala相关知识学习总结3

包 - 包声明&#xff1a;和Java类似&#xff0c;作用是区分同名类、管理类命名空间。Scala包名只能含数字、字母等&#xff0c;不能数字开头、不能用关键字。 - 包说明&#xff1a;有类似Java的包管理风格&#xff0c;也有独特嵌套风格。嵌套风格有两个特点&#xff0c;一是&…

在Spring Boot中实现图片上传和修改

1. 图片上传实现步骤 1.1 添加依赖 确保 spring-boot-starter-web 和 spring-boot-starter-validation 已存在&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> <…

网络原理 - HTTP/HTTPS

1. HTTP 1.1 HTTP是什么&#xff1f; HTTP (全称为 “超文本传输协议”) 是⼀种应用非常广泛的应用层协议. HTTP发展史&#xff1a; HTTP 诞生于1991年. 目前已经发展为最主流使用的⼀种应用层协议 最新的 HTTP 3 版本也正在完善中, 目前 Google / Facebook 等公司的产品已经…

第十届MathorCup高校数学建模挑战赛-A题:无车承运人平台线路定价问题

目录 摘 要 一、问题提出 1.1 背景 1.2 问题重述 二、基本假设 三、符号说明 四、问题分析 4.1 问题一的分析 4.2 问题二的分析 4.3 问题三的分析 4.4 问题四的分析 五、模型的建立与求解 5.1 问题一模型的建立与求解 5.1.1 数据预处理 5.1.2 问题一结果检验:因子分析模型 5.2…

C++假期练习

思维导图 牛客练习

Go语言-初学者日记(四):包管理

众所周知——“包”治百病。 理解包与模块&#xff0c;是 Go 迈向工程化开发的关键一环&#xff01; &#x1f4c2; 一、包&#xff08;Package&#xff09;是 Go 的基本组织单位 在 Go 中&#xff0c;每个 .go 文件都属于某个包&#xff08;package&#xff09;&#xff1a; …

Scala面向对象2

1. 抽象属性和方法&#xff1a;用 abstract 关键字定义抽象类&#xff0c;其中抽象属性无初始值&#xff0c;抽象方法无实现 。重写抽象方法需用 override &#xff0c;重写抽象属性时&#xff0c;可变属性用 var &#xff0c;不可变属性用 val 。 匿名子类&#xff1a;和 Jav…

DiffAD:自动驾驶的统一扩散建模方法

25年3月来自新加坡公司 Carion 和北航的论文“DiffAD: A Unified Diffusion Modeling Approach for Autonomous Driving”。 端到端自动驾驶 (E2E-AD) 已迅速成为实现完全自动驾驶的一种有前途的方法。然而&#xff0c;现有的 E2E-AD 系统通常采用传统的多任务框架&#xff0c…

Python四大核心数据结构深度解析:列表、元组、字典与集合

在Python编程语言中&#xff0c;数据结构是组织和存储数据的基本方式。Python提供了四种内置的核心数据结构&#xff1a;列表&#xff08;List&#xff09;、元组&#xff08;Tuple&#xff09;、字典&#xff08;Dictionary&#xff09;和集合&#xff08;Set&#xff09;。这…

网络编程—Socket套接字(TCP)

上篇文章&#xff1a; 网络编程—Socket套接字&#xff08;UDP&#xff09;https://blog.csdn.net/sniper_fandc/article/details/146923670?fromshareblogdetail&sharetypeblogdetail&sharerId146923670&sharereferPC&sharesourcesniper_fandc&sharefro…