py2.7《机器学习实战》使用FP-growth算法高效发现频繁项集

1、前言:在我们使用搜索引擎时,每当打出一些关键字,搜索引擎就会给我们自动补全推荐一些有关搜索,使用的就是FP-growth

2、FP-growth 与 Apriori 的对比 :只需要对数据库扫描两次,而Apriori会对每个潜在的频繁项集都会扫描数据集判断给定模式是否频繁,所以前者的速度更快,但是前者并不能发现关联规则



一、FP树的定义

#-*- coding:utf-8 -*-
class treeNode:
    def __init__(self,nameValue,numOccur,parentNode): #存放节点名字的变量和计数值
        self.name = nameValue
        self.count = numOccur
        self.nodeLink = None #类似于链表指针
        self.parent = parentNode #指向当前父节点
        self.children = {} #存放节点的子节点

    def inc(self,numOccur):
        self.count += numOccur

    def disp(self,ind=1): #将节点以文本的形式显示
        print " "*ind , self.name , ' ' , self.count
        for child in self.children.values():
            child.disp(ind+1)

测试样例:

import fpGrowth
rootNode = fpGrowth.treeNode('pyramid' , 9 , None)
rootNode.children['eye'] = fpGrowth.treeNode('eye',13,None)
print rootNode.disp()

输出结果:

  pyramid   9
   eye   13


二、FP树构建函数:

    def createTree(dataSet,minSup = 1):
        headerTabel = {}
        for trans in dataSet:
            for item in trans:
                headerTabel[item] = headerTabel.get(item,0) + dataSet[trans]
        for k in headerTabel.keys():
            if headerTabel[k] < minSup:
                del (headerTabel[k]) #如果不满足最小支持度,删除
        freqItemSet = set(headerTabel.keys()) #去重
        if len(freqItemSet)==0 : return None,None
        for k in headerTabel:
            headerTabel[k] = [headerTabel[k],None]
        retTree = treeNode('Null Set',1,None)
        for tranSet , count in dataSet.items():  #根据全局频率对每个事物中的元素进行排序
            localID = {}
            for item in tranSet:
                if item in freqItemSet:
                    localID[item] = headerTabel[item][0]
            if len(localID) > 0 :
                orderedItem[ v[0] for v in sorted(localID.items(),key=lambda p:p[1],reversed=True)]
                updateTree(orderedItem,retTree,headerTabel,count) #使用排序后的频繁项集填充
        return retTree,headerTabel

    def updateTree(items,inTree,headerTable,count):
        if items[0] in inTree.children:
            inTree.children[items[0]].inc(count)
        else:
            inTree.children[items[0]] = treeNode(items[0],count,inTree)
            if headerTable[items[0]][1] == None:
                headerTable[items[0]][1] = inTree.children[items[0]]
            else:
                updateHeader(headerTable[items[0]][1], inTree.children[items[0]])
        if len(items) > 1:
            updateTree(items[1::],inTree.children[items[0]],headerTable ,count)

    def updateHeader(nodeToTest,targetNode):
        while(nodeToTest.nodeLink != None ):
            nodeToTest = nodeToTest.nodeLink
        nodeToTest.nodeLink = targetNode


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kelisita

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值