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 相关文章推荐
记录Django开发心得
Jul 16 Python
深入讨论Python函数的参数的默认值所引发的问题的原因
Mar 30 Python
PyQt5每天必学之像素图控件QPixmap
Apr 19 Python
Python 普通最小二乘法(OLS)进行多项式拟合的方法
Dec 29 Python
详解Python函数式编程—高阶函数
Mar 29 Python
python dlib人脸识别代码实例
Apr 04 Python
Pytorch 搭建分类回归神经网络并用GPU进行加速的例子
Jan 09 Python
使用Python实现Wake On Lan远程开机功能
Jan 22 Python
Python字典深浅拷贝与循环方式方法详解
Feb 09 Python
Django接收照片储存文件的实例代码
Mar 07 Python
keras小技巧——获取某一个网络层的输出方式
May 23 Python
Django Session和Cookie分别实现记住用户登录状态操作
Jul 02 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管理内存函数 memory_get_usage()使用介绍
2012/09/23 PHP
PHP递归遍历指定目录的文件并统计文件数量的方法
2015/03/24 PHP
php字符集转换
2017/01/23 PHP
jquery 选择器部分整理
2009/10/28 Javascript
jQuery选择器源码解读(七):elementMatcher函数
2015/03/31 Javascript
详解Bootstrap的aria-label和aria-labelledby应用
2016/01/04 Javascript
深入学习AngularJS中数据的双向绑定机制
2016/03/04 Javascript
js中最容易被忽视的事件问题大总结
2016/05/15 Javascript
JavaScript常用判断写法大全(推荐)
2016/05/30 Javascript
jQuery实现手机版页面翻页效果的简单实例
2016/10/05 Javascript
AngularJS 2.0入门权威指南
2016/10/08 Javascript
深入浅析JSONAPI在PHP中的应用
2017/12/24 Javascript
js保留两位小数方法总结
2018/01/31 Javascript
在vue项目中,使用axios跨域处理
2018/03/07 Javascript
JS中使用new Option()实现时间联动效果
2018/12/10 Javascript
vue防止花括号{{}}闪烁v-text和v-html、v-cloak用法示例
2019/03/13 Javascript
Vue页面跳转传递参数及接收方式
2020/09/09 Javascript
多版本Python共存的配置方法
2017/05/22 Python
Python实现的爬取网易动态评论操作示例
2018/06/06 Python
python中协程实现TCP连接的实例分析
2018/10/14 Python
浅析python内置模块collections
2019/11/15 Python
tensorflow获取预训练模型某层参数并赋值到当前网络指定层方式
2020/01/24 Python
scrapy redis配置文件setting参数详解
2020/11/18 Python
python3中数组逆序输出方法
2020/12/01 Python
分享CSS3制作卡片式图片的方法
2016/07/08 HTML / CSS
微软加拿大官方网站:Microsoft Canada
2019/04/28 全球购物
导游实习生自荐书
2014/01/28 职场文书
出国留学经济担保书
2014/04/01 职场文书
交通事故死亡赔偿协议书
2014/12/03 职场文书
2015年班组工作总结
2015/04/20 职场文书
十七岁的单车观后感
2015/06/12 职场文书
环保建议书作文300字
2015/09/14 职场文书
2016年优秀教师先进事迹材料
2016/02/26 职场文书
2016年小学感恩节活动总结
2016/04/01 职场文书
tomcat下部署jenkins的方法
2022/05/06 Servers
关于对TypeScript泛型参数的默认值理解
2022/07/15 Javascript