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变量不能以数字打头详解
Jul 06 Python
Python之日期与时间处理模块(date和datetime)
Feb 16 Python
多个应用共存的Django配置方法
May 30 Python
在python中将字符串转为json对象并取值的方法
Dec 31 Python
Python实现的爬取豆瓣电影信息功能案例
Sep 15 Python
Python MongoDB 插入数据时已存在则不执行,不存在则插入的解决方法
Sep 24 Python
python 利用turtle模块画出没有角的方格
Nov 23 Python
Python tornado上传文件的功能
Mar 26 Python
Python3.7将普通图片(png)转换为SVG图片格式(网站logo图标)动起来
Apr 21 Python
PIL.Image.open和cv2.imread的比较与相互转换的方法
Jun 03 Python
Python xlrd/xlwt 创建excel文件及常用操作
Sep 24 Python
python flask框架快速入门
May 14 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删除xml文档内容的方法
2015/01/23 PHP
简单了解WordPress开发中update_option()函数的用法
2016/01/11 PHP
PHP基于DateTime类解决Unix时间戳与日期互转问题【针对1970年前及2038年后时间戳】
2018/06/13 PHP
详解Laravel5.6 Passport实现Api接口认证
2018/07/27 PHP
Laravel项目中timeAgo字段语言转换的改善方法示例
2019/09/16 PHP
YII2框架中查询生成器Query()的使用方法示例
2020/03/18 PHP
extjs 初始化checkboxgroup值的代码
2011/09/21 Javascript
jQuery数据缓存功能的实现思路及简单模拟
2013/05/27 Javascript
JS定时刷新页面及跳转页面的方法
2013/07/04 Javascript
JavaScript 数组some()和filter()的用法及区别
2016/05/20 Javascript
jQuery获取元素父节点的方法
2016/06/21 Javascript
Javascript typeof与instanceof的区别
2016/10/18 Javascript
利用jsonp与代理服务器方案解决跨域问题
2017/09/14 Javascript
使用JS中的Replace()方法遇到的问题小结
2017/10/20 Javascript
对layui中表单元素的使用详解
2018/08/15 Javascript
详解Vue.js在页面加载时执行某个方法
2018/11/20 Javascript
vue获取时间戳转换为日期格式代码实例
2019/04/17 Javascript
Js通过AES加密后PHP用Openssl解密的方法
2019/07/12 Javascript
Electron+vue从零开始打造一个本地播放器的方法示例
2020/10/27 Javascript
[03:08]TI9战队档案 - Vici Gaming
2019/08/20 DOTA
python封装对象实现时间效果
2020/04/23 Python
python编写的最短路径算法
2015/03/25 Python
python实现应用程序在右键菜单中添加打开方式功能
2017/01/09 Python
python实现决策树分类(2)
2018/08/30 Python
Python subprocess库的使用详解
2018/10/26 Python
python 字符串常用函数详解
2019/09/11 Python
python基于pygame实现飞机大作战小游戏
2020/11/19 Python
定制别致的瑜伽垫:Sugarmat
2019/06/21 全球购物
Hotels.com拉丁美洲:从豪华酒店到经济型酒店的预定优惠和折扣
2019/12/09 全球购物
幼儿教师思想汇报
2014/01/10 职场文书
竞选生活委员演讲稿
2014/04/28 职场文书
2014年教研员工作总结
2014/12/23 职场文书
2015年党小组工作总结
2015/05/26 职场文书
PyTorch dropout设置训练和测试模式的实现
2021/05/27 Python
Python函数中apply、map、applymap的区别
2021/11/27 Python
详解JSON.parse和JSON.stringify用法
2022/02/18 Javascript