机器学习实战(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算法来高效发现频繁项集...相关推荐

  1. 【机器学习实战】第12章 使用 FP-growth 算法来高效发现频繁项集

    第12章 使用FP-growth算法来高效发现频繁项集 前言 在 第11章 时我们已经介绍了用 Apriori 算法发现 频繁项集 与 关联规则. 本章将继续关注发现 频繁项集 这一任务,并使用 FP ...

  2. 机器学习-使用FP-Growth算法来高效发现频繁项集

    FP-Growth算法是这里要介绍的第三个非监督学习算法,FP(Frequent Pattern)代表频繁模式.FP-Growth算法相对于Apriori算法来说效率更高,其只需要对数据集进行两轮扫描 ...

  3. 机器学习实战—使用FP-growth算法来高效发现频繁项集

    FP-growth算法基于Apriori构建,但采用了高级的数据结构减少扫描次数,大大加快了算法速度.FP-growth算法只需要对数据库进行两次扫描,而Apriori算法对于每个潜在的频繁项集都会扫 ...

  4. 决策树(chap3)Machine Learning In Action学习笔记

    优点:计算复杂度不高,输出结果易于理解,对中间值的缺失不敏感,可以处理不相关特征数据. 缺点:可能会产生过度匹配问题. 适用数据类型:数值型(必须离散化)和标称型. 决策树创建分支的伪代码函数crea ...

  5. Machine Learning in Action 读书笔记---第5章 Logistic回归

    Machine Learning in Action 读书笔记 第5章 Logistic回归 文章目录 Machine Learning in Action 读书笔记 一.Logistic回归 1.L ...

  6. Machine Learning in Action 读书笔记---第3章 决策树

    Machine Learning in Action 读书笔记 第3章 决策树 文章目录 Machine Learning in Action 读书笔记 一.决策树算法简介 1 决策树的构造 2 决策 ...

  7. Machine Learning in Action 读书笔记---第4章 基于概率论的分类方法:朴素贝叶斯

    Machine Learning in Action 读书笔记 第4章 基于概率论的分类方法:朴素贝叶斯 文章目录 Machine Learning in Action 读书笔记 一.基于贝叶斯决策理 ...

  8. Machine Learning in Action 读书笔记---第8章 预测数值型数据:回归

    Machine Learning in Action 读书笔记 第8章 预测数值型数据:回归 文章目录 Machine Learning in Action 读书笔记 一.回归 1.回归的一般过程 2 ...

  9. 机器学习(Machine Learning)——深度学习(Deep Learning)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/abcjennifer/article/ ...

  10. 原创 | 斯坦福Machine Learning with Graphs 学习笔记(第一讲)

    作者:林夕 本文长度为2900字,建议阅读9分钟 本文为大家介绍图网络的基本概念.网络的应用以及图的结构. 标签:机器学习 目录 一.Why Networks 二.网络的应用     2.1 应用领域 ...

最新文章

  1. 【CNN】很详细的讲解什么以及为什么是卷积(Convolution)!
  2. linux 问题 value too large for defined data type 解决方案
  3. android studio 将文件打包成jar文件
  4. juniper交换机 mac地址和端口绑定
  5. 解决mysql插入数据时出现Incorrect string value: '\xF0\x9F...' 的异常
  6. Spring-引用Bean的属性值
  7. [JDK]找不到或无法加载主类 java
  8. Mybatis 动态传sql可以查询表名,任意表名,不固定字段的个数返回未定义的类型以及增删改...
  9. java 函数式编程 示例_功能Java示例 第1部分–从命令式到声明式
  10. Flex+BlazeDS+IntelliJ IDEA整合开发系列一之起步demo
  11. IOS-Run loop学习总结
  12. 【教程】Edraw Max使用教程:Edraw Max快速入门指南
  13. 关于光伏行业的测试及测试标准
  14. JDBCDataSource
  15. 北京大学计算机科学李丰,北京大学
  16. 格杰仁波切:修佛根本在修心…
  17. 2021年一战南大AI上岸经验贴
  18. JavaGUI——Java图形用户界面
  19. oracle餐厅网络点餐系统_点餐系统产品演示
  20. ubuntu linux下的C语言开发(进程创建)

热门文章

  1. java扫雷初级代码_运行在Eclipse环境下的java扫雷游戏的初级代码是什么?
  2. 《C# 从现象到本质》出版,免费送书10本
  3. “注释”是程序员的自我修养
  4. mac虚拟摄像头插件_VCam虚拟摄像头(电脑虚拟摄像头视频软件)V5.4.2 官方最新版...
  5. linux文件夹怎么恢复默认打开方式,怎么还原打开方式_在win7电脑上还原文件默认打开方式的步骤 - 驱动管家...
  6. android killer使用方法,AndroidKiller安装、设置及使用教程
  7. 如何设计出骚气的秒杀系统?
  8. 学生管理系统IPO图_玩不起了?海底捞取消大学生69折优惠,海底捞:暂不会调整...
  9. html5 自动扣图,html5 canvas+js实现ps钢笔抠图
  10. EagleEye: Fast Sub-net Evaluation for Efficient Neural Network Pruning(论文阅读)