前言:

关于 FP-Growth 算法介绍请见:FP-Growth算法的介绍

本文主要介绍从 FP-tree 中提取频繁项集的算法。关于伪代码请查看上面的文章

FP-tree 的构造请见:FP-Growth算法之 FP-tree 的构造(python)

正文:

tree_miner.py文件:

  1. #coding=utf-8
  2. import tree_builder
  3. import copy
  4. class Tree_miner(object):
  5. """tree_miner类. 作用:对Tree进行频繁项集的挖掘"""
  6. def __init__(self, Tree=None, min_sup=-1, headerTable={}):
  7. """tree_miner的初始化. Tree即为构造好的FP_Tree, min_sup是最小支持度计数, headerTable是FP_Tree的头结点表"""
  8. self.min_sup = min_sup
  9. self.tree_mining(Tree=Tree, headerTable=headerTable)
  10. def tree_mining(self, Tree, A=[], headerTable={}):
  11. """功能: 递归实现对树Tree频繁项集的挖掘. A相当于伪代码中的α,B相当于β"""
  12. B = []
  13. allElem = {} #用来保存单个路径情况时,路径上的全部节点
  14. node = Tree.root #node取得树的根节点
  15. while len(node.children) > 0: #推断是否是单个路径
  16. if len(node.children) != 1: #假设路径上的某个节点的孩子数不止一个。则它不是单个路径
  17. break
  18. node = node.children.values()[0] #node取得下一个节点
  19. allElem.setdefault(node.data,node.count) #记录路径上的节点。假设是单个路径的话会用到
  20. if len(node.children) < 1: #Tree仅仅包括单个路径
  21. L = self.getL(items=allElem, min_sup=self.min_sup, A=A) #L即为我们要求的频繁项集
  22. self.showResult(L) #对结果进行输出
  23. return
  24. else:
  25. for item in headerTable: #对于头结点表中的元素,逐个找以其结尾的频繁项集
  26. if A: #产生项目集B
  27. for elem in A:
  28. if elem != []:
  29. temp = copy.copy(elem)
  30. B.append(temp)
  31. B.append([item]+temp)
  32. else:
  33. B.append([item])
  34. pattem,counts = self.findPattemBase(item, headerTable) #得到以项item结尾的所以条件模式基,counts存放条件模式基的计数
  35. myHeaderTable = {}
  36. conditionTree_builder = tree_builder.Tree_builder(routines=pattem, counts=counts, headerTable=myHeaderTable) #新建一个Tree_builder对象,用它来构造条件FP-Tree
  37. if conditionTree_builder.tree.root.children: #假设构造的条件FP-树不空
  38. self.tree_mining(Tree=conditionTree_builder.tree, A=B, headerTable=myHeaderTable) #递归调用
  39. B = []
  40. return
  41. def findPattemBase(self, item, headerTable):
  42. """功能: 依据树的头结点表去搜索树中item的条件模式基"""
  43. itemPattem = [] #存放项item的全部模式基
  44. counts = [] #存放模式基的计数
  45. addressTable = headerTable[item] #头节点表中item链上所以节点的地址
  46. for itemNode in addressTable: #对头结点表表中存放的每一个item节点
  47. itemInPattem = [] #用来存放item模式基中的各项
  48. nodeInPattem = itemNode.parent #item模式基的项,用它来回溯到树根。即为一条模式基
  49. if nodeInPattem.data == 'null': #假设父亲节点就是树根,则跳过
  50. continue
  51. while nodeInPattem.data != 'null': #假设还没到树根,则一直回溯
  52. itemInPattem.append(nodeInPattem.data) #把它压进item的模式基
  53. nodeInPattem = nodeInPattem.parent #让当前节点跳到它的父亲节点,进行回溯
  54. itemInPattem = tuple(itemInPattem)
  55. itemPattem.append(itemInPattem) #找完了一条item的模式基了
  56. counts.append(itemNode.count) #模式基的计数
  57. return itemPattem,counts
  58. def showResult(self, result=[[]]):
  59. """功能: 将挖掘到的频繁项集进行展示"""
  60. for elem in result:
  61. num = elem.pop() #频繁项集的计数
  62. print tuple(elem),':',num
  63. return
  64. def combiner(self, myList, n):
  65. """功能: 对list列表里的全部元素进行排列组合,生成n个元组组合在一起的列表"""
  66. answers = []
  67. one = [0] * n
  68. def next_c(li = 0, ni = 0):
  69. if ni == n:
  70. answers.append(copy.copy(one))
  71. return
  72. for lj in xrange(li, len(myList)):
  73. one[ni] = myList[lj]
  74. next_c(lj + 1, ni + 1)
  75. next_c()
  76. return answers
  77. def findMinimum(self, items, elem):
  78. """功能: 依据items字典找出elem列表中各项计数的最小值"""
  79. minimum = items[elem[0]]
  80. for a in elem:
  81. if items[a] < minimum: #假设某元素的计数更小,则记录它的计数
  82. minimum = items[a]
  83. return minimum
  84. def getL(self, items, min_sup=-1, A=[]):
  85. """功能: 对于仅仅含单路径的树,进行生成频繁项集"""
  86. tempResult = []
  87. finnalResult = []
  88. nodes = items.keys() #取得items字典的键,即单路径上的全部节点
  89. for i in range(1,len(nodes)+1): #对nodes。即路径上的全部节点生成各种组合
  90. tempResult += self.combiner(myList=nodes, n=i)
  91. for elem in tempResult[::-1]: #elem逆序对dearResult訪问,由于接下来会删除元素,逆序好操作
  92. elemMinimum = self.findMinimum(items, elem) #找出elem里面的最小计数
  93. if elemMinimum < min_sup: #假设组合elem的最小计数小于最小支持度计数。则删除.
  94. tempResult.remove(elem)
  95. else: #否则把它压入结果列表中进行输出。但它仅仅是条件模式基,要加上最后一个项构成频繁项集,同一时候把最小计数也加上
  96. for Aelem in A: #A可能含有多项
  97. if Aelem:
  98. temp = elem
  99. temp += Aelem
  100. temp.append(elemMinimum)
  101. finnalResult.append(temp) #将挖掘出的频繁项集保存在finnalResult列表
  102. return finnalResult

