一、FP-growth算法
FP-growth基于Apriori构建, 但在完成相同任务时采用了一些不同的技术。这里的任务是将数据集存储在一个特定的称作??树的结构之后发现频繁项集或者频繁项对, 即常在一块出现的元素项的集合FP树。这种做法使得算法的执行速度要快于Apriori,通常性能要好两个数量级以上。
FP-growth算法只需要对数据库进行两次扫描,而Apriori算法对于每个潜在的频繁项集都会扫描数据集判定给定模式是否频繁,因此FP-growth算法的速度要比Apriori 算法快。在小规模数据集上,这不是什么问题,但当处理更大数据集时,就会产生较大问题。FP-growth只会扫描数据集两次,它发现频繁项集的基本过程如下:
(1) 构建FP树
(2)从FP树中挖掘频繁项集
1.1 FP树
FP-growth算法将数据存储在一种称为FP树的紧凑数据结构中。FP代表频繁模式(Frequent Pattern)。一棵FP树看上去与计算机科学中的其他树结构类似,但是它通过链接(link)来连接相 似元素,被连起来的元素项可以看成一个链表。下图给出了FP树的一个例子。
同搜索树不同的是,一个元素项可以在一棵FP树中出现多次。FP树会存储项集的出现频率, 而每个项集会以路径的方式存储在树中。存在相似元素的集合会共享树的一部分。只有当集合之间完全不同时,树才会分叉。 树节点上给出集合中的单个元素及其在序列中的出现次数,路径会给出该序列的出现次数。
相似项之间的链接即节点链接(node link),用于快速发现相似项的位置。
1.2 FP-growth算法一般步骤:
二、代码实现
# -*- coding: utf-8 -*-
"""
Created on Mon May 14 15:21:11 2018
@author: lizihua
"""
import copy
#FP树的数据结构
#name:存放节点名字的变量;count:计数值;nodeLink:用于链接相似的元素项
#parent:指向当前节点的父节点(通常不使用,因为通常是从上往下迭代访问节点)
#children:空子典,用于存放节点的子节点
class treeNode:
def __init__(self, nameValue, numOccur, parentNode):
self.name =nameValue
self.count = numOccur
self.nodeLink =None
self.parent = parentNode
self.children = {}
#给count增加给定值
def inc(self,numOccur):
self.count += numOccur
#将树以文本形式展现
def disp(self, ind=1):
print(&#