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学习笔记_数据排序方法
May 22 Python
Python基于PycURL实现POST的方法
Jul 25 Python
Python matplotlib画图实例之绘制拥有彩条的图表
Dec 28 Python
wxPython之解决闪烁的问题
Jan 15 Python
JavaScript实现一维数组转化为二维数组
Apr 17 Python
解决Python print 输出文本显示 gbk 编码错误问题
Jul 13 Python
Python中asyncio与aiohttp入门教程
Oct 16 Python
python读写csv文件的方法
Aug 13 Python
JAVA SWT事件四种写法实例解析
Jun 05 Python
如何将anaconda安装配置的mmdetection环境离线拷贝到另一台电脑
Oct 15 Python
详解python3 GUI刷屏器(附源码)
Feb 18 Python
Github 使用python对copilot做些简单使用测试
Apr 14 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 获取文件路径(灵活应用__FILE__)
2013/02/15 PHP
YII2.0之Activeform表单组件用法实例
2016/01/09 PHP
PHP各种异常和错误的拦截方法及发生致命错误时进行报警
2016/01/19 PHP
php获得文件夹下所有文件的递归算法的简单实例
2016/11/01 PHP
js checkbox(复选框) 使用集锦
2009/04/28 Javascript
JQuery jsonp 使用示例代码
2009/08/12 Javascript
javascript 导出数据到Excel(处理table中的元素)
2009/12/18 Javascript
解决遍历时Array.indexOf产生的性能问题
2012/07/03 Javascript
JavaScript控制Session操作方法
2013/01/17 Javascript
Bootstrap嵌入jqGrid,使你的table牛逼起来
2016/05/05 Javascript
精彩的Bootstrap案例分享 重点在注释!(选项卡、栅格布局)
2016/07/01 Javascript
js当前页面登录注册框,固定div,底层阴影的实例代码
2016/10/04 Javascript
JavaScript事件方法(实例讲解)
2017/06/27 Javascript
jquery实现的简单轮播图功能【适合新手】
2018/08/17 jQuery
Vue将页面导出为图片或者PDF
2020/08/17 Javascript
Angular 中使用 FineReport不显示报表直接打印预览
2019/08/21 Javascript
package.json配置文件构成详解
2019/08/27 Javascript
Node如何后台数据库使用增删改查功能
2019/11/21 Javascript
原生JS实现微信通讯录
2020/06/18 Javascript
python cx_Oracle的基础使用方法(连接和增删改查)
2017/11/19 Python
python3.6.3安装图文教程 TensorFlow安装配置方法
2020/06/24 Python
解决Django Haystack全文检索为空的问题
2020/05/19 Python
地图可视化神器kepler.gl python接口的使用方法
2020/12/22 Python
端口镜像是怎么实现的
2014/03/25 面试题
学习党章思想汇报
2014/01/07 职场文书
公务员政审个人鉴定
2014/02/25 职场文书
中学生英语演讲稿
2014/04/26 职场文书
公司口号大全
2014/06/11 职场文书
家属慰问信
2015/02/14 职场文书
校园安全教育心得体会
2016/01/15 职场文书
员工给公司的建议书
2019/06/24 职场文书
2019最新劳动仲裁申请书!
2019/07/08 职场文书
怎么用Python识别手势数字
2021/06/07 Python
浅析Python实现DFA算法
2021/06/26 Python
Spring 使用注解开发
2022/05/20 Java/Android
mysql字段为NULL索引是否会失效实例详解
2022/05/30 MySQL