机器学习实战(Machine Learning in Action)学习笔记————08.使用FPgrowth算法来高效发现频繁项集...
机器学习实战(Machine Learning in Action)学习笔记————08.使用FPgrowth算法来高效发现频繁项集
关键字:FPgrowth、频繁项集、条件FP树、非监督学习
作者:米仓山下
时间:2018-11-3
机器学习实战(Machine Learning in Action,@author: Peter Harrington)
源码下载地址:https://www.manning.com/books/machine-learning-in-action
git@github.com:pbharrin/machinelearninginaction.git
*************************************************************
一、使用FPgrowth算法来高效发现频繁项集
FPgrowth算法原理:
基于Apriori构建,但在完成相同任务时,采用了一些不同的的技术。这里的任务是将数据集存储在一个特定的称为FP树的结构之后发现频繁项集或则频繁项对,即在一块出现的的元素项的集合FP树。这种做法的执行速度要快于Apriori,通常性能要好两个数量级以上。
FP——Frequent pattern(频繁模式)
*************************************************************
二、FPgrowth算法——构建FP树
FP树构建函数
----------------------------------------------------------------------------
输入:dataSet——待挖掘数据集;minSup——最小支持度,默认为1
输出:retTree——构建的FP树; headerTable——头指针表
def createTree(dataSet, minSup=1): #create FP-tree from dataset but don't mineheaderTable = {}#扫描两次数据集dataSetfor trans in dataSet:#第一次扫描,统计所有元素出现的频次for item in trans:headerTable[item] = headerTable.get(item, 0) + dataSet[trans]for k in headerTable.keys(): #移除不符合minSup的itemsif headerTable[k] < minSup:del(headerTable[k])freqItemSet = set(headerTable.keys())#print 'freqItemSet: ',freqItemSetif len(freqItemSet) == 0: return None, None #没有items符合minSup,返回None退出for k in headerTable:headerTable[k] = [headerTable[k], None] #结构化headerTable#print 'headerTable: ',headerTableretTree = treeNode('Null Set', 1, None) #创建FP树根节点for tranSet, count in dataSet.items(): #第二次扫描,构建FP树retTreelocalD = {}for item in tranSet: #获取条数据中每个元素的全局频次,以便排序if item in freqItemSet:localD[item] = headerTable[item][0]if len(localD) > 0:orderedItems = [v[0] for v in sorted(localD.items(), key=lambda p: p[1], reverse=True)] #排序updateTree(orderedItems, retTree, headerTable, count) #更新FP树retTreereturn retTree, headerTable #返回FP树retTree,头指针表headerTable
注:createTree足够灵活,下面构建条件FP树时还要用到
#更新FP树retTree def updateTree(items, inTree, headerTable, count):if items[0] in inTree.children: #如果第一个元素orderedItems[0]在子节点中inTree.children[items[0]].inc(count) #增加计数else: #不存在,增加子节点inTree.children[items[0]] = treeNode(items[0], count, inTree)if headerTable[items[0]][1] == None: #头指针表中items没有指向节点headerTable[items[0]][1] = inTree.children[items[0]]else: #头指针表中items以指向某个相似节点,追加到后面updateHeader(headerTable[items[0]][1], inTree.children[items[0]])if len(items) > 1: #items不止一个元素,去掉第一个元素,递归调用updateTree构建树updateTree(items[1::], inTree.children[items[0]], headerTable, count)
----------------------------------------------------------------------------
测试:
>>> import fpGrowth >>> simpdata=fpGrowth.loadSimpDat() >>> initset=fpGrowth.createInitSet(simpdata) >>> simpdata [['r', 'z', 'h', 'j', 'p'], ['z', 'y', 'x', 'w', 'v', 'u', 't', 's'], ['z'], ['r', 'x', 'n', 'o', 's'], ['y', 'r', 'x', 'z', 'q', 't', 'p'], ['y', 'z', 'x', 'e', 'q', 's', 't', 'm']] >>> initset {frozenset(['e', 'm', 'q', 's', 't', 'y', 'x', 'z']): 1, frozenset(['x', 's', 'r', 'o', 'n']): 1, frozenset(['s', 'u', 't', 'w', 'v', 'y', 'x', 'z']): 1, frozenset(['q', 'p', 'r', 't', 'y', 'x', 'z']): 1, frozenset(['h', 'r', 'z', 'p', 'j']): 1, frozenset(['z']): 1} >>> minSup = 3 >>> myFPtree, myHeaderTab = fpGrowth.createTree(initset, minSup) >>> myFPtree.disp()Null Set 1x 1s 1r 1z 5x 3y 3s 2t 2r 1t 1r 1 >>> myHeaderTab {'s': [3, <fpGrowth.treeNode instance at 0x00000000039FE608>], 'r': [3, <fpGrowth.treeNode instance at 0x00000000039FE788>], 't': [3, <fpGrowth.treeNode instance at 0x00000000039FE688>], 'y': [3, <fpGrowth.treeNode instance at 0x00000000039FE5C8>], 'x': [4, <fpGrowth.treeNode instance at 0x00000000039FE588>], 'z': [5, <fpGrowth.treeNode instance at 0x00000000039FE548>]} >>>
*************************************************************
三、从一棵FP树种挖掘频繁项集
#递归查找频繁项:mineTree函数
----------------------------------------------------------------------------
#输入:inTree——输入FP树,递归调用时为此时的元素preFix条件FP树;headerTable——头指针表;minSup——最小支持数;preFix——初始化为set([]),递归调用时为条件FP树inTree对应的元素;freqItemList——初始化为[],用来存储频繁项集。 #输出:freqItemList——用来存储频繁项集 def mineTree(inTree, headerTable, minSup, preFix, freqItemList):bigL = [v[0] for v in sorted(headerTable.items(), key=lambda p: p[1])] #头指针表排序for basePat in bigL: #从头指针表bigL(headerTable)底端开始遍历(从小到大)newFreqSet = preFix.copy()newFreqSet.add(basePat) #递归前,newFreqSet为单元素频繁项;递归时preFix不为空,开始组合freqItemList.append(newFreqSet) #将每个频繁项加入到列表freqItemList中condPattBases = findPrefixPath(basePat,\ #抽取条件模式基condPattBases,去掉了元素本身headerTable[basePat][1])myCondTree, myHead = createTree(condPattBases,\ #根据条件模式基condPattBases构建条件频繁树myCondTree minSup)if myHead != None: #挖掘FP条件树 #print 'conditional tree for: ',newFreqSet#myCondTree.disp(1)mineTree(myCondTree, myHead, minSup, \ #newFreqSet不为空set([]),递归调用mineTree函数newFreqSet, freqItemList)
----------------------------------------------------------------------------
将源码中下面两行取消注释:
#print 'conditional tree for: ',newFreqSet
#myCondTree.disp(1) #打印条件树
测试:
>>> myFreqList = [] >>> reload(fpGrowth) <module 'fpGrowth' from 'fpGrowth.py'>#遍历头指针表myHeaderTab,将其单元素频繁项加入myFreqList后,再找出每个元素的条件FP树。递归调用组合频繁项 >>> fpGrowth.mineTree(myFPtree, myHeaderTab, minSup, set([]), myFreqList) conditional tree for: set(['y'])Null Set 1x 3z 3 conditional tree for: set(['y', 'z'])Null Set 1x 3 conditional tree for: set(['s'])Null Set 1x 3 conditional tree for: set(['t'])Null Set 1y 3x 3z 3 conditional tree for: set(['x', 't'])Null Set 1y 3 conditional tree for: set(['z', 't'])Null Set 1y 3x 3 conditional tree for: set(['x', 'z', 't'])Null Set 1y 3 conditional tree for: set(['x'])Null Set 1z 3 >>> myFreqList [set(['y']), set(['y', 'z']), set(['y', 'x', 'z']), set(['y', 'x']), set(['s']), set(['x', 's']), set(['t']), set(['z', 't']), set(['x', 'z', 't']), set(['y', 'x', 'z', 't']), set(['y', 'z', 't']), set(['x', 't']), set(['y', 'x', 't']), set(['y', 't']), set(['r']), set(['x']), set(['x', 'z']), set(['z'])] >>> len(myFreqList) 18 >>>
*************************************************************
四、示例:从新闻网站点击流中挖掘
kosarak.dat中有将近100万条记录,每一行包含了某个用户浏览过得新闻报道。有些用户只看过一篇,有的用户看过2498篇报道。用户和报道编码成整数,利用FPgrowth算法
#读取数据,数据集格式化
>>> parsedDat=[line.split() for line in open('kosarak.dat').readlines()] >>> len(parsedDat) 990002 >>> initset=fpGrowth.createInitSet(parsedDat)#构建FP树,寻找阅读量10+的新闻报道 >>> myFPtree, myHeaderTab = fpGrowth.createTree(initset, 100000)#创建条件FP树 >>> myFreqList = [] >>> fpGrowth.mineTree(myFPtree, myHeaderTab, 100000, set([]), myFreqList) >>> len(myFreqList) 9 >>> myFreqList [set(['1']), set(['1', '6']), set(['3']), set(['11', '3']), set(['11', '3', '6']), set(['3', '6']), set(['11']), set(['11', '6']), set(['6'])] >>>
----------------------------------------------------------------------------
总结:
优点:FPgrowth算法相比Apriori只需要对数据库进行两次扫描,能够显著加快频繁项集发现速度
缺点:该算法能够更高效的发现频繁项集,但不能用于发现关联规则
应用:搜索引擎推荐词(经常在一块出现的词对)等
转载于:https://www.cnblogs.com/Micang/p/9900854.html
机器学习实战(Machine Learning in Action)学习笔记————08.使用FPgrowth算法来高效发现频繁项集...相关推荐
- 【机器学习实战】第12章 使用 FP-growth 算法来高效发现频繁项集
第12章 使用FP-growth算法来高效发现频繁项集 前言 在 第11章 时我们已经介绍了用 Apriori 算法发现 频繁项集 与 关联规则. 本章将继续关注发现 频繁项集 这一任务,并使用 FP ...
- 机器学习-使用FP-Growth算法来高效发现频繁项集
FP-Growth算法是这里要介绍的第三个非监督学习算法,FP(Frequent Pattern)代表频繁模式.FP-Growth算法相对于Apriori算法来说效率更高,其只需要对数据集进行两轮扫描 ...
- 机器学习实战—使用FP-growth算法来高效发现频繁项集
FP-growth算法基于Apriori构建,但采用了高级的数据结构减少扫描次数,大大加快了算法速度.FP-growth算法只需要对数据库进行两次扫描,而Apriori算法对于每个潜在的频繁项集都会扫 ...
- 决策树(chap3)Machine Learning In Action学习笔记
优点:计算复杂度不高,输出结果易于理解,对中间值的缺失不敏感,可以处理不相关特征数据. 缺点:可能会产生过度匹配问题. 适用数据类型:数值型(必须离散化)和标称型. 决策树创建分支的伪代码函数crea ...
- Machine Learning in Action 读书笔记---第5章 Logistic回归
Machine Learning in Action 读书笔记 第5章 Logistic回归 文章目录 Machine Learning in Action 读书笔记 一.Logistic回归 1.L ...
- Machine Learning in Action 读书笔记---第3章 决策树
Machine Learning in Action 读书笔记 第3章 决策树 文章目录 Machine Learning in Action 读书笔记 一.决策树算法简介 1 决策树的构造 2 决策 ...
- Machine Learning in Action 读书笔记---第4章 基于概率论的分类方法:朴素贝叶斯
Machine Learning in Action 读书笔记 第4章 基于概率论的分类方法:朴素贝叶斯 文章目录 Machine Learning in Action 读书笔记 一.基于贝叶斯决策理 ...
- Machine Learning in Action 读书笔记---第8章 预测数值型数据:回归
Machine Learning in Action 读书笔记 第8章 预测数值型数据:回归 文章目录 Machine Learning in Action 读书笔记 一.回归 1.回归的一般过程 2 ...
- 机器学习(Machine Learning)——深度学习(Deep Learning)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/abcjennifer/article/ ...
- 原创 | 斯坦福Machine Learning with Graphs 学习笔记(第一讲)
作者:林夕 本文长度为2900字,建议阅读9分钟 本文为大家介绍图网络的基本概念.网络的应用以及图的结构. 标签:机器学习 目录 一.Why Networks 二.网络的应用 2.1 应用领域 ...
最新文章
- 【CNN】很详细的讲解什么以及为什么是卷积(Convolution)!
- linux 问题 value too large for defined data type 解决方案
- android studio 将文件打包成jar文件
- juniper交换机 mac地址和端口绑定
- 解决mysql插入数据时出现Incorrect string value: '\xF0\x9F...' 的异常
- Spring-引用Bean的属性值
- [JDK]找不到或无法加载主类 java
- Mybatis 动态传sql可以查询表名,任意表名,不固定字段的个数返回未定义的类型以及增删改...
- java 函数式编程 示例_功能Java示例 第1部分–从命令式到声明式
- Flex+BlazeDS+IntelliJ IDEA整合开发系列一之起步demo
- IOS-Run loop学习总结
- 【教程】Edraw Max使用教程:Edraw Max快速入门指南
- 关于光伏行业的测试及测试标准
- JDBCDataSource
- 北京大学计算机科学李丰,北京大学
- 格杰仁波切:修佛根本在修心…
- 2021年一战南大AI上岸经验贴
- JavaGUI——Java图形用户界面
- oracle餐厅网络点餐系统_点餐系统产品演示
- ubuntu linux下的C语言开发(进程创建)
热门文章
- java扫雷初级代码_运行在Eclipse环境下的java扫雷游戏的初级代码是什么?
- 《C# 从现象到本质》出版,免费送书10本
- “注释”是程序员的自我修养
- mac虚拟摄像头插件_VCam虚拟摄像头(电脑虚拟摄像头视频软件)V5.4.2 官方最新版...
- linux文件夹怎么恢复默认打开方式,怎么还原打开方式_在win7电脑上还原文件默认打开方式的步骤 - 驱动管家...
- android killer使用方法,AndroidKiller安装、设置及使用教程
- 如何设计出骚气的秒杀系统?
- 学生管理系统IPO图_玩不起了?海底捞取消大学生69折优惠,海底捞:暂不会调整...
- html5 自动扣图,html5 canvas+js实现ps钢笔抠图
- EagleEye: Fast Sub-net Evaluation for Efficient Neural Network Pruning(论文阅读)