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 相关文章推荐
Python3实现的腾讯微博自动发帖小工具
Nov 11 Python
python中while循环语句用法简单实例
May 07 Python
在Django的session中使用User对象的方法
Jul 23 Python
Python list操作用法总结
Nov 10 Python
Python实现的下载网页源码功能示例
Jun 13 Python
Python基于回溯法子集树模板解决全排列问题示例
Sep 07 Python
Python基于identicon库创建类似Github上用的头像功能
Sep 25 Python
python实现linux下抓包并存库功能
Jul 18 Python
python超时重新请求解决方案
Oct 21 Python
解决Numpy中sum函数求和结果维度的问题
Dec 06 Python
PyCharm使用Docker镜像搭建Python开发环境
Dec 26 Python
Softmax函数原理及Python实现过程解析
May 22 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 curl post 时出现的问题解决
2014/01/30 PHP
PHP中常用的字符串格式化函数总结
2014/11/19 PHP
PHP手机短信验证码实现流程详解
2018/05/17 PHP
php中的buffer缓冲区用法分析
2019/05/31 PHP
laravel实现前后台路由分离的方法
2019/10/13 PHP
Code:loadScript( )加载js的功能函数
2007/02/02 Javascript
javascript 常用方法总结
2009/06/03 Javascript
js保存当前路径(cookies记录)
2010/12/14 Javascript
js如何取消事件冒泡
2013/09/23 Javascript
IE6-IE9中tbody的innerHTML不能赋值的解决方法
2014/09/26 Javascript
JS实现网站菜单拖拽移位效果的方法
2015/09/24 Javascript
JavaScript toUpperCase()方法使用详解
2016/08/26 Javascript
vue用Object.defineProperty手写一个简单的双向绑定的示例
2018/07/09 Javascript
微信小程序自定义导航栏
2018/12/31 Javascript
python基础教程之循环介绍
2014/08/29 Python
让 python 命令行也可以自动补全
2014/11/30 Python
Python 快速实现CLI 应用程序的脚手架
2017/12/05 Python
Python中使用Counter进行字典创建以及key数量统计的方法
2018/07/06 Python
详解【python】str与json类型转换
2019/04/29 Python
利用anaconda作为python的依赖库管理方法
2019/08/13 Python
Django使用uwsgi部署时的配置以及django日志文件的处理方法
2019/08/30 Python
Python使用type动态创建类操作示例
2020/02/29 Python
django 实现简单的插入视频
2020/04/07 Python
HTML5的结构和语义(5):交互
2008/10/17 HTML / CSS
俄罗斯花园种植材料批发和零售网上商店:Беккер
2019/07/22 全球购物
客户代表自我评价范例
2013/09/24 职场文书
《金色的脚印》教后反思
2014/04/23 职场文书
船舶工程技术专业求职信
2014/08/07 职场文书
关于读书的演讲稿800字
2014/08/27 职场文书
综治工作汇报材料
2014/10/27 职场文书
原料仓管员岗位职责
2015/04/01 职场文书
给女朋友的道歉短信
2015/05/12 职场文书
2015年生活老师工作总结
2015/05/27 职场文书
亮剑观后感300字
2015/06/05 职场文书
推广普通话宣传标语口号
2015/12/26 职场文书
索尼ICF-36收音机评测
2022/04/30 无线电