FP-Growth算法python实现之 FP-tree的构造

本文主要介绍FP-tree的构造算法。上接:FP-Growth算法python实现

tree_builder.py代码:

#coding=utf-8

import tree_building

class Tree_builder(object):
    """tree_builder类。 作用:根据事务数据集进行数据准备及构造树."""
    def __init__(self, routines, min_sup=-1, counts=[], headerTable={}):
        """类的初始化。 routines:事务数据集; min_sup:最小支持度及数; counts:每个事务出现的次数,默认为1; headerTable:头结点表,建造的FP_tree各结点的索引表。"""
        self.routines = routines
        self.counts = counts
        self.min_sup = min_sup
        self.items = self.getItems(self.routines)          #获取所有项
        self.sortedItems = self.getSortedItems(self.items)        #对所有项进行并排序,把计数小于min_sup的项移除,生成有序的频繁1-项集
        self.itemsTable = self.initItemsTable(headerTable)
        self.tree = self.treeBuilding(self.counts)

    def getItems(self, routines):
        """功能:扫描事务数据集,返回它的项集即各项的计数"""
        items = {}
        for routine in routines:
            for elem in routine:
                    items.setdefault(elem,0)
                    items[elem] += 1
        return items

    def getSortedItems(self, items=None):
        """功能:对项集进行排序,并删去非频繁项,得到频繁1-项集"""
        sortedItems = []
        temp = sorted(items.iteritems(), key=lambda asd:asd[1], reverse=True)       #对字典items进行排序
        for elem in temp:
            if elem[1] >= self.min_sup:             #只取计数大于等于最小支持度及数的项
                sortedItems.append(elem[0])
        return sortedItems

    def getSortedRoutine(self, routine):
        """功能:根据排序好的频繁1-项集对某一条事务routine进行排序"""
        sortedRoutine = []
        for elem in self.sortedItems:
            if elem in routine:
                sortedRoutine.append(elem)
        return sortedRoutine

    def initItemsTable(self, itemsTable):
        """功能:头结点表的初始化"""
        for item in self.sortedItems:
            itemsTable.setdefault(item,[])
        return itemsTable

    def treeBuilding(self, counts):
        """功能:逐条取出事务,控制FP_Tree树的构造"""
        tree = tree_building.Tree(itemTable=self.itemsTable)             #生成一个树对象
        for routine in self.routines:                           #对事物数据集中的事务,逐条进行构造树
            sortedRoutine = self.getSortedRoutine(routine)          #用一条事务构造树之前先进行排序
            if counts:                      #如果counts不为空,即是在用模式基在构造条件树,此时需要考虑模式基的计数
                count = counts.pop(0)
            else:
                count =1
            tree.addRoutine(routine=sortedRoutine, Rroot=tree.root, count=count)             #用排序好的事务构造树
        return tree

tree_building.py代码:

#coding=utf-8

class Node(object):
    """Node类. 作用:开辟一个树节点"""
    def __init__(self, data=-1, count=0, parent=None):
        """Node类的初始化, 一个节点信息包括:项的值,计数,父亲节点,所有孩子节点"""
        self.data = data
        self.count = count
        self.parent = parent
        self.children = {}

class Tree(object):
    """tree_growth类. 作用:建造树"""
    def __init__(self, data=-1, parent=None, itemTable=None):
        """tree_growth类的初始化,开辟一个树根"""
        self.root = Node(data=‘null‘, parent=self)
        self.itemTable = itemTable

    def addRoutine(self, routine, Rroot, count):
        """功能:根据事务routine递归构造树, Rroot是树的根节点, count是routine出现的次数(构造条件FP_tree的时候游泳)"""
        if len(routine) <= 0:       #如果事务为空,则终止
            return
        elem = routine.pop(0)
        if elem in Rroot.children:          #如果事务中的元素在树的已有路径上
            nextNode = Rroot.children[elem]          #如果事务中的元素在树的已有路径上 ,则不用新建路径
        else:                                       #否则,新建一条路径
            newNode = Node(data=elem, parent=Rroot)         #新建一个节点
            Rroot.children.setdefault(elem,newNode)         #新节点的路径放在当前节点的孩子列表中
            nextNode = newNode
        nextNode.count += count         #更新路径上节点的计数,即加上当前节点的计数
        if nextNode not in self.itemTable[elem]:        #如果下一个节点是新建的,则把它压入头结点表中
            self.itemTable[elem].append(nextNode)
        self.addRoutine(routine=routine, Rroot=nextNode, count=count)           #递归构造树
        return

版权声明:转载请注明出处,谢谢!

时间: 2024-10-11 06:34:44

FP-Growth算法python实现之 FP-tree的构造的相关文章

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

FP树构造 FP Growth算法利用了巧妙的数据结构,大大降低了Aproir挖掘算法的代价,他不需要不断得生成候选项目队列和不断得扫描整个数据库进行比对.为了达到这样的效果,它采用了一种简洁的数据结构,叫做frequent-pattern tree(频繁模式树).下面就详细谈谈如何构造这个树,举例是最好的方法.请看下面这个例子: 这张表描述了一张商品交易清单,abcdefg代表商品,(ordered)frequent items这一列是把商品按照降序重新进行了排列,这个排序很重要,我们操作的所

Aprior算法、FP Growth算法

