FP-growth算法发现频繁项集——发现频繁项集


Posted in Python onJune 24, 2021

上篇介绍了如何构建FP树,FP树的每条路径都满足最小支持度,我们需要做的是在一条路径上寻找到更多的关联关系。

抽取条件模式基

  首先从FP树头指针表中的单个频繁元素项开始。对于每一个元素项,获得其对应的条件模式基(conditional pattern base),单个元素项的条件模式基也就是元素项的关键字。条件模式基是以所查找元素项为结尾的路径集合。每一条路径其实都是一条前辍路径(perfix path)。简而言之,一条前缀路径是介于所?苏以?叵钣胧鞲?诘阒?涞乃?心谌荨?/p>

  下图是以{s:2}或{r:1}为元素项的前缀路径:

FP-growth算法发现频繁项集——发现频繁项集

  {s}的条件模式基,即前缀路径集合共有两个:{{z,x,y,t}, {x}};{r}的条件模式基共三个:{{z}, {z,x,y,t}, {x,s}}。

  寻找条件模式基的过程实际上是从FP树的每个叶子节点回溯到根节点的过程。我们可以通过头指针列表headTable开始,通过指针的连接快速访问到所有根节点。下表是上图FP树的所有条件模式基:

FP-growth算法发现频繁项集——发现频繁项集

创建条件FP树

  为了发现更多的频繁项集,对于每一个频繁项,都要创建一棵条件FP树。可以使用刚才发现的条件模式基作为输入数据,并通过相同的建树代码来构建这些树。然后,递归地发现频繁项、发现条件模式基,以及发现另外的条件树。

  以频繁项r为例,构建关于r的条件FP树。r的三个前缀路径分别是{z},{z,x,y,t},{x,s},设最小支持度minSupport=2,则y,t,s被过滤掉,剩下{z},{z,x},{x}。y,s,t虽然是条件模式基的一部分,但是并不属于条件FP树,即对于r来说,它们不是频繁的。如下图所示,y→t→r和s→r的全局支持度都为1,所以y,t,s对于r的条件树来说是不频繁的。

FP-growth算法发现频繁项集——发现频繁项集

  过滤后的r条件树如下:

FP-growth算法发现频繁项集——发现频繁项集

  重复上面步骤,r的条件模式基是{z,x},{x},已经没有能够满足最小支持度的路径, 所以r的条件树仅有一个。需要注意的是,虽然{z,x},{x}中共存在两个x,但{z,x}中,z是x的父节点,在构造条件FP树时不能直接将父节点移除,仅能从子节点开始逐级移除。

  代码如下

def ascendTree(leafNode, prefixPath):
    if leafNode.parent != None:
        prefixPath.append(leafNode.name)
        ascendTree(leafNode.parent, prefixPath)
def findPrefixPath(basePat, headTable):
    condPats = {}
    treeNode = headTable[basePat][1]
    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=1, preFix=set([]), freqItemList=[]):
    # order by minSup asc, value asc
    bigL = [v[0] for v in sorted(headerTable.items(), key=lambda p: (p[1][0],p[0]))]
    for basePat in bigL:
        newFreqSet = preFix.copy()
        newFreqSet.add(basePat)
        freqItemList.append(newFreqSet)
        # 通过条件模式基找到的频繁项集
        condPattBases = findPrefixPath(basePat, headerTable)
        myCondTree, myHead = createTree(condPattBases, minSup)
        if myHead != None:
            print('condPattBases: ', basePat, condPattBases)
            myCondTree.disp()
            print('*' * 30)
            mineTree(myCondTree, myHead, minSup, newFreqSet, freqItemList)
simpDat = loadSimpDat()
dictDat = createInitSet(simpDat)
myFPTree,myheader = createTree(dictDat, 3)
myFPTree.disp()
condPats = findPrefixPath('z', myheader)
print('z', condPats)
condPats = findPrefixPath('x', myheader)
print('x', condPats)
condPats = findPrefixPath('y', myheader)
print('y', condPats)
condPats = findPrefixPath('t', myheader)
print('t', condPats)
condPats = findPrefixPath('s', myheader)
print('s', condPats)
condPats = findPrefixPath('r', myheader)
print('r', condPats)
mineTree(myFPTree, myheader, 2)

  控制台信息

