三.FP-tree算法
下面介绍一种使用了与Apriori彻底不一样的方法来发现频繁项集的算法FP-tree。FP-tree算法在过程当中没有像Apriori同样产生候选集,而是采用了更为紧凑的数据结构组织tree, 再直接从这个结构中提取频繁项集。FP-tree算法的过程为:html
首先对事务中的每一个项计算支持度,丢弃其中非频繁的项,每一个项的支持度进行倒序排序。同时对每一条事务中的项也按照倒序进行排序。算法
根据每条事务中事务项的新顺序,依此插入到一棵以Null为根节点的树中。同时记录下每一个事务项的支持度。这个过程完成以后,咱们就获得了棵FP-tree树结构。数据库
对构建完成的FP-tree,从树结构的上方到下方对每一个项,将先前的路径转化为条件FP-tree。数据结构
根据每棵条件FP-tree,找出全部频繁项集。spa
这个对FP-tree算法过程的描述比较抽象,咱们经过下面这个例子具体地了解一下FP-tree算法是如何找到频繁项集的。htm
(source: 数据挖掘:概念与技术Jiawei, Han)blog
首先对实务中的全部项集计算支持度,而后按照倒序排序,以下图中的绿表所示。而后对每条事务中的项也按照这个倒序,从新排列。例如,对T100这个事务,原来是无序的Ⅰ1, Ⅰ2, Ⅰ5, 但由于Ⅰ2的支持度按照倒序排列在Ⅰ1以前,所以从新排序以后的顺序为Ⅰ2,Ⅰ1,Ⅰ5。通过从新排序后的事务的项集以下表中的第三列所示。排序
从新扫描事务库,按照从新排序的项集的顺序依次插入以NULL为根节点的树中。对事务T100, 依次建立Ⅰ2,Ⅰ1,Ⅰ5三个结点,而后能够造成一条NULL→Ⅰ2→Ⅰ1→Ⅰ5的路径,该路径上全部结点的频度计数记为1。对事务T200,FP-tree中已经存在告终点Ⅰ2,因而造成一条NULL→Ⅰ2→Ⅰ4的路径,同时建立一个Ⅰ4的节点。此事,Ⅰ2结点上的频度计数增长1,记为2,同时结点Ⅰ4的频度计数记为1。按照相同的过程,扫描完库中的全部事务以后能够获得下图的树结构。事务
对于构建完成的FP-tree,从树的底部开始依次构建每一个项的条件FP-tree。首先咱们在上图中找到节点Ⅰ5,发现可以达到Ⅰ5的路径有两条{ Ⅰ2,Ⅰ1,Ⅰ5 :1}和{ Ⅰ2,Ⅰ1,Ⅰ3,Ⅰ5 :1}。get
基于这两天路径来构造Ⅰ5的条件tree如同下图所示,其中Ⅰ3要被舍去,由于这里Ⅰ3的计数为1不能知足频繁项集的条件。而后用Ⅰ5的前缀{ Ⅰ2,Ⅰ1:2}列举全部与后缀Ⅰ5的组合,最终获得{Ⅰ2,Ⅰ5 },{ Ⅰ2,Ⅰ1 }和{Ⅰ2,Ⅰ1,Ⅰ5 }三个频繁项集。
对全部项执行上述步骤,咱们能够获得全部项产生的频繁项集。
http://www.javashuo.com/article/p-phvwmtds-ea.html
优缺点评价:
FP-tree算法相对于Apriori算法,时间复杂度和空间复杂都有了显著的提升。可是对海量数据集,时空复杂度仍然很高,此时须要用到数据库划分等技术。