21/7/8 读书笔记 关联规则提取 频繁项集的紧凑表示 FP增长算法
21/7/8 读书笔记
数据挖掘导论 规则的产生
在昨天我们探讨了如何从事务数据中提取出符合一定支持度的频繁项集,接下来我们需要从这些频繁项集中提取出相应的关联规则。我们将一个频繁项集\(A\)分为两个非空的不相交的子集\(X\)和\(A-Y\),忽略哪些\(\boldsymbol X\to \empty\)或者\(\empty \to \boldsymbol Y\)这样的无效规则,理论上依据这个方法我们能够从一个频繁k项集中能够提取出\(2^k-2\)个关联规则。
这显然是一个计算开销很大的问题,因此我们需要考虑剪枝。剪枝的原理类似于我们之前的先验原理。置信度并不具有和支持度一样的单调性,但是其也具有一个类似性质:如果规则\(\boldsymbol X\to\boldsymbol Y-\boldsymbol X\)不满足置信度阈值,那么\(\boldsymbol X' \to \boldsymbol Y - \boldsymbol X'\),其中\(\boldsymbol X'\subseteq \boldsymbol X\)。因此,我们可以先考察\(\boldsymbol A\to \empty\),然后按前件大小递减的方式遍历所有可能的规则组合,如果发现规则不符合置信度要求,就可以剪掉所有前件属于该规则当前前件的其他规则。
在置信度的计算过程中,我们发现不需要再遍历原项集集合,而是直接使用上一步计算得到的支持度计数来得到置信度(置信度的计算方式见上一章)。
数据挖掘导论 频繁项集的紧凑表示
从事务集合中提取出的频繁项集有时是极为庞大的,而其相互之间可能也具有一些相互推导的关系。这一章讨论如何从所有频繁项集中提取出一部分较小的、具有代表性的、可以推导出其他所有频繁项集的子集,并利用它们还原出所有频繁项集,主要围绕极大频繁项集和闭频繁项集进行讨论。
极大频繁项集 maximal frequent itemset
考虑一个项集格结构,我们可以发现所有的非频繁项集都集中在下部分,而频繁项集都集中在上部分,这是由支持度计数的先验原理所保证的。我们将直接超类是非频繁项集的频繁项集称为极大频繁项集,在项集格中表现为频繁项集区域中最靠近频繁-非频繁边界的所有频繁项集。极大频繁项集有效地提供了频繁项集的紧凑表示,我们可以认为对于极大频繁项集,其所有子集(包括他们本身)都是频繁的。这种还原是完备的,意味着所有频繁项集都能被推导出来。
闭频繁项集 closed itemset
我们将直接超类的支持度与自己不同的频繁项集称为闭频繁项集(显而易见,所有极大频繁项集都是闭频繁项集)。使用闭频繁项集进行规则提取,能够很好地降低冗余规则的产生。闭频繁项集相当于将原频繁项集按照项之间的关联度进行了划分,使得关联性强的项用极大的方式表现出来,而避免产生很多小的项集。
冗余规则:比如{a,b}->{c,d}和{a}->{c,d}的支持度和置信度一致,那么{a}->{c,d}应该是一个冗余的规则,因为前件的缩写并没有导致规则的性质改变。而我们可以发现{a,b}是闭频繁项集(假设{a,b,c}非频繁),而{a}肯定不是,因此闭频繁项集能够提前筛选掉这些冗余规则。
数据挖掘导论 FP增长算法
FP增长算法是一种完全不同于利用项集进行合成的方法,其采用一种FP树的结构表示事务数据,并直接从其中提取频繁项集。
FP树被描述为这样一棵树:
- 根节点为null,其余每个节点包含一个项元素和对应于该项元素的一个计数值
- 父子结点间存在双向的指针
- 所有含有相同项元素的点之间利用单向指针链接
构建一棵FP树的步骤可以被描述为:
- 首次遍历所有的项元素(即1项集),得出所有项元素的支持度计数,按计数值排序,比如得出{a,b,c,d,e}这个有序集合
- 第二次遍历,正式开始构造FP树。对于一个事务,比如{b,a,e},依照上述得到的排序得出一条路径\(null\to a\to b\to e\)。从左向右依次遍历路径上的节点,假设的元素为x,需要遍历的结点集合为\(\boldsymbol Y\):
- 如果x不存在于\(\boldsymbol Y\)中,则创建x结点,并将对应计数值设为1
- 如果x存在,这对应计数值加1,并以该结点的子结点集合为\(\boldsymbol Y\),继续下一次搜索
- 按照2的方式将所有事务都表示为一条路径,得到的树结构中可能存在含有相同项元素的节点,将含有相同元素的结点之间构建一个链表存储起来,以方便后续的访问
最终的FP树表现为以下形式:
其中Head table存储了相应项元素结点的链表。
我们可以得到FP树的基本性质:
- 每条路径从根节点出发,每个结点对应项元素的排名越靠后
- 每条路径从根节点出发,每个结点对应计数值逐渐降低
- 其构造与项元素的排序方式有关
通过FP增长算法得到频繁项集
假设我们对项的排序是{a,b,c,d,e},需要的最小支持度计数为\(k_{min}\)。
我们需要按排名从后往前的顺序进行遍历,需要先找到以e为后缀的频繁项集,我们将其描述为以下步骤:
- 按照head table,我们能够很容易找到一棵所有路径均以e结尾的以null为根节点的树,称这些路径为前缀路径
- 按照head table找到所有e的结点,将计数值加起来,判断{e}是不是频繁项集
- 如果是,则将问题进一步升级为找到以ae、be、ce、de为后缀的频繁项集,进入第3步
- 如果不是,则没有以e为后缀的频繁项集,回到第1步,继续计算排名靠前一位的项元素
- 更新前缀路径:对前缀路径上的所有结点,将其计数值更新为以其为根结点的含有e的路径的数目。
- 更新后,按照总计数值(即相同项元素结点的计数值累加计算)进行修剪,总计数值小于最小支持度计数\(k_{min}\)的结点被删掉,其子结点与其父结点构建起联系
- 删去e结点,因为此时我们考虑的所有后者都有e,所以e本身已经不再重要。我们称删去e后的树为e的条件FP树
- 在e的条件FP树中考虑以a为后缀的频繁项集问题,完全等价于在原FP树中考虑以ae为后缀的频繁项集问题。由此我们能够递归地去解决这个问题,找到所有频繁项集
FP增长算法相较于之前介绍的频繁项集生成算法,其性能依赖于压缩因子(compaction factor)。如果事务之间的项集的重叠度越高,FP数的路径重复越好,相应问题的压缩因子越高。

浙公网安备 33010602011771号