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 相关文章推荐
linux系统使用python获取cpu信息脚本分享
Jan 15 Python
python支持断点续传的多线程下载示例
Jan 16 Python
Python脚本实现网卡流量监控
Feb 14 Python
Python中类的定义、继承及使用对象实例详解
Apr 30 Python
python snownlp情感分析简易demo(分享)
Jun 04 Python
python绘图模块matplotlib示例详解
Jul 26 Python
利用Python复制文件的9种方法总结
Sep 02 Python
对tensorflow中的strides参数使用详解
Jan 04 Python
利用Python实现Json序列化库的方法步骤
Sep 09 Python
pyspark对Mysql数据库进行读写的实现
Dec 30 Python
详解Python Celery和RabbitMQ实战教程
Jan 20 Python
Python实现信息管理系统
Jun 05 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/08/27 PHP
Zend Framework实现自定义过滤器的方法
2016/12/09 PHP
PHP如何搭建百度Ueditor富文本编辑器
2018/09/21 PHP
PHP远程连接oracle数据库操作实现方法图文详解
2019/04/11 PHP
JavaScript定时器详解及实例
2013/08/01 Javascript
轻松学习jQuery插件EasyUI EasyUI创建RSS Feed阅读器
2015/11/30 Javascript
JS数组排序方法实例分析
2016/12/16 Javascript
jQuery.cookie.js实现记录最近浏览过的商品功能示例
2017/01/23 Javascript
React学习笔记之事件处理(二)
2017/07/02 Javascript
JavaScript实现的原生态Tab标签页功能【兼容IE6】
2017/09/18 Javascript
如何用原生js写一个弹窗消息提醒插件
2019/05/24 Javascript
JavaScript数组去重实现方法小结
2020/01/17 Javascript
基于vue和bootstrap实现简单留言板功能
2020/05/30 Javascript
vue 解决addRoutes多次添加路由重复的操作
2020/08/04 Javascript
js获取url页面id,也就是最后的数字文件名
2020/09/25 Javascript
一篇文章让你搞懂JavaScript 原型和原型链
2020/11/23 Javascript
python 文件操作api(文件操作函数)
2016/08/28 Python
Python利用flask sqlalchemy实现分页效果
2020/08/02 Python
Window10+Python3.5安装opencv的教程推荐
2018/04/02 Python
python 通过字符串调用对象属性或方法的实例讲解
2018/04/21 Python
python Dijkstra算法实现最短路径问题的方法
2019/09/19 Python
Pytorch 实现sobel算子的卷积操作详解
2020/01/10 Python
python 使用cx-freeze打包程序的实现
2020/03/14 Python
Pycharm新手使用教程(图文详解)
2020/09/17 Python
python报错TypeError: ‘NoneType‘ object is not subscriptable的解决方法
2020/11/05 Python
一篇文章带你学习CSS3图片边框
2020/11/04 HTML / CSS
世界最大域名注册商:GoDaddy
2016/07/24 全球购物
是否可以从一个static方法内部发出对非static方法的调用?
2014/08/18 面试题
经济学博士求职自荐信范文
2013/11/23 职场文书
护士自我评价
2014/02/01 职场文书
活动总结范文
2014/08/30 职场文书
高中生第一学年自我鉴定2015
2014/09/28 职场文书
帝企鹅日记观后感
2015/06/10 职场文书
改进工作作风心得体会
2016/01/23 职场文书
springboot中的pom文件 project报错问题
2022/01/18 Java/Android
Li list-style-image 图片垂直居中实现方法
2023/05/21 HTML / CSS