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框架中运行Python应用全攻略
Jul 17 Python
Python外星人入侵游戏编程完整版
Mar 30 Python
python 禁止函数修改列表的实现方法
Aug 03 Python
python3实现全角和半角字符转换的方法示例
Sep 21 Python
NetworkX之Prim算法(实例讲解)
Dec 22 Python
Python实现SQL注入检测插件实例代码
Feb 02 Python
Django框架视图函数设计示例
Jul 29 Python
Django连接数据库并实现读写分离过程解析
Nov 13 Python
python根据完整路径获得盘名/路径名/文件名/文件扩展名的方法
Apr 22 Python
Python3以GitHub为例来实现模拟登录和爬取的实例讲解
Jul 30 Python
Python爬虫Scrapy框架CrawlSpider原理及使用案例
Nov 20 Python
Django数据库(SQlite)基本入门使用教程
Jul 07 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自定义函数实现代码
2011/12/30 PHP
php使用CURL伪造IP和来源实例详解
2015/01/15 PHP
PHP实现添加购物车功能
2017/03/06 PHP
php实现用户登陆简单实例
2017/04/04 PHP
php实现的二叉树遍历算法示例
2017/06/15 PHP
Laravel ORM 数据model操作教程
2019/10/21 PHP
ExtJs之带图片的下拉列表框插件
2010/03/04 Javascript
根据身份证号自动输出相关信息(籍贯,出身日期,性别)
2013/11/15 Javascript
JQuery中dataGrid设置行的高度示例代码
2014/01/03 Javascript
事件委托与阻止冒泡阻止其父元素事件触发
2014/09/02 Javascript
使用jquery实现仿百度自动补全特效
2015/07/23 Javascript
jQuery实现图片左右滚动特效
2020/04/20 Javascript
Dojo获取下拉框的文本和值实例代码
2016/05/27 Javascript
jQuery弹出窗口打开链接的实现代码
2016/12/24 Javascript
微信小程序实现tab切换效果
2017/11/21 Javascript
JS+CSS实现滚动数字时钟效果
2017/12/25 Javascript
如何使用JS console.log()技巧提高工作效率
2020/10/14 Javascript
跟老齐学Python之集成开发环境(IDE)
2014/09/12 Python
详细解读Python中的__init__()方法
2015/05/02 Python
python处理二进制数据的方法
2015/06/03 Python
python+PyQT实现系统桌面时钟
2020/06/16 Python
Python图像处理之图像的读取、显示与保存操作【测试可用】
2019/01/04 Python
基于Django框架的权限组件rbac实例讲解
2019/08/31 Python
python3利用Axes3D库画3D模型图
2020/03/25 Python
简单了解Django项目应用创建过程
2020/07/06 Python
Python特殊属性property原理及使用方法解析
2020/10/09 Python
PyCharm常用配置和常用插件(小结)
2021/02/06 Python
HTML5网页录音和上传到服务器支持PC、Android,支持IOS微信功能
2019/04/26 HTML / CSS
英国最大的女士服装零售商:Bonmarché
2017/08/17 全球购物
日本订房网站,预订日本星级酒店/温泉旅馆:Relux(支持中文)
2020/01/03 全球购物
eDreams德国:南欧领先的在线旅游公司
2020/12/07 全球购物
竞选学生会主席演讲稿
2014/04/24 职场文书
党的群众路线对照检查材料思想汇报
2014/09/25 职场文书
考试作弊检讨书
2014/10/21 职场文书
2015年学校安全工作总结
2015/04/22 职场文书
证婚人致辞精选
2015/07/28 职场文书