FP-growth算法发现频繁项集——发现频繁项集

总结

本篇文章就到这了,本例可以发现两个频繁项集{z,x}和{x}。取得频繁项集后,可以根据置信度发现关联规则,这一步较为简单,可参考上篇的相关内容,不在赘述。希望能够给你带来帮助,也希望您能够多多关注三水点靠木的其他精彩内容!

Python 相关文章推荐
玩转python爬虫之爬取糗事百科段子
Feb 17 Python
简单讲解Python中的数字类型及基本的数学计算
Mar 11 Python
Python读大数据txt
Mar 28 Python
python使用邻接矩阵构造图代码示例
Nov 10 Python
浅谈Python中带_的变量或函数命名
Dec 04 Python
python opencv之分水岭算法示例
Feb 24 Python
python opencv实现运动检测
Jul 10 Python
解决Jupyter notebook中.py与.ipynb文件的import问题
Apr 21 Python
python 使用cycle构造无限循环迭代器
Dec 02 Python
django中ImageField的使用详解
Dec 21 Python
Python数据结构之队列详解
Mar 21 Python
使用Python解决图表与画布的间距问题
Apr 11 Python
能让Python提速超40倍的神器Cython详解
Jun 24 #Python
FP-growth算法发现频繁项集——构建FP树
python ansible自动化运维工具执行流程
关于python中readlines函数的参数hint的相关知识总结
详解Python为什么不用设计模式
linux中nohup和后台运行进程查看及终止
Jun 24 #Python
Python面向对象之成员相关知识总结
Jun 24 #Python
You might like
发一个php简单的伪原创程序,配合商城采集用的
2010/10/12 PHP
关于js和php对url编码的处理方法
2014/03/04 PHP
php生成与读取excel文件
2016/10/14 PHP
PHP常用字符串函数小结(推荐)
2018/08/05 PHP
JavaScript的类型简单说明
2010/09/03 Javascript
浅析javascript闭包 实例分析
2010/12/25 Javascript
jQuery EasyUI API 中文文档 - EasyLoader 加载器
2011/09/29 Javascript
javascript学习笔记(八) js内置对象
2012/06/19 Javascript
String.prototype实现的一些javascript函数介绍
2013/11/22 Javascript
js showModalDialog弹出窗口实例详解
2014/01/07 Javascript
原生JS绑定滑轮滚动事件兼容常见浏览器
2014/06/30 Javascript
js中键盘事件实例简析
2015/01/10 Javascript
javascript转换静态图片,增加粒子动画效果
2015/05/28 Javascript
jquery中添加属性和删除属性
2015/06/03 Javascript
JavaScript实现简单的tab选项卡切换
2016/01/05 Javascript
jQuery Easyui 验证两次密码输入是否相等
2016/05/13 Javascript
解析JavaScript数组方法reduce
2016/12/12 Javascript
字太多用...代替的方法(两种)
2017/03/15 Javascript
vue 根据数组中某一项的值进行排序的方法
2018/08/30 Javascript
详解ESLint在Vue中的使用小结
2018/10/15 Javascript
PHP实现基于Redis的MessageQueue队列封装操作示例
2019/02/02 Javascript
vue脚手架项目创建步骤详解
2021/03/02 Vue.js
CSS3 3D制作实战案例分析
2016/09/18 HTML / CSS
使用css实现android系统的loading加载动画
2019/07/25 HTML / CSS
高清屏下canvas重置尺寸引发的问题的解决
2019/10/14 HTML / CSS
天巡全球:Skyscanner Global
2017/06/20 全球购物
欧铁通票官方在线销售网站:Eurail.com
2017/10/14 全球购物
APM Monaco中国官网:来自摩纳哥珠宝品牌
2017/12/27 全球购物
男女钓鱼靴和甲板鞋:XTRATUF
2021/01/09 全球购物
教师旷工检讨书
2014/01/18 职场文书
委托书如何写
2014/08/30 职场文书
国庆横幅标语
2014/10/08 职场文书
2014年政风行风自查自纠报告
2014/10/21 职场文书
你为什么是穷人?可能是这5个缺点造成
2019/07/11 职场文书
健身房被搭讪?用python写了个小米计时器助人为乐
2021/06/08 Python
再谈python_tkinter弹出对话框创建
2022/03/20 Python