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中列表(list)操作方法汇总
Aug 18 Python
python简单程序读取串口信息的方法
Mar 13 Python
python 实现上传图片并预览的3种方法(推荐)
Jul 14 Python
Python实现高斯函数的三维显示方法
Dec 29 Python
python文件写入write()的操作
May 14 Python
使用pycharm在本地开发并实时同步到服务器
Aug 02 Python
Django 导出项目依赖库到 requirements.txt过程解析
Aug 23 Python
python实现一个猜拳游戏
Apr 05 Python
TensorFlow固化模型的实现操作
May 26 Python
Python是怎样处理json模块的
Jul 16 Python
Python 通过爬虫实现GitHub网页的模拟登录的示例代码
Aug 17 Python
Django 如何实现文件上传下载
Apr 08 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数组是否为空的代码
2011/09/08 PHP
PHP中trim()函数简单使用指南
2015/04/16 PHP
php类的定义与继承用法实例
2015/07/07 PHP
PHP使用fopen与file_get_contents读取文件实例分享
2016/03/04 PHP
php微信支付之公众号支付功能
2018/05/30 PHP
js下判断 iframe 是否加载完成的完美方法
2010/10/26 Javascript
jQuery 源码分析笔记(6) jQuery.data
2011/06/08 Javascript
浅析IE10兼容性问题(frameset的cols属性)
2014/01/03 Javascript
使用javascript获取页面名称
2014/12/23 Javascript
javascript操作select元素实例分析
2015/03/27 Javascript
通过伪协议解决父页面与iframe页面通信的问题
2015/04/05 Javascript
JavaScript中关键字 in 的使用方法详解
2016/10/17 Javascript
详解微信小程序开发之城市选择器 城市切换
2017/01/17 Javascript
javascript容错处理代码(屏蔽js错误)
2017/01/20 Javascript
JavaScript函数柯里化原理与用法分析
2017/03/31 Javascript
详解jquery和vue对比
2019/04/16 jQuery
JavaScript适配器模式原理与用法实例详解
2020/03/09 Javascript
详解vue中在父组件点击按钮触发子组件的事件
2020/11/13 Javascript
python实现堆栈与队列的方法
2015/01/15 Python
分享Python文本生成二维码实例
2016/01/06 Python
Python读写docx文件的方法
2018/05/08 Python
多个python文件调用logging模块报错误
2020/02/12 Python
Python流程控制语句的深入讲解
2020/06/15 Python
荷兰皇家航空公司中国官网:KLM中国
2017/12/13 全球购物
Baby Tulai澳大利亚:美国婴儿背带品牌
2018/10/15 全球购物
JS原生实现轮播图的几种方法
2021/03/23 Javascript
食品业务员岗位职责
2014/03/18 职场文书
争先创优活动总结
2014/08/27 职场文书
代收款委托书范本
2014/10/01 职场文书
2014年小学数学工作总结
2014/12/12 职场文书
会计求职自荐信
2015/03/26 职场文书
2016年小学生迎国庆广播稿
2015/12/18 职场文书
《只有一个地球》教学反思
2016/02/16 职场文书
Python中相见恨晚的技巧
2021/04/13 Python
weblogic服务建立数据源连接测试更新mysql驱动包的问题及解决方法
2022/01/22 MySQL
Python必备技巧之字符数据操作详解
2022/03/23 Python