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 生成目录树及显示文件大小的代码
Jul 23 Python
Python高级应用实例对比:高效计算大文件中的最长行的长度
Jun 08 Python
python使用urlparse分析网址中域名的方法
Apr 15 Python
Python中创建字典的几种方法总结(推荐)
Apr 27 Python
使用python在本地电脑上快速处理数据
Jun 22 Python
Python代码实现KNN算法
Dec 20 Python
python SSH模块登录,远程机执行shell命令实例解析
Jan 12 Python
Python3.5 创建文件的简单实例
Apr 26 Python
详解Python的hasattr() getattr() setattr() 函数使用方法
Jul 09 Python
解决Pytorch 训练与测试时爆显存(out of memory)的问题
Aug 20 Python
Python 文件数据读写的具体实现
Jan 24 Python
Python加载数据的5种不同方式(收藏)
Nov 13 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日期转时间戳,指定日期转换成时间戳
2012/07/17 PHP
PHP 线程安全与非线程安全版本的区别深入解析
2013/08/06 PHP
php文件夹与文件目录操作函数介绍
2013/09/09 PHP
PHP正则表达式函数preg_replace用法实例分析
2020/06/04 PHP
Google 静态地图API实现代码
2010/11/19 Javascript
JavaScript创建对象的写法
2013/08/29 Javascript
js中传递特殊字符(+,&)的方法
2014/01/16 Javascript
js生成缩略图后上传并利用canvas重绘
2014/05/15 Javascript
js创建对象的区别示例介绍
2014/07/24 Javascript
PHP中使用微秒计算脚本执行时间例子
2014/11/19 Javascript
JavaSacript中charCodeAt()方法的使用详解
2015/06/05 Javascript
JavaScript如何获取数组最大值和最小值
2015/11/18 Javascript
JavaScript表单验证实例之验证表单项是否为空
2016/01/10 Javascript
jQuery实现select下拉框获取当前选中文本、值、索引
2017/05/08 jQuery
vue.js框架实现表单排序和分页效果
2017/08/09 Javascript
layui动态渲染生成左侧3级菜单的方法(根据后台返回数据)
2019/09/23 Javascript
微信小程序实现Swiper轮播图效果
2019/11/22 Javascript
JS数组方法push()、pop()用法实例分析
2020/01/18 Javascript
如何在微信小程序中使用骨架屏的步骤
2020/06/12 Javascript
Element Card 卡片的具体使用
2020/07/26 Javascript
[55:32]2018DOTA2亚洲邀请赛 4.4 淘汰赛 EG vs LGD 第二场
2018/04/05 DOTA
从零学Python之入门(四)运算
2014/05/27 Python
Python小白必备的8个最常用的内置函数(推荐)
2019/04/03 Python
pycharm设置鼠标悬停查看方法设置
2019/07/29 Python
python绘制雪景图
2019/12/16 Python
关于Python3爬虫利器Appium的安装步骤
2020/07/29 Python
python中pickle模块浅析
2020/12/29 Python
用css3制作纸张效果(外翻卷角)
2013/02/01 HTML / CSS
煤矿班组长竞聘书
2014/03/31 职场文书
对孩子的寄语
2014/04/09 职场文书
2014最新房贷收入证明范本
2014/09/12 职场文书
2015年企业工作总结范文
2015/04/28 职场文书
大学体育课感想
2015/08/10 职场文书
用Python爬取英雄联盟的皮肤详细示例
2021/12/06 Python
Arthas排查Kubernetes中应用频繁挂掉重启异常
2022/02/28 MySQL
MySQL分区路径子分区再分区
2022/04/13 MySQL