#coding=utf-8

import tree_builder

import copy

class Tree_miner(object):

"""tree_miner类. 作用:对Tree进行频繁项集的挖掘"""

def __init__(self, Tree=None, min_sup=-1, headerTable={}):

"""tree_miner的初始化. Tree即为构造好的FP_Tree, min_sup是最小支持度计数, headerTable是FP_Tree的头结点表"""

self.min_sup = min_sup

self.tree_mining(Tree=Tree, headerTable=headerTable)

def tree_mining(self, Tree, A=[], headerTable={}):

"""功能: 递归实现对树Tree频繁项集的挖掘. A相当于伪代码中的α,B相当于β"""

B = []

allElem = {} #用来保存单个路径情况时,路径上的全部节点

node = Tree.root #node取得树的根节点

while len(node.children) > 0: #推断是否是单个路径

if len(node.children) != 1: #假设路径上的某个节点的孩子数不止一个。则它不是单个路径

break

node = node.children.values()[0] #node取得下一个节点

allElem.setdefault(node.data,node.count) #记录路径上的节点。假设是单个路径的话会用到

if len(node.children) < 1: #Tree仅仅包括单个路径

L = self.getL(items=allElem, min_sup=self.min_sup, A=A) #L即为我们要求的频繁项集

self.showResult(L) #对结果进行输出

return

else:

for item in headerTable: #对于头结点表中的元素,逐个找以其结尾的频繁项集

if A: #产生项目集B

for elem in A:

if elem != []:

temp = copy.copy(elem)

B.append(temp)

B.append([item]+temp)

else:

B.append([item])

pattem,counts = self.findPattemBase(item, headerTable) #得到以项item结尾的所以条件模式基,counts存放条件模式基的计数

myHeaderTable = {}

conditionTree_builder = tree_builder.Tree_builder(routines=pattem, counts=counts, headerTable=myHeaderTable) #新建一个Tree_builder对象,用它来构造条件FP-Tree

if conditionTree_builder.tree.root.children: #假设构造的条件FP-树不空

self.tree_mining(Tree=conditionTree_builder.tree, A=B, headerTable=myHeaderTable) #递归调用

B = []

return

def findPattemBase(self, item, headerTable):

"""功能: 依据树的头结点表去搜索树中item的条件模式基"""

itemPattem = [] #存放项item的全部模式基

counts = [] #存放模式基的计数

addressTable = headerTable[item] #头节点表中item链上所以节点的地址

for itemNode in addressTable: #对头结点表表中存放的每一个item节点

itemInPattem = [] #用来存放item模式基中的各项

nodeInPattem = itemNode.parent #item模式基的项,用它来回溯到树根。即为一条模式基

if nodeInPattem.data == 'null': #假设父亲节点就是树根,则跳过

continue

while nodeInPattem.data != 'null': #假设还没到树根,则一直回溯

itemInPattem.append(nodeInPattem.data) #把它压进item的模式基

nodeInPattem = nodeInPattem.parent #让当前节点跳到它的父亲节点,进行回溯

itemInPattem = tuple(itemInPattem)

itemPattem.append(itemInPattem) #找完了一条item的模式基了

counts.append(itemNode.count) #模式基的计数

return itemPattem,counts

def showResult(self, result=[[]]):

"""功能: 将挖掘到的频繁项集进行展示"""

for elem in result:

num = elem.pop() #频繁项集的计数

print tuple(elem),':',num

return

def combiner(self, myList, n):

"""功能: 对list列表里的全部元素进行排列组合,生成n个元组组合在一起的列表"""

answers = []

one = [0] * n

def next_c(li = 0, ni = 0):

if ni == n:

answers.append(copy.copy(one))

return

for lj in xrange(li, len(myList)):

one[ni] = myList[lj]

next_c(lj + 1, ni + 1)

next_c()

return answers

def findMinimum(self, items, elem):

"""功能: 依据items字典找出elem列表中各项计数的最小值"""

minimum = items[elem[0]]

for a in elem:

if items[a] < minimum: #假设某元素的计数更小,则记录它的计数

minimum = items[a]

return minimum

def getL(self, items, min_sup=-1, A=[]):

"""功能: 对于仅仅含单路径的树,进行生成频繁项集"""

tempResult = []

finnalResult = []

nodes = items.keys() #取得items字典的键,即单路径上的全部节点

for i in range(1,len(nodes)+1): #对nodes。即路径上的全部节点生成各种组合

tempResult += self.combiner(myList=nodes, n=i)

for elem in tempResult[::-1]: #elem逆序对dearResult訪问,由于接下来会删除元素,逆序好操作

elemMinimum = self.findMinimum(items, elem) #找出elem里面的最小计数

if elemMinimum < min_sup: #假设组合elem的最小计数小于最小支持度计数。则删除.

tempResult.remove(elem)

