频繁模式增长算法(FP-growth)

算法提出的背景

尽管有着很多的办法用来提升Apriori算法效率,但是如下的两个问题并没有得到很好的解决:

  • 仍会产生大量的候选集,比如10410^4个频繁1项集,就需要产生10710^7个频繁2项集
  • 在产生频繁K项集的过程中,需要重复的扫描数据库,开销很大

FP-growth算法的基本原理

FP-growth算法的提出,就很好的解决了在产生候选项集过程中巨大的开销。

它采用了分治的策略,基本步骤如下:

  • 首先,将代表频繁项集的数据库压缩到一棵频繁模式树(FP-Tree)
  • 然后把这种压缩后的数据库划分成一组条件数据库,每个数据库关联一个频繁项或“模式段”,并分别挖掘每个条件数据库。

随着被考察模式的“增长”,这种方法可以显著地压缩被搜索的数据集大小。

构造FP树

下面我们首先来看FP-growth算法的第一步,如何根据给定的事务集构造一颗FP树。构造FP树的算法流程如下所示

  1. 扫描事务数据库DD一次。收集频繁项的集合FF和它们的支持度。对FF按支持度降序排序,结果为频繁项表LL
  2. 创建FPFP树的根结点,以nullnull标记它。对于DD中每个事务TransTrans,执行如下操作:选择 TransTrans中的频繁项,并按LL中的次序排序。设排序后的频繁项表为[pP][p | P],其中pp 是第一个元素,而PP是剩余元素的l列表。调用insert_tree([p | P], T)。该过程执行情况如下:如果TT有子女NN使得N.itemname=p.itemnameN.item-name = p.item-name,则NN的计数增加1;否则创建一个新结点NN,将其计数设置为1,链接到它的父结点TT,并且通过结点链结构将其链接到具有相同itemnameitem-name的结点。如果PP非空,递归地调用insert_tree(P, N)。

下面我们通过一个具体的例子来看一下FP树的构造过程,假设事务集如下所示

TID List of item_IDs
T100 I1, I2, I5
T200 I2,I4
T300 I2,I3
T400 I1,I2,I4
T500 I1,I3
T600 I2,I3
T700 I1,I3
T800 I1,I2,I3,I5
T900 I1,I2,I3

按照算法的流程,我们首先扫描事务数据库,找到频繁1项集和它们对应的支持度,并降序排列,结果如下

Item ID Support count
I2 7
I1 6
I3 6
I5 2
I4 2

然后开始构造TP树,首先创建根节点null,然后看第一条事务T100T100={I1,I2,I5I1,I2,I5},因为此时只有根节点,所以按序创建如下的子树(书上叫节点链结构)

频繁模式增长算法(FP-growth)

接着处理第二条事务T200T200={I2,I4I2,I4},因为已经有了I2I2的节点,只需要创建新的I4I4节点,并将I2I2的计数加1,其余的节点不受影响 。


频繁模式增长算法(FP-growth)

T300T300={I2,I3I2,I3}和T200T200进行相似的处理,将I2I2计数加1,并创建新的节点I3I3


频繁模式增长算法(FP-growth)

处理T400T400={I1,I2,I4I1,I2,I4},方法一样


频繁模式增长算法(FP-growth)

处理T500T500={I1,I3I1,I3}时子树不是以I2I2开始的,所以需要新建一个子树包含I1I1I3I3


频繁模式增长算法(FP-growth)

T600T700T800T900T600、T700、T800、T900的过程和上面的类似,这里就不一一赘述,直接给出构造过程


频繁模式增长算法(FP-growth)
频繁模式增长算法(FP-growth)
频繁模式增长算法(FP-growth)
频繁模式增长算法(FP-growth)

最后我们就可以生成如下的一颗FP树,为了后边挖掘时遍历的方便,创建项头表,使每项通过节点链指向它树中的位置,如下所示。

频繁模式增长算法(FP-growth)

从FP树中挖掘频繁模式

