目录
算法简介
FP-growth算法的应用我们经常接触到。比如,你在百度的搜索框内输入某个字或词,搜索引擎会自动补全查询词项,而这些词项都是和搜索词经常一起出现的。
FP-growth算法被用来挖掘频繁项集,也就是说从已给的多条数据记录中挖掘出哪些项是频繁一起出现的。该算法适用于标称型数据,即离散型数据。它比Apriori算法更高效,因为该算法只需要对数据库进行两次扫描,而Apriori算法对于每个潜在的频繁项集都会扫描数据集判定给定模式是否频繁。
注:最后有python代码汇总。
举个例子说明什么是项,项集,频繁项集,以及支持度。
有下面这样一份数据记录。
事务ID | 事务中的元素项 |
---|---|
001 | r,z,h,j,p |
002 | z,y,x,w,v,u,t,s |
003 | z |
004 | r,x,n,o,s |
005 | y,r,x,z,q,t,p |
006 | y,z,x,e,q,s,t,m |
这份数据一共有6条记录,每条记录中的元素就是项,第1条记录中有5个项,分别为:r,z,h,j,p。项的集合就是项集,比如,[r]是一个项集,[r,z]是一个项集,[r,z,h,j,p]也是一个项集,项集是指项的任意组合。而频繁项集是指,那些在记录中经常一起出现的项组合成的集合。那么,“经常”是怎么衡量的呢?这里就涉及到支持度的概念。支持度是说出现的次数,它可以针对单个项,也可以针对项的组合,在这6条数据记录中,r 一共出现了3次,所以 r 的支持度是3,项集(r,x)出现了2次,所以(r,x)的支持度是2。
FP-growth算法挖掘频繁项集的基本过程如下:
(1)构建FP树。
(2)从FP树中挖掘频繁项集。
构建FP树
FP代表频繁模式(Frequent Pattern)。
我们先看看FP树长什么样子。以下这棵FP树是根据上面那份数据记录建立的。
可以看出,一棵FP树看上去与计算机科学中的其他树结构类似,但是它包含着连接相似节点的链接(图中的红色虚线部分)。 相似节点是指前缀路径不同的项,如在上面的FP树中 r 的前缀路径有3个,分别为(z),(z,x,y),(x,s),于是,这些 r 们就叫做相似节点。后面用python构建FP树时会创建一个字典结构存储这些相似元素。
FP树是怎么构建的呢?
在构建之前,我们要先定义一个类,用来保存树的每一个节点。
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) #打印时,子节点的缩进比父节点更深一级
运行下面这段代码:
rootNode=treeNode('pyramid',9,None) #创建节点
rootNode.children['eye']=treeNode('eye',13,None) #增加子节点
rootNode.children['phoenix']=treeNode('phoenix',3,None) #增加另一个子节点
rootNode.disp() #展示树
运行结果:
由于“eye”和“phoenix”都是”pyramid“,所以在展示树的结构时,“eye”和“phoenix”的缩进深度相同,都比”pyramid“的缩进深度更深一级。
除此之外,我们还需要把原始事务数据集处理成字典的形式,方面后面的函数调用。
定义两个函数,如下:
from collections import OrderedDict
def loadSimpDat():
simpDat=[['r','z','h','j','p'],
['z','y','x','w','v','u','t','s'],
['z'],
['r','x','n','o','s'],
['y','r','x','z','q','t','p'],
['y','z','x'