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基础教程之面向对象的一些概念
Aug 29 Python
编写Python爬虫抓取暴走漫画上gif图片的实例分享
Apr 20 Python
Python 迭代器工具包【推荐】
May 06 Python
Ubuntu 16.04 LTS中源码安装Python 3.6.0的方法教程
Dec 27 Python
itchat和matplotlib的结合使用爬取微信信息的实例
Aug 25 Python
TensorFlow如何实现反向传播
Feb 06 Python
全面分析Python的优点和缺点
Feb 07 Python
Python Logging 日志记录入门学习
Jun 02 Python
删除DataFrame中值全为NaN或者包含有NaN的列或行方法
Nov 06 Python
python实现上传文件到linux指定目录的方法
Jan 03 Python
python与mysql数据库交互的实现
Jan 06 Python
TensorFLow 数学运算的示例代码
Apr 21 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自定义函数实现assign()数组分配到模板及extract()变量分配到模板功能示例
2018/05/23 PHP
PDO::setAttribute讲解
2019/01/29 PHP
javascript下操作css的float属性的特殊写法
2007/08/22 Javascript
解决3.01版的jquery.form.js中文乱码问题的解决方法
2012/03/08 Javascript
jQuery淡入淡出元素让其效果更为生动
2014/09/01 Javascript
PHP中使用微秒计算脚本执行时间例子
2014/11/19 Javascript
JS动态添加iframe的代码
2015/09/14 Javascript
jquery特效 点击展示与隐藏全文
2015/12/09 Javascript
谈一谈javascript中继承的多种方式
2016/02/19 Javascript
javascript如何实现360度全景照片问题汇总
2016/04/04 Javascript
JS实时弹出新消息提示框并有提示音响起的实现代码
2016/04/20 Javascript
Node.js 日志处理模块log4js
2016/08/28 Javascript
JavaScript面试题大全(推荐)
2016/09/22 Javascript
BootstrapTable加载按钮功能实例代码详解
2017/09/22 Javascript
基于匀速运动的实例讲解(侧边栏,淡入淡出)
2017/10/17 Javascript
微信小程序tabBar模板用法实例分析【附demo源码下载】
2017/11/28 Javascript
jQuery EasyUI 折叠面板accordion的使用实例(分享)
2017/12/25 jQuery
jQuery+datatables插件实现ajax加载数据与增删改查功能示例
2018/04/17 jQuery
layui table设置前台过滤转义等方法
2018/08/17 Javascript
jQuery序列化form表单数据为JSON对象的实现方法
2018/09/20 jQuery
详解vue如何使用rules对表单字段进行校验
2018/10/17 Javascript
JS数组求和的常用方法实例小结
2019/01/07 Javascript
JavaScript修改注册表实例代码
2020/01/05 Javascript
vue element 关闭当前tab 跳转到上一路由操作
2020/07/22 Javascript
vue-cli或vue项目利用HBuilder打包成移动端app操作
2020/07/29 Javascript
[01:03:50]DOTA2-DPC中国联赛 正赛 CDEC vs DLG BO3 第二场 2月7日
2021/03/11 DOTA
python使用Apriori算法进行关联性解析
2017/12/21 Python
python实现聚类算法原理
2018/02/12 Python
python cumsum函数的具体使用
2019/07/29 Python
Python 自动登录淘宝并保存登录信息的方法
2019/09/04 Python
Reebok官方旗舰店:美国知名健身品牌锐步
2019/01/07 全球购物
Windows和Linux动态库应用异同
2016/07/28 面试题
医学专业毕业生个人求职信
2013/12/25 职场文书
护士上岗前培训自我鉴定
2014/04/20 职场文书
机械机修工岗位职责
2014/08/03 职场文书
庆七一宣传标语
2014/10/08 职场文书