给定事务集 TS (Transaction Set), 项全集 IUS (Item Universal Set)以及支持度阈值 s0 , 求所有支持度大于 s0 的项集, 即频繁项集.
在 TS 给定以后, 任意项集的支持度 s 和它在事务集中出现的频数 f 是等价的:
我们知道FP树是一棵前缀树, 树上每个节点关联一个项. 设 i∈IUS 是一个项, fp 表示一棵FP树, 为方便叙述, 我引进以下符号:
我们说项是有大小的, 项的大小等于其支持度,, 因此项集是可以排序的. 对于已经排序的项集, 我们说”项集的最后一个元素”是指”项集中最小的项, 即项集中支持度最小的项.
我们假设用于构造FP树的事务集为 ts , 项全集为 ius . FP增长算法的第一步是从 ts , ius 构造一颗FP树 fp , 然后删掉树上所有支持度小于 s0 的单项. 这个过程同时会构造出 fp . heders .
首先, 在算法开始的时候, ius 中项的大小是未知的. 为了明确每个项的大小, 我们扫描事务集 ts , 记录每个单项 i 的支持度 si . 这个过程结束后, 我们就可以将每个事务的项集按照项的大小降序排序.
然后, 我们开始更新项全集 ius , 删除 ius 中所有支持度小于 s0 的项, 我们将更新后的项全集记为 ius′ . 我们将利用 ius′ 构造 fp .
最后, 为了尽可能地压缩前缀树, 我们让支持度最高的节点出现在树的根部, 支持度最低的节点则出现在树梢. 具体地, 对于每个 t∈ts , 我们顺序扫描其项集, 并依次将扫描到的每个项 i∈ius′ 插入到 fp 上. 在扫描过程中我们始终忽略不属于 ius′ 中的项. 注意, 对于每个新插入的节点 node , 我们都要相应地更新 fp . headers 表.
我们构造的FP树符合以下两个性质:
性质1: 树上每个节点对应的单项都是频繁的.
这是显然的, 因为不频繁的单项不会出现在 ius′ 中, 而不出现在 ius′ 中的项不会被插入到 fp 上.
性质2: 对于从根到树上任意节点的路径, 路径上不会有相同节点, 按照从根开始的方向,各个节点的支持度是单调不增的.
由于从根到任意节点的路径都来自于一个事务项集或其子集, 所以绝不会有相同的节点.另一方面, 对于一个特定的事务项集, 其支持度大的项总是被我们首先扫描并插入, 并且后插入的项总是连接到新插入的项, 因此路径上支持度是单调不增的.
由于性质2, 我们可以把FP树上从根开始的任意路径视为一个集合, 并由此得到额外的结论:
在以下两种情况下, 算法无需递归, 直接返回结果:
对于情况1, 直接返回空集.
情况2稍微复杂一些, fp 只有一个树叶, 此时树退化为一条从树根到其唯一树叶的链表.链表上的所有元素构成一个集合 S , 由FP树的性质3和性质1可知, S 的任意子集都是频繁项集, 因此, 算法返回 S 的幂集.
FP增长过程是一个递归过程, 因此以上两种情况被视为递归地基本解.
在最一般的情况下, fp 有多个分支.此时, 算法为每个(频繁)单项 i 生成一颗FP树, 称为该频繁单项的条件FP树, 记为 CFPi , 然后递归求解每棵 CFPi 上的频繁项集, 最后合并所有返回结果, 生成并返回 fp 上的所有频繁项集.
这种情况具体分三步执行.
第一步: 生成条件样式基
首先, 对于 fp 上的每个(频繁)单项 i , 我们找到 nodesi , 遍历 nodesi 中的每个节点 node , 并沿其父指针上溯, 生成(复制)一条前缀路径(注意,所有前缀路经均不包含 node 本身), 将这条复制出的路径存入该单项的条件样式基 CPBi (Conditional Pattern Base of i )中, 同时, 该路径上每个节点(单项)的支持度减少为该单项的支持度.
第二步: 生成条件事务集
从 i 的条件样式基 PCBi 生成 i 的事务集 tsi 的规则如下:
我们可以利用上述规则容易地生成对应每个项的事务集.
第三步: 生成频繁项集
设有项集 X , 且 X 在 CFPi 上的支持度为 s1 , 并且出现在 CFPi 中的事务的集合 A={t1,t2,...,ts1} 的每个事务中.现在向 A 中的每个项集添加项 i 生成新的事务集合 A′=t′1,t′2,...,t′s1 , 我们知道 A′ 必是 FP 上的事务构成的集合.
设 Y=X⋃i , 我们有以下两个结论:
第一个结论是显然的.
对于第二个结论, 设 t 以 i 结尾, 并且 t∉A′ ,
若 Y⊂t ,
则必有 (Y−i)⊂(t−i) .
由于第一步的工作, 我们有这样的事实: CFPi 中的事务是由 FP 上所有以 i 结尾的事务去掉 i 后生成的
所以 (t−i) 是 CFPi 上的事务
又因为 (Y−i)⊂(t−i)∧(Y−i)=X
所以 (t−i)∈A
所以 t∈A′ .
这与我们的假设矛盾, 因此结论2也是正确的.
对于 CPFi 中的每个项集 X , 设 X 在 CPFi 中的支持度为 s1 ; 现在向 X 中添加项 i , 并设 X 在 FP 上的支持度为 s2 . 由结论1可以知道 σFP(Y)≥σCFPi(X) , 由于 Y 是 FP 上以 i 结尾的项集, 结合结论2可以知道, 不存在 FP 上的事务 t , 使得 t∉A′∧Y⊈t . 于是, 我们有 s1=s2 .
这样, 对于 CFPi 上的任意频繁项集 X , Y=X⋃i 是 FP 上以 i 结尾的频繁项集, 另一方面, 若 Y 是 FP 上以 i 结尾的频繁项集, 则必有 X=Y−i , 且 X 是 CFPi 上的频繁项集.
于是我们可以通过在 CFPi 上的所有频繁项集 X 中添加 i , 形成 FP 上所有以 i 结尾的频繁项集 Y=X⋃i .
这样, 我们就可以构造 FP 上以任意单项 i 结尾的频繁项集, 合并这些项集, 就可以得到 FP 上的所有频繁项集.