在构造好FP树之后,我们就可以对其进行挖掘。在此之前先阐述两个概念:

  • 条件模式基:当选择一后缀,FP树中与该后缀一起出现的前缀路径集。如下所示,当后缀为I5I 5时,它的条件模式基就是{I2,I1:1I2,I1:1}和{I2,I1,I3:1I2,I1,I3:1}


    频繁模式增长算法(FP-growth)

  • 条件FP树:将得到得条件模式基作为新的事务数据库构造FP树得到的就是条件FP树

在明白了其中涉及的概念后,我们开始从FP树中挖掘频繁模式。

下面先给出从FP树中进行频繁模式挖掘的算法流程,,接下来的挖掘过程就是按照这样的思想一步步进行


频繁模式增长算法(FP-growth)

为了方便查看,这里再次给出频繁1项集和其支持度的表

Item ID Support count
I2 7
I1 6
I3 6
I5 2
I4 2

I5I5

按照算法的流程,首先看项头表的第一项I5I5(倒序排列),α=null\alpha=nullα1=I5\alpha_{1}=I 5β=αα1=I5\beta=\alpha ∪ \alpha1=I 5β.sup=2\beta.sup=2。然后找到I5I5的条件模式基如下所示为{{I2,I1:1I2,I1:1},{I2,I1,I3:1I2,I1,I3:1}}


频繁模式增长算法(FP-growth)

将其作为新的事务集构造FP树如下所示,因为{I1,I2,I3:1I1,I2,I3:1}支持度小于2,所以将其删除。得到最后的Treeβ=Tree_{\beta}= <I2:2,I1:2I2:2,I1:2>,如下所示:


频繁模式增长算法(FP-growth)

它只有一条路径,包含两个节点,所以只有三种组合方式β=\beta= {I2:2I2:2},{I1:2I1:2},{I2,I1:2I2,I1:2},βα=\beta ∪ \alpha={I2,I5:2I2, I5: 2}, {I1,I5:2I1, I5: 2}, {I2,I1,I5:2I2, I1, I5: 2}
故得到的频繁模式为:{I2,I5:2I2, I5: 2}, {I1,I5:2I1, I5: 2}, {I2,I1,I5:2I2, I1, I5: 2}

I4I4

然后看I4I4α=null\alpha=null,α2=I5\alpha_{2}=I 5β=αα2=I5\beta=\alpha ∪ \alpha_{2}=I 5β.sup=2\beta.sup=2。然后找到I4I4的条件模式基如下所示为{{I2,I1:1I2,I1:1},{I2:1I2:1}}


频繁模式增长算法(FP-growth)

然后同样构造新的FP树Treeβ=Tree_{\beta}=<I2:2I2:2>,它同样只有一条路径且只包含一个节点,故只有一种组合方式 β=\beta={I2,I4:2I2,I4:2},得到新的频繁模式{I2,I4:2I2,I4:2}

频繁模式增长算法(FP-growth)

I3I3

接着看α3=I3\alpha_{3}=I3,同样有α=null\alpha=nullα3=I3\alpha_{3}=I 3β=αα3=I3\beta=\alpha ∪ \alpha_{3}=I 3β.sup=6\beta.sup=6。然后找到I3I3的条件模式基如下所示为{{I2,I1:2I2,I1:2},{I2:2I2:2},{I1:2I1:2}}


频繁模式增长算法(FP-growth)

构造的新的FP树Treeβ=Tree_{\beta}= <I2:4,I1:2I2:4,I1:2>,<I1:2I1:2>,这里和上面的情况不同,这里有两条路径


频繁模式增长算法(FP-growth)

我们需要跳到步骤4,重新继续前面类似的过程如下所示:

先看第一个分支<I2:4,I1:2I2:4,I1:2>,α1=I1,β=α1α=\alpha_{1}=I1,\beta=\alpha_{1}∪\alpha={I1,I3I1,I3},βsup=4\beta_{sup}=4β\beta的条件模式基为{I2:1I2:1},故Treeβ=Tree_{\beta}=<I2:1I2:1>


频繁模式增长算法(FP-growth)