else: #否则把它压入结果列表中进行输出。但它仅仅是条件模式基,要加上最后一个项构成频繁项集,同一时候把最小计数也加上

for Aelem in A: #A可能含有多项

if Aelem:

temp = elem

temp += Aelem

temp.append(elemMinimum)

finnalResult.append(temp) #将挖掘出的频繁项集保存在finnalResult列表

return finnalResult

python 频繁项集_FP-Growth算法之频繁项集的挖掘(python)相关推荐

  1. python递归算法 电影院票价问题_算法课堂实验报告(二)——python递归和分治(第k小的数,大数乘法问题)...

    python实现递归和分治 一.开发环境 开发工具:jupyter notebook 并使用vscode,cmd命令行工具协助编程测试算法,并使用codeblocks辅助编写C++程序 编程语言:py ...

  2. python编程从入门到精通 叶维忠 pdf-零基础如何学习python?十本精品python书籍推荐...

    你想要学习python编程,却不知道该看哪本书?今天小编精选了学习python的十本精品书籍,并且还编写了推荐理由分享给你,希望可以给有选择困难症的同学一点帮助! 1.<"笨办法学&q ...

  3. python实现FP-growth算法发现频繁项集

    ★ FP-growth算法的作用: 该算法是代替Apriori算法来高效发现频繁集,但不能用于发现关联规则. ★ FP-growth算法的组成: 该算法需要构建三部分:1. 项头表   2. FP树  ...

  4. 使用FP-growth算法发现频繁项集

    源码如下: #coding=utf-8''' Created on Jun 14, 2011 FP-Growth FP means frequent pattern the FP-Growth alg ...

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

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

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

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

  7. java实现频繁集_数据挖掘--频繁集测试--Apriori算法--java实现

    [ 关联规则挖掘用于寻找给定数据集中项之间的有趣的关联或相关关系. 关联规则揭示了数据项间的未知的依赖关系,根据所挖掘的关联关系,可以从� ...] 2013年11月19日注:以下算法中,combin ...

  8. 频繁模式增长Frequent-Pattern Growth(FP-Growth)

    文章目录 频繁模式增长Frequent-Pattern Growth(FP-Growth) 从DB构建一个FP树 挖掘FP树 FP-Growth构建 频繁模式增长Frequent-Pattern Gr ...

  9. Frequent Pattern 挖掘之二(FP Growth算法)(转)

    FP树构造 FP Growth算法利用了巧妙的数据结构,大大降低了Aproir挖掘算法的代价,他不需要不断得生成候选项目队列和不断得扫描整个数据库进行比对.为了达到这样的效果,它采用了一种简洁的数据结 ...

  10. FP Growth算法

    转载自:http://blog.sina.com.cn/s/blog_68ffc7a40100uebg.html FP树构造 FP Growth算法利用了巧妙的数据结构,大大降低了Aproir挖掘算法 ...

最新文章

  1. Android环信爬坑指北(二)头像昵称好友备注显示
  2. web安全之windows系统基础
  3. CSS 小结笔记之清除浮动
  4. 新驾考科目三有四个地方易犯错 多名教练提供对策
  5. js检查数据类型的方法
  6. Red Hat 6.5 Samba服务器的搭建(匿名访问,免登录)
  7. 数字电路基础知识(一)
  8. 在 React 中构建一个可拖动的滑块
  9. “属你最牛” | 树莓派百变打印机
  10. Windows PE/COFF
  11. 数据分析案例-二手车价格预测
  12. 中国科学技术大学计算机考研好考吗,中国科学技术大学计算机考研复习方法谈...
  13. Vue——构造内嵌登录二维码
  14. 04、【电脑维修】Win 10重新安装微软商店以及便筏打不开问题
  15. 年薪100万?纯属忽悠!!但年薪60万真不是个梦
  16. JavaScript弹出框、对话框、提示框、弹窗总结
  17. mb计算机单位,mb是什么单位
  18. lds链接脚本基础与例子分析
  19. 基于ZigBee的智能家居安全监控系统设计
  20. Latex中自定义日期 (显示与否、带数学符号、中英文任意)

热门文章

  1. ai机器人接口TTS配置
  2. 在linux中查看nginx端口监听,Nginx端口监听(listen指令)
  3. Android进程保活方案的几种方案
  4. 把本地git分支合并到Dev分支
  5. oracle pq distribute,详解hints PQ_DISTRIBUTE
  6. AKH-0.66/K-Φ36系列开口电流互感器的规格是什么?(安科瑞-卓宋兰)
  7. 关于微信小程序textarea中的maxlength属性失效问题
  8. 利用数据库复制技术 实现数据同步更新[摘]
  9. DIV+CSS布局概述、属性(浮动、定位等)、布局类型、常见布局技巧
  10. 音视频即时通讯中P2P的流媒体技术