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字符串拼接六种方法介绍
Dec 18 Python
python3 cvs将数据读取为字典的方法
Dec 22 Python
python利用ffmpeg进行录制屏幕的方法
Jan 10 Python
Python弹出输入框并获取输入值的实例
Jun 18 Python
Django中信号signals的简单使用方法
Jul 04 Python
Python+Selenium使用Page Object实现页面自动化测试
Jul 14 Python
详解python pandas 分组统计的方法
Jul 30 Python
python实现图片压缩代码实例
Aug 12 Python
Python如何调用JS文件中的函数
Aug 16 Python
pytorch 实现cross entropy损失函数计算方式
Jan 02 Python
Python编程快速上手——Excel到CSV的转换程序案例分析
Feb 28 Python
Python 通过爬虫实现GitHub网页的模拟登录的示例代码
Aug 17 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中foreach循环中使用引用要注意的地方
2011/01/02 PHP
php setcookie(name, value, expires, path, domain, secure) 参数详解
2013/06/28 PHP
php生成静态页面的简单示例
2014/04/17 PHP
PHP调试函数和日志记录函数分享
2015/01/31 PHP
php使用gzip压缩传输js和css文件的方法
2015/07/29 PHP
JQuery在页面中添加和除移DOM示例代码
2013/06/24 Javascript
14个有用的Jquery技巧分享
2015/01/08 Javascript
JS实现随页面滚动显示/隐藏窗口固定位置元素
2016/02/26 Javascript
jQuery插件实现图片轮播特效
2016/06/16 Javascript
原生js实现jquery函数animate()动画效果的简单实例
2016/08/21 Javascript
js表单元素checked、radio被选中的几种方法(详解)
2016/08/22 Javascript
微信小程序 视图层(xx.xml)和逻辑层(xx.js)详细介绍
2016/10/13 Javascript
jQuery EasyUI 获取tabs的实例解析
2016/12/06 Javascript
jQuery加密密码到cookie的实现代码
2017/04/18 jQuery
在vue中实现点击选择框阻止弹出层消失的方法
2018/09/15 Javascript
微信小程序按钮点击动画效果的实现
2019/09/04 Javascript
小程序最新获取用户昵称和头像的方法总结
2019/09/23 Javascript
微信小程序单选框自定义赋值
2020/05/26 Javascript
vue 判断元素内容是否超过宽度的方式
2020/07/29 Javascript
[49:31]DOTA2-DPC中国联赛 正赛 Elephant vs LBZS BO3 第二场 1月29日
2021/03/11 DOTA
python函数参数*args**kwargs用法实例
2013/12/04 Python
python类继承与子类实例初始化用法分析
2015/04/17 Python
快速实现基于Python的微信聊天机器人示例代码
2017/03/03 Python
Tensorflow实现卷积神经网络的详细代码
2018/05/24 Python
python文字和unicode/ascll相互转换函数及简单加密解密实现代码
2019/08/12 Python
奢华时尚的独特视角:La Garçonne
2018/06/07 全球购物
凯蒂·佩里个人女鞋品牌:Katy Perry Collections
2019/04/04 全球购物
购买正版游戏和游戏激活码:Green Man Gaming
2019/11/06 全球购物
师范生的个人求职信范文
2014/01/04 职场文书
国际贸易专业个人鉴定
2014/02/22 职场文书
党员群众路线剖析材料
2014/10/08 职场文书
介绍信样本
2015/01/31 职场文书
2015年社会治安综合治理工作总结
2015/04/10 职场文书
舞出我人生观后感
2015/06/16 职场文书
居住证明范文
2015/06/17 职场文书
基于Python实现一个春节倒计时脚本
2022/01/22 Python