非空,只有一条路径且只包含一个节点,故β=βα=\beta=\beta ∪\alpha={I2,I1,I3:2I2,I1,I3:2},,得到频繁模式{I2,I1,I3:2I2,I1,I3:2}


频繁模式增长算法(FP-growth)

看第二个分支<I1:2I1:2>,α2=I2\alpha_{2}=I2β=α2α=\beta=\alpha_{2}∪\alpha={I2,I3I2,I3},βsup=4\beta_{sup}=4β\beta的条件模式基为{},故Treeβ=Tree_{\beta}={},这里TreeβTree_{\beta}为空,所以不再产生新的频繁模式.

故针对I3I3产生的全部频繁模式为{I2,I1,I3:2I2,I1,I3:2},{I1,I3:4I1,I3:4},{I2,I3:4I2,I3:4}

之所以有频繁模式{I1,I3:4I1,I3:4},{I2,I3:4I2,I3:4}是因为I1I1I2I2在最初的FP树中就是I3I3的前缀,所以它们的计数一定大于I3I3,所以它们的组合一定是频繁模式。

I1I1

再看α4=\alpha_{4}= I1I1β=α4α=\beta=\alpha_{4}∪\alpha={I1I1},βsup=6\beta_{sup}=6,条件模式基为{I2:4I2:4}


频繁模式增长算法(FP-growth)
Treeβ=Tree_{\beta}=<I2:4I2:4>只有一条路径,一个节点,一种组合方式,所以β=\beta={I2,I1:4I2,I1:4},得到频繁模式{I2,I1:4I2,I1:4}

频繁模式增长算法(FP-growth)

I2I2

最后只包含一个节点I1I1的条件模式基为{I2:4I2:4},Treeβ=Tree_{\beta}=<I2:4I2:4>,所以得到一个频繁模式{I2:I1:4I2:I1:4}。

所以挖掘原始的事务集构造的FP树得到如上所示的所有频繁模式。

P.S. 最初看这部分内容一下懵住了,么看懂,后来听同学讲才理解了它的整个过程,感谢刘老师的讲述!!

加强强关联规则的提取

前面在Apriori算法中由最小支持度和最小置信度得到的强关联规则具有一定的欺骗性,所以引入了相关性度量来扩充度量框架。

提升度
lift(A,B)=P(AB)P(A)P(B)lift(A,B)=\frac{P(A∪B)}{P(A)P(B)}
如果值小于1,表示A的出现和B的出现是负相关的;如果值大于1,表示两者是正相关的;如果值等于1,表示A和B是独立的,两者不具有相关性。

全置信度
all_conf(A,B)=SUP(AB)max{sup(A),sup(B)}=min{P(AB),P(BA)}all\_conf(A,B)=\frac{SUP(A∪B)}{max\{sup(A),sup(B)\}}=min\{P(A|B),P(B|A)\}

最大置信度
max_conf(A,B)=max{P(AB),P(BA)}max\_conf(A,B)=max\{P(A|B),P(B|A)\}

Kulczynski度量
Kulc(A,B)=12(P(AB),P(BA))Kulc(A,B)=\frac{1}{2}(P(A|B),P(B|A))

余弦
cosine(A,B)=P(AB)P(A)×P(B)=sup(AB)sup(A)×sup(B)=P(AB)×P(BA)cosine(A,B)=\frac{P(A∪B)}{\sqrt{P(A)\times P(B)}}=\frac{sup(A∪B)}{\sqrt{sup(A)\times sup(B)}}=\sqrt{P(A|B)\times P(B|A)}

以上的度量方式只受P(AB),P(BA)P(A|B),P(B|A)的影响,而不受事务总数的影响,每个度量值都0~1,而且值越大,两者的联系越密切。

同时为了评估两个项集之间的不平衡度引入了不平衡比,定义如下:
IR(A,B)=sup(A)sup(B)sup(A)+sup(B)sup(AB)IR(A,B)=\frac{|sup(A)-sup(B)|}{sup(A)+sup(B)-sup(A∪B)}

在实际使用中推荐Kulczynski度量和不平衡比一起使用,来提供项集间的模式联系。