FP-Growth算法之FP-tree的构造(python)
来源:互联网 发布:wifi破解源代码 c语言 编辑:程序博客网 时间:2024/05/20 16:00
前言:
关于 FP-Growth 算法介绍请见:FP-Growth算法的介绍。
本文主要介绍 FP-tree 的构造算法,关于伪代码请查看上面的文章。
上接:FP-Growth算法python实现;下接:FP-Growth算法之频繁项集的挖掘(python)。
正文:
#coding=utf-8import tree_buildingclass Tree_builder(object): """tree_builder类。 作用:根据事务数据集进行数据准备及构造树.""" def __init__(self, routines, min_sup=-1, counts=[], headerTable={}): """类的初始化。 routines:事务数据集; min_sup:最小支持度及数; counts:每个事务出现的次数,默认为1; headerTable:头结点表,建造的FP_tree各结点的索引表。""" self.routines = routines self.counts = counts self.min_sup = min_sup self.items = self.getItems(self.routines) #获取所有项 self.sortedItems = self.getSortedItems(self.items) #对所有项进行并排序,把计数小于min_sup的项移除,生成有序的频繁1-项集 self.itemsTable = self.initItemsTable(headerTable) self.tree = self.treeBuilding(self.counts) def getItems(self, routines): """功能:扫描事务数据集,返回它的项集即各项的计数""" items = {} for routine in routines: for elem in routine: items.setdefault(elem,0) items[elem] += 1 return items def getSortedItems(self, items=None): """功能:对项集进行排序,并删去非频繁项,得到频繁1-项集""" sortedItems = [] temp = sorted(items.iteritems(), key=lambda asd:asd[1], reverse=True) #对字典items进行排序 for elem in temp: if elem[1] >= self.min_sup: #只取计数大于等于最小支持度及数的项 sortedItems.append(elem[0]) return sortedItems def getSortedRoutine(self, routine): """功能:根据排序好的频繁1-项集对某一条事务routine进行排序""" sortedRoutine = [] for elem in self.sortedItems: if elem in routine: sortedRoutine.append(elem) return sortedRoutine def initItemsTable(self, itemsTable): """功能:头结点表的初始化""" for item in self.sortedItems: itemsTable.setdefault(item,[]) return itemsTable def treeBuilding(self, counts): """功能:逐条取出事务,控制FP_Tree树的构造""" tree = tree_building.Tree(itemTable=self.itemsTable) #生成一个树对象 for routine in self.routines: #对事物数据集中的事务,逐条进行构造树 sortedRoutine = self.getSortedRoutine(routine) #用一条事务构造树之前先进行排序 if counts: #如果counts不为空,即是在用模式基在构造条件树,此时需要考虑模式基的计数 count = counts.pop(0) else: count =1 tree.addRoutine(routine=sortedRoutine, Rroot=tree.root, count=count) #用排序好的事务构造树 return tree
tree_builder.py 文件主要实现两个动作:
- 数据预处理(包括项的搜索和排序、头结点表的初始化、事务的排序等)
- 根据事务,调用 Tree.addRoutine() 构造树。
#coding=utf-8class Node(object): """Node类. 作用:开辟一个树节点""" def __init__(self, data=-1, count=0, parent=None): """Node类的初始化, 一个节点信息包括:项的值,计数,父亲节点,所有孩子节点""" self.data = data self.count = count self.parent = parent self.children = {}class Tree(object): """tree_growth类. 作用:建造树""" def __init__(self, data=-1, parent=None, itemTable=None): """tree_growth类的初始化,开辟一个树根""" self.root = Node(data='null', parent=self) self.itemTable = itemTable def addRoutine(self, routine, Rroot, count): """功能:根据事务routine递归构造树, Rroot是树的根节点, count是routine出现的次数(构造条件FP_tree的时候游泳)""" if len(routine) <= 0: #如果事务为空,则终止 return elem = routine.pop(0) if elem in Rroot.children: #如果事务中的元素在树的已有路径上 nextNode = Rroot.children[elem] #如果事务中的元素在树的已有路径上 ,则不用新建路径 else: #否则,新建一条路径 newNode = Node(data=elem, parent=Rroot) #新建一个节点 Rroot.children.setdefault(elem,newNode) #新节点的路径放在当前节点的孩子列表中 nextNode = newNode nextNode.count += count #更新路径上节点的计数,即加上当前节点的计数 if nextNode not in self.itemTable[elem]: #如果下一个节点是新建的,则把它压入头结点表中 self.itemTable[elem].append(nextNode) self.addRoutine(routine=routine, Rroot=nextNode, count=count) #递归构造树 return
tree_building.py文件主要包含两个类:
- Node类用来存放树节点信息。
- Tree类主要实现树的构造。addRoutine() 方法根据事务 routine 中的项递归构造树。
备注:该代码是在 Python2.7+eclipse 环境下编写的。可在eclipse中导入项目,也可在命令行窗口用python命令执行“__init__.py”文件。
转载请注明出处,谢谢!(原文链接:http://blog.csdn.net/bone_ace/article/details/46747669)
0 0
- FP-Growth算法之FP-tree的构造(python)
- 数据挖掘 关联规则的FP-growth-tree(FP增长树)的python实现(二)
- 数据挖掘 关联规则的FP-growth-tree(FP增长树)的python实现 使用方法
- FP-Growth算法python实现
- FP-Growth算法之频繁项集的挖掘(python)
- 经典的FP-Growth算法
- FP-Growth算法的介绍
- Apriori算法改进--FP-Tree(FP-Growth)算法
- 数据挖掘 关联规则的FP-growth-tree(FP增长树)的python实现(一)
- 基于FP-tree的关联规则挖掘FP-growth算法基本思想
- 基于FP-Tree的关联规则FP-Growth推荐算法基本思想
- 基于FP-Tree的关联规则FP-Growth推荐算法Java实现
- 关联分析的FP-growth算法 in Python
- Python基础原理:FP-growth算法的构建
- 关联规则算法之FP growth算法
- 频繁模式算法之FP-Growth算法
- [Python]FPG(FP-growth)算法核心实现
- FP-growth 算法
- hdu 5226 Tom and matrix && BestCoder Round #40
- dbf文件使用python读取程序
- LeetCode Summary Ranges(简单的数组处理)
- 从今天开始
- 黑马程序员----java中的多线程基础
- FP-Growth算法之FP-tree的构造(python)
- 使用爬虫获取彩票开奖结果
- 活动推荐 | 听说 PHP 是最好的语言 - 和 OneAPM 一起参与上海 PHPCon 技术盛宴吧
- 2015070306 - EffactiveJava笔记 - 第55条 谨慎地进行优化(2)
- UDP协议程序设计中的几个问题
- if练习 和 缓冲区清除
- 【C++ Primer Plus学习笔记】第二章:一个函数的基本的组成
- c++异常处理,,,同时处理除数为0以及开根号内部不能小于0
- json和jsonp的区别