FP Tree一个挖掘频繁项集的算法,但它和Apriori算法有一定的区别。Apriori要多次扫描数据集,而FP Tree只需要扫描两次数据集,提高了算法运行的效率。
FP Tree数据结构
1.第一部分是一个项头表。里面记录了所有的1项频繁集出现的次数,按照次数降序排列。
2.第二部分是FP Tree,它将我们的原始数据集映射到了内存中的一颗FP树。
3.第三部分是节点链表。所有项头表里的1项频繁集都是一个节点链表的头,它依次指向FP树中该1项频繁集出现的位置。这样做主要是方便项头表和FP Tree之间的联系查找和更新,也好理解。
项头表的建立
第一次扫描数据,得到所有频繁一项集的的计数。然后删除支持度低于阈值的项,将1项频繁集放入项头表,并按照支持度降序排列。接着第二次也是最后一次扫描数据,将读到的原始数据剔除非频繁1项集,并按照支持度降序排列。
FP Tree的建立
FP Tree的建立依赖项头表的建立。有了项头表和排序后的数据集,我们就可以开始FP树的建立了。开始时FP树没有数据,建立FP树时我们一条条的读入排序后的数据集,插入FP树,插入时按照排序后的顺序,插入FP树中,排序靠前的节点是祖先节点,而靠后的是子孙节点。如果有共用的祖先,则对应的公用祖先节点计数加1。插入后,如果有新节点出现,则项头表对应的节点会通过节点链表链接上新节点。直到所有的数据都插入到FP树后,FP树的建立完成。
FP-tree挖掘(挖掘频繁项集)
条件模式基就是把挖掘的节点作为叶子节点所对应的FP子树。
条件模式基怎么找:挖掘的顺序不是从上往下去挖掘的而是从项表头最底下的节点开始,向上搜索,在一条链表上的除去首个节点,就是它的条件模式基,树形结构会有分支,分支节点跟之前一样查找条件模式基,然后两个条件模式基相加。例如下面这个例子
以b为例子,假设最小支持度为2,在b这一条链上有E、C、A,因为E、C、A出现次数都大于最小支持度,所以b的条件模式基为ECA
在以E为例,最小支持度还是2,我们发现有两个E,这时候这两个E分来重复上一个的做法,在E6上他的条件模式基为CA,E2为null两者相加E的条件模式基为CA。
产生频繁项集
每一个节点通过条件模式基,看条件模式基大于或者小于最小支持度,小于最小支持度的删除,大于的则保留下来然后一层一层递归下去,直到为空。在全部节点产生出的频繁项集中,选择这个数据的最大频繁项集。
算法归纳
1、扫描数据,得到所有频繁一项集的的计数。然后删除支持度低于阈值的项,将1项频繁集放入项头表,并按照支持度降序排列。
2、扫描数据,将读到的原始数据剔除非频繁1项集,并按照支持度降序排列。
3、读入排序后的数据集,插入FP树,插入时按照排序后的顺序,插入FP树中,排序靠前的节点是祖先节点,而靠后的是子孙节点。如果有共用的祖先,则对应的公用祖先节点计数加1。插入后,如果有新节点出现,则项头表对应的节点会通过节点链表链接上新节点。直到所有的数据都插入到FP树后,FP树的建立完成。
4、从项头表的底部项依次向上找到项头表项对应的条件模式基。从条件模式基递归挖掘得到项头表项项的频繁项集(可以参见第4节对F的条件模式基的频繁二项集到频繁5五项集的挖掘)。
5、如果不限制频繁项集的项数,则返回步骤4所有的频繁项集,否则只返回满足项数要求的频繁项集。
参考文章: 刘建平FP Tree