事务集过滤重排:

#FP树节点结构
class treeNode:
def __init__(self,nameValue,numOccur,parentNode):
self.name=nameValue#节点名
self.count=numOccur#出现次数
self.nodeLink=None#链接相似的元素
self.parent=parentNode#当前节点的父节点
self.children={}#子节点集 #为count增加指定值
def inc(self,numOccur):
self.count += numOccur
#将树以文本方式显示,用于调试
def disp(self,ind=1):
print(' '*ind,self.name,' ',self.count)
for child in self.children.values():
child.disp(ind+1) #minSup:最小支持度
#由于用例中存在出现次数相同的项如t和 y所以每次排序结果可能会不同从而导致最终的FP树有所不同,但应该是等价的
def createTree(dataSet,minSup=1):
headerTable={}
#循环遍历数据集两次
for trans in dataSet:#trans:事务
for item in trans:#item:元素
headerTable[item]=headerTable.get(item,0)+dataSet[trans]#headerTable中已有的次数+事务中出现的1次
#❶(以下三行) 移除不满足最小支持度的元素项,headerTable中的key即为具体元素
for k in list(headerTable.keys()):
if headerTable[k]<minSup:
del(headerTable[k])
freqItemsSet=set(headerTable.keys())#转换为集合得到频繁项集(去除重复)
#❷ 如果没有元素项满足要求, 则退出
if len(freqItemsSet)==0:return None,None
#第二次遍历获得头指针表(元素:元素出现次数,相似元素指针)
for k in headerTable:
headerTable[k]=[headerTable[k],None]
retTree=treeNode('Null Set',1,None)#树初始化:空集:1 无父节点
for tranSet,count in dataSet.items():
localD={}
#❸(以下三行) 根据全局频率对每个事务中的元素进行排序
for item in tranSet:
if item in freqItemsSet:
localD[item]=headerTable[item]#找出所有事务中的频繁项(元素:元素出现次数)集合
if len(localD)>0:
orderedItems=[v[0] for v in sorted(localD.items(),key=lambda p:str(p[1]),reverse=True)]
#❹ 使用排序后的频率项集对树进行填充
updateTree(orderedItems,retTree,headerTable,count)#orderedItems:事务中删除非频繁项并逆向排序后剩余的元素集合
return retTree,headerTable def updateTree(items,inTree,headerTable,count): if items[0] in inTree.children:#该元素已存在,直接增加出现次数值
inTree.children[items[0]].inc(count)
else:
inTree.children[items[0]] = treeNode(items[0], count, inTree)#不存在,直接添加,使其父节点指向inTree
if headerTable[items[0]][1]==None:#如果头表目标节点为空,则将其指向inTree
headerTable[items[0]][1]=inTree.children[items[0]]#更新头表
else:#头结点指针不为空,则顺着该指针一直找到链表尾部,并将尾节点指针指向新插入节点
updateHeader(headerTable[items[0]][1],inTree.children[items[0]])#否则,指向新节点(inTree对应孩子节点,逆序排序,后来指向的出现次数变少)
if len(items)>1:
#❺ 对剩下的元素项迭代调用updateTree函数
updateTree(items[1::],inTree.children[items[0]],headerTable,count)#每次调用时从列表中后一个元素开始 #使链表的尾部指向新节点
def updateHeader(nodeToTest,targetNode):
while(nodeToTest.nodeLink!=None):
nodeToTest=nodeToTest.nodeLink
nodeToTest.nodeLink=targetNode#链接上当前节点 def loadSimpDat():
simpDat=[['r','z','h','j','p'],
['z','y','x','w','v','u','t','s'],
['z'],
['r','x','n','o','s'],
['y','r','x','z','q','t','p'],
['y','z','x','e','q','s','t','m']]
return simpDat def createInitSet(dataSet):
retDict={}
for trans in dataSet:
retDict[frozenset(trans)]=1
return retDict

最终创建的树为(由于存在出现次数相同的元素 如t 和 y,可能会导致每次排序结果不一致从而使最终产生的树结果也不相同,但所有的树都应该是等价的):

来源:本人博客

