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中的zip函数使用示例
Jan 29 Python
详解Python的Django框架中的模版相关知识
Jul 15 Python
Python数据类型详解(二)列表
May 08 Python
神经网络python源码分享
Dec 15 Python
Python2和Python3中urllib库中urlencode的使用注意事项
Nov 26 Python
python 利用文件锁单例执行脚本的方法
Feb 19 Python
python中时间模块的基本使用教程
May 14 Python
Python识别快递条形码及Tesseract-OCR使用详解
Jul 15 Python
Python简易版图书管理系统
Aug 12 Python
简单了解python装饰器原理及使用方法
Dec 18 Python
浅谈tensorflow之内存暴涨问题
Feb 05 Python
通过Python实现Payload分离免杀过程详解
Jul 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
在“咖啡之国”感受咖啡文化
2021/03/03 咖啡文化
解析func_num_args与func_get_args函数的使用
2013/06/24 PHP
curl实现站外采集的方法和技巧
2014/01/31 PHP
PHP PDOStatement::nextRowset讲解
2019/02/01 PHP
javascript当onmousedown、onmouseup、onclick同时应用于同一个标签节点Element
2010/01/05 Javascript
使用jQuery实现的掷色子游戏动画效果
2014/03/14 Javascript
Nodejs极简入门教程(一):模块机制
2014/10/25 NodeJs
Nodejs关于gzip/deflate压缩详解
2015/03/04 NodeJs
JavaScript之Vue.js【入门基础】
2016/12/06 Javascript
JS变量中有var定义和无var定义的区别以及es6中let命令和const命令
2017/02/19 Javascript
微信小程序实现验证码获取倒计时效果
2018/02/08 Javascript
使用vue2实现购物车和地址选配功能
2018/03/29 Javascript
vue 微信授权登录解决方案
2018/04/10 Javascript
element-ui表格数据转换的示例代码
2018/08/24 Javascript
如何实现双向绑定mvvm的原理实现
2019/05/28 Javascript
监控微信小程序中的慢HTTP请求过程详解
2019/07/05 Javascript
Vue项目实现换肤功能的一种方案分析
2019/08/28 Javascript
微信自定义分享链接信息(标题,图片和内容)实现过程详解
2019/09/04 Javascript
jQuery实现鼠标滑动切换图片
2020/05/27 jQuery
解决VueCil代理本地proxytable无效报错404的问题
2020/11/07 Javascript
mustache.js实现首页元件动态渲染的示例代码
2020/12/28 Javascript
python使用rpc框架gRPC的方法
2018/08/24 Python
解决每次打开pycharm直接进入项目的问题
2018/10/28 Python
详解python和matlab的优势与区别
2019/06/28 Python
在python中用print()输出多个格式化参数的方法
2019/07/16 Python
使用python和pygame制作挡板弹球游戏
2019/12/03 Python
pytorch 数据处理:定义自己的数据集合实例
2019/12/31 Python
python剪切视频与合并视频的实现
2020/03/03 Python
Python如何省略括号方法详解
2020/03/21 Python
给ubuntu18安装python3.7的详细教程
2020/06/08 Python
python 调整图片亮度的示例
2020/12/03 Python
html5 input元素新特性_动力节点Java学院整理
2017/07/06 HTML / CSS
电台编导求职信
2014/05/06 职场文书
广告学专业毕业生自荐信
2014/05/28 职场文书
大学生党课心得体会
2016/01/07 职场文书
《百分数的认识》教学反思
2016/02/19 职场文书