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

来源:互联网 发布:wifi破解源代码 c语言 编辑:程序博客网 时间:2024/05/20 16:00

前言:

关于 FP-Growth 算法介绍请见:FP-Growth算法的介绍。
本文主要介绍 FP-tree 的构造算法,关于伪代码请查看上面的文章

上接:FP-Growth算法python实现;下接:FP-Growth算法之频繁项集的挖掘(python)。


正文:

tree_builder.py文件:

#coding=utf-8import tree_buildingclass 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_builder.py 文件主要实现两个动作:

  1. 数据预处理(包括项的搜索和排序、头结点表的初始化、事务的排序等)
  2. 根据事务,调用 Tree.addRoutine() 构造树。


tree_building.py文件:

#coding=utf-8class 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

tree_building.py文件主要包含两个类:

  1. Node类用来存放树节点信息。
  2. Tree类主要实现树的构造。addRoutine() 方法根据事务 routine 中的项递归构造树。



FP-Growth算法python实现(完整代码)。
备注:该代码是在 Python2.7+eclipse 环境下编写的。可在eclipse中导入项目,也可在命令行窗口用python命令执行“__init__.py”文件。


转载请注明出处,谢谢!(原文链接:http://blog.csdn.net/bone_ace/article/details/46747669)
0 0
原创粉丝点击