fp-growth树创建代码及详细注释的更多相关文章

  1. Umi + Dva的数据传递学习Demo(代码有详细注释)

    刚学习时写了篇笔记,以免自己忘记,用了一段时间后,觉得不如做个demo,代码写上注释,方便也在学习umi-dva的同学们理解更好,更容易上手. 这可能是网上注释最多,看了最易理解的学习小指南吧,哈哈. ...

  2. Objective-C 【电商APP应用代码-系统分析-详细注释-代码实现】

    ------------------------------------------- 电商APP应用 ************************************************ ...

  3. KMP的原理和代码实现(详细注释|参考多个博客总结|可作为模板)

    KMP算法解决的问题是字符匹配,是由Knuth–Morris–Pratt共同开发出来的,这个算法把字符匹配的时间复杂度缩小到O(m+n),而空间复杂度也只有O(m),n是target的长度,m是pat ...

  4. 倍增法求LCA代码加详细注释

    #include <iostream> #include <vector> #include <algorithm> #define MAXN 100 //2^MA ...

  5. Qt5_简易画板_详细注释

    代码下载链接:  http://pan.baidu.com/s/1hsc41Ek 密码: 5hdg 显示效果如下: 代码附有详细注释(代码如下) /*** * 先新建QMainWindow, 项目名称 ...

  6. 51nod 1126 求递推序列的第N项 思路:递推模拟,求循环节。详细注释

    题目: 看起来比较难,范围10^9 O(n)都过不了,但是仅仅是看起来.(虽然我WA了7次 TLE了3次,被自己蠢哭) 我们观察到 0 <= f[i] <= 6 就简单了,就像小学初中学的 ...

  7. 紫书 例题8-17 UVa 1609 (构造法)(详细注释)

    这道题用构造法, 就是自己依据题目想出一种可以得到解的方法, 没有什么规律可言, 只能根据题目本身来思考. 这道题的构造法比较复杂, 不知道刘汝佳是怎么想出来的, 我想的话肯定想不到. 具体思路紫书上 ...

  8. X86汇编——计算斐波那契数列程序(详细注释和流程图说明)

    X86汇编实现斐波那契数列 程序说明: 输入斐波那契数列的项数, 然后依次输出斐波那契数列, 输入的项数小于256且为数字, 计算的项数不能超过2^16次方, 输入失败是 不会回显数字 因为存结果是A ...

  9. C#/WPF/WinForm/.NET程序代码实现软件程序开机自动启动的两种常用方法的示例与源码下载带详细注释-源码代码-注册表方式-启动目录快捷方式

    C#/WPF/WinForm/.NET程序代码实现软件程序开机自动启动的两种常用方法的示例与源码下载带详细注释-源码代码-注册表方式-启动目录快捷方式 C#实现自动启动的方法-两种方法 源码下载地址: ...

随机推荐

  1. LeetCode18.四数之和 JavaScript

    给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满 ...

  2. Matplotlib——初级

    matplotlib是一个专门用来绘图的库,在分析数据的时候,使用它可以将数据进行可视化,更直观的呈现.下面是几个通过matplot绘制的图. 通过图形的绘制,我们可以很清晰地看到数据直接的关系,并对 ...

  3. JS原生示例 案例 学习

    写在前面 原生JS是原理,框架是迎合业务需求的重要关键工具 本文是整理工作及学习中理解的基础和难点,便于多方位理解功能模块整合和使用 不定期更新 行文仓促,文中有错误在所难免,欢迎诸位指正 trans ...

  4. Oracle创建序列,Oracle创建序列语法

    -- Oracle创建序列 Create sequence CREATE SEQUENCE SEQ_SINGER -- 序列名称  START WITH 2 -- 开始数字  MAXVALUE 999 ...

  5. #leetcode刷题之路12-整数转罗马数字

    罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值I 1V 5X 10L 50C 100D 500M 1000 例如, 罗马数字 2 写做 II ,即为两个并列的 1.12 ...

  6. IDEA一直提示 错误: 找不到或无法加载主类

    1.把http://repo1.maven.org/maven2...下载下来2.放到本地Manen仓库archetype 文件夹下3.设置IDEA Maven->Runner 界面的VM Op ...

  7. Systemd简介与使用

    按下电源键,随着风扇转动的声音,显示器上开启的图标亮起.之后,只需要静静等待几秒钟,登录界面显示,输入密码,即可愉快的玩耍了. 这是我们大概每天都做的事情.那么中间到底发生了什么? 简单地说,从BIO ...

  8. Android 微信页面刷新问题

    今天测试妹纸提了个bug,Android手机用微信打开测试页面,刷新功能无效.因为开发时懒,只验证了Ios手机无异常,没有注意打安卓这个问题. 我是直接用的window.location.reload ...

  9. Vagrant 总结

    引言   本文将讨论Vagrant基础应用,高级应用,基于Vagrant 的虚拟机优化,Vagrant的优势及区别等四部分   参考资料: [阿里云教程中心]Docker学习总结之Docker与Vag ...

  10. 网站用户行为分析——HBase的安装与配置

    Hbase介绍 HBase是一个分布式的.面向列的开源数据库,源于Google的一篇论文<BigTable:一个结构化数据的分布式存储系统>.HBase以表的形式存储数据,表有行和列组成, ...