代码地址:FP-Growth算法python实现(完整代码)

备注:该代码是在 Python2.7+eclipse 环境下编写的。可在eclipse中导入项目,也可在命令行窗体用python命令运行“__init__.py”文件。

转载请注明出处,谢谢!

(原文链接:http://blog.csdn.net/bone_ace/article/details/46747791

FP-Growth算法之频繁项集的挖掘(python)的更多相关文章

  1. FP-growth算法发现频繁项集(一)——构建FP树

    常见的挖掘频繁项集算法有两类,一类是Apriori算法,另一类是FP-growth.Apriori通过不断的构造候选集.筛选候选集挖掘出频繁项集,需要多次扫描原始数据,当原始数据较大时,磁盘I/O次数 ...

  2. FP-growth算法发现频繁项集(二)——发现频繁项集

    上篇介绍了如何构建FP树,FP树的每条路径都满足最小支持度,我们需要做的是在一条路径上寻找到更多的关联关系. 抽取条件模式基 首先从FP树头指针表中的单个频繁元素项开始.对于每一个元素项,获得其对应的 ...

  3. R_Studio(时序)Apriori算法寻找频繁项集的方法

    应用ARIMA(1,1,0)对2015年1月1日到2015年2月6日某餐厅的销售数量做为期5天的预测 setwd('D:\\dat') #install.packages("forecast ...

  4. 使用 FP-growth 算法高效挖掘海量数据中的频繁项集

    前言 对于如何发现一个数据集中的频繁项集,前文讲解的经典 Apriori 算法能够做到. 然而,对于每个潜在的频繁项,它都要检索一遍数据集,这是比较低效的.在实际的大数据应用中,这么做就更不好了. 本 ...

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

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

  6. 第十五篇:使用 FP-growth 算法高效挖掘海量数据中的频繁项集

    前言 对于如何发现一个数据集中的频繁项集,前文讲解的经典 Apriori 算法能够做到. 然而,对于每个潜在的频繁项,它都要检索一遍数据集,这是比较低效的.在实际的大数据应用中,这么做就更不好了. 本 ...

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

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

  8. 关联规则—频繁项集Apriori算法

    频繁模式和对应的关联或相关规则在一定程度上刻画了属性条件与类标号之间的有趣联系,因此将关联规则挖掘用于分类也会产生比较好的效果.关联规则就是在给定训练项集上频繁出现的项集与项集之间的一种紧密的联系.其 ...

  9. 海量数据挖掘MMDS week2: 频繁项集挖掘 Apriori算法的改进:非hash方法

    http://blog.csdn.net/pipisorry/article/details/48914067 海量数据挖掘Mining Massive Datasets(MMDs) -Jure Le ...

随机推荐

  1. 数据分析系统DIY3/3:本地64位WIN7+matlab 2012b訪问VMware CentOS7+MariaDB

    数据分析系统DIY中要完毕的三个任务. 一.用VMware装64位CentOS.数据库服务端用CentOS自带的就好. 二.数据採集与预处理用Dev-C++编程解决. 三.用本地Win7 64上的MA ...

  2. Ubuntu 系统 文件操作命令

    文件和目录的操作 用户主目录下有一个 Desktop (对应,桌面)mkdir dir1 建立一个目录cd 不添加参数,默认回到主目录(用户目录)touch a.txt 建立一个文件mv a.txt ...

  3. NET基础课--Linq第二讲

    这一讲,来说说集合.因为linq主要用于对数据源进行查询,集合是最常见的数据源. 集合 形式: 数组,列表List<T> Arraylist等. 特点: 可通过索引或键访问.可进行fore ...

  4. Android Eclipse Errors

    1.The import org.apache.http.client; tip: cannot be resolved; resolve: Find library in your sdk and ...

  5. 在android源码环境下写上层应用的一个初步解决方法

    在android源码环境下编写上层应用,一直以来我都觉得很麻烦.因为如果单纯将应用导入eclipse,那么framework层一些定制的API无法自动提示和补全,使用起来不太方便:如果将整个andro ...

  6. mysql忘记密码时如何修改root用户密码

    1.关闭正在运行的MySQL服务. 2.打开DOS窗口,转到mysql\bin目录. 3. 输入mysqld --skip-grant-tables 回车.--skip-grant-tables 的意 ...

  7. MongoDb笔记(一)

    1.Mongodb 数据库是动态生成的可以使用use 数据库名 来指定要使用的数据库,如果数据库不存在就自动生成一个 2.插入一个文档:db.foo.insert({"name": ...

  8. 1203.1——条件语句 之 if语句

    用if语句可以构成分支结构.它根据给定的条件进行判断,以决定执行某个分支程序段.C语言的if语句有三种基本形式. 语句的三种形式 1) 第一种形式为基本形式:if        if(表达式) 语句其 ...

  9. iOS指纹识别

    #import "ViewController.h" #import <LocalAuthentication/LocalAuthentication.h> @inte ...

  10. GridView+ZedGraph【转】

    edgraph图表控件的强大功能令人出乎意料,与OWC相比我想应该毫不逊色,近来需求要求作出相关数据统计,不想使用BI这类的强大东西,所以搜索到 了免费的开源的Zedgraph控件.使用起来也非常方便 ...