数据挖掘中有一个很重要的应用,就是Frequent Pattern挖掘,翻译成中文就是频繁模式挖掘.这篇博客就想谈谈频繁模式挖掘相关的一些算法. 定义 何谓频繁模式挖掘呢?所谓频繁模式指的是在样本数据集中频繁出现的模式.举个例子,比如在超市的交易系统中,记载了很多次交易,每一次交易的信息包括用户购买的商品清单.如果超市主管是个有心人的话,他会发现尿不湿,啤酒这两样商品在许多用户的购物清单上都出现了,而且频率非常高.尿不湿,啤酒同时出现在一张购物单上就可以称之为一种频繁模式,这样的发掘就可以称之为

FP—Growth算法

FP_growth算法是韩家炜老师在2000年提出的关联分析算法,该算法和Apriori算法最大的不同有两点: 第一,不产生候选集,第二,只需要两次遍历数据库,大大提高了效率,用31646条测试记录,最小支持度是2%, 用Apriori算法要半个小时但是用FP_growth算法只要6分钟就可以了,效率非常明显. 它的核心是FP_tree,一种树型数据结构,特点是尽量把相同元素用一个节点表示,这样就大大减少了空间,和birch算法有类似的思想.还是以如下数据为例. 每一行表示一条交易,共有9行,既

FP Growth

在Apriori算法原理总结中,我们对Apriori算法的原理做了总结.作为一个挖掘频繁项集的算法,Apriori算法需要多次扫描数据,I/O是很大的瓶颈.为了解决这个问题,FP Tree算法(也称FP Growth算法)采用了一些技巧,无论多少数据,只需要扫描两次数据集,因此提高了算法运行的效率.下面我们就对FP Tree算法做一个总结. 1. FP Tree数据结构 为了减少I/O次数,FP Tree算法引入了一些数据结构来临时存储数据.这个数据结构包括三部分,如下图所示: 第一部分是一个项

【甘道夫】并行化频繁模式挖掘算法FP Growth及其在Mahout下的命令使用

今天调研了并行化频繁模式挖掘算法PFP Growth及其在Mahout下的命令使用,简单记录下试验结果,供以后查阅: 环境:Jdk1.7 + Hadoop2.2.0单机伪集群 +  Mahout0.6(0.8和0.9版本都不包含该算法.Mahout0.6可以和Hadoop2.2.0和平共处有点意外orz) 部分输入数据,输入数据一行代表一个购物篮: 4750,19394,25651,6395,5592 26180,10895,24571,23295,20578,27791,2729,8637 7

FP - growth 发现频繁项集

FP - growth是一种比Apriori更高效的发现频繁项集的方法.FP是frequent pattern的简称,即常在一块儿出现的元素项的集合的模型.通过将数据集存储在一个特定的FP树上,然后发现频繁项集或者频繁项对.通常,FP-growth算法的性能比Apriori好两个数量级以上. FP树与一般的树结构类似,但它通过链接(Link)来连接相似元素,被连起来的元素项可以看成一个链表. 上图是一棵FP树,一个元素项可以在一棵FP树种出现多次,FP树的节点会存储项集的出现频率,每个项集会以路

Fp关联规则算法计算置信度及MapReduce实现思路

说明:參考Mahout FP算法相关相关源代码. 算法project能够在FP关联规则计算置信度下载:(仅仅是单机版的实现,并没有MapReduce的代码) 使用FP关联规则算法计算置信度基于以下的思路: 1. 首先使用原始的FP树关联规则挖掘出全部的频繁项集及其支持度:这里须要注意,这里是输出全部的频繁项集,并没有把频繁项集合并,所以须要改动FP树的相关代码,在某些步骤把全部的频繁项集输出:(ps:參考Mahout的FP树单机版的实现,进行了改动,暂不确定是否已经输出了全部频繁项集) 为举例简

【机器学习算法-python实现】决策树-Decision tree(1) 信息熵划分数据集

(转载请注明出处:http://blog.csdn.net/buptgshengod) 1.背景 决策书算法是一种逼近离散数值的分类算法,思路比較简单,并且准确率较高.国际权威的学术组织,数据挖掘国际会议ICDM (the IEEE International Conference on Data Mining)在2006年12月评选出了数据挖掘领域的十大经典算法中,C4.5算法排名第一.C4.5算法是机器学习算法中的一种分类决策树算法,其核心算法是ID3算法. 算法的主要思想就是将数据集依照特

【机器学习算法-python实现】决策树-Decision tree(2) 决策树的实现

(转载请注明出处:http://blog.csdn.net/buptgshengod) 1.背景 接着上一节说,没看到请先看一下上一节关于数据集的划分数据集划分.如今我们得到了每一个特征值得信息熵增益,我们依照信息熵增益的从大到校的顺序,安排排列为二叉树的节点.数据集和二叉树的图见下. (二叉树的图是用python的matplotlib库画出来的) 数据集: 决策树: 2.代码实现部分 由于上一节,我们通过chooseBestFeatureToSplit函数已经能够确定当前数据集中的信息熵最大的

FP_Growth算法python实现

FP_Growth算法是关联分析中比较优秀的一种方法,它通过构造FP_Tree,将整个事务数据库映射到树结构上,从而大大减少了频繁扫描数据库的时间. FP_Growth算法主要分成两个步骤,第一步是构造FP-Tree,第二步是从FP-Tree中提取频繁项集. 更多关联分析和FP_Growth的介绍以及伪代码请见:什么是关联分析.FP-Growth算法的介绍. 本文主要目的是介绍python实现FP_Growth算法的代码. FP_Growth项目目录有四个文件: >FP_Growth ? __i