- 核心思想: 基于两条定律,减少频繁项集的生成时间:
- 如果一个项集是频繁的,则它的所有子集都是频繁的。就像如果 {啤酒, 尿布, 牛奶} 经常被一起购买,那么 {啤酒, 尿布} 也一定经常被一起购买。
- 如果一个项集是非频繁的,则它的所有超集都是非频繁的。就像如果 {薯片} 很少被购买,那么 {薯片, 啤酒} 也一定很少被一起购买。
- 例子:
- 如果 {A, B} 是频繁项集,则 {A} 和 {B} 一定是频繁项集。
- 如果 {A} 是非频繁项集,则 {A, B}, {A, C}, {A, B, C} 等一定是非频繁项集。
- FP-Tree (Frequent Pattern Tree): 一种树形数据结构,用于存储频繁项集的信息,就像一棵“购物树” 🌳,树上的每个节点都代表一个商品,节点之间的路径代表商品之间的关联。
- 构建 FP-Tree:
- 扫描数据集,统计每个项的支持度,就像统计每个商品的销量。
- 根据支持度对项进行排序,就像将商品按照销量从高到低排序。
- 再次扫描数据集,将每个事务中的项按照排序后的顺序插入到 FP-Tree 中,就像将每个顾客的购物清单 🛒 按照商品销量排序后,添加到“购物树”中。
- 挖掘 FP-Tree: 从 FP-Tree 中递归地挖掘频繁项集,就像从“购物树”中找到那些经常出现的“树枝” 🌿。
算法示例1
原始数据中,一共有10条交易数据,分别统计每个商品的支持度计数,A出现了8次,记为A:8
,其他商品同理。
算法示例1-解释
这张图展示了FP-Tree算法的第一步:统计每个商品的支持度计数。
- 原始数据: 左侧表格是原始的交易数据,每一行代表一次交易,包含了顾客购买的商品。
- 支持度计数: 右侧表格是统计结果,显示了每个商品出现的次数(支持度计数)。
- 例子:
- A: 8 表示商品A在所有交易中出现了8次。
- B: 6 表示商品B在所有交易中出现了6次。
算法示例2
设置支持度阈值为20%,因为一共有10条交易数据,所以支持度计数至少为2,所以将支持度计数小于2的商品删除。
算法示例2-解释
这张图展示了FP-Tree算法的第二步:根据支持度阈值过滤商品。
- 支持度阈值: 这里设置为20%,意味着只有出现次数达到总交易数20%的商品才会被保留。
- 计算: 总共有10条交易数据,20%的支持度对应着至少出现2次。
- 过滤: 支持度计数小于2的商品(如O、I、J、K、L、M、N、H)被删除。
算法示例3
将每条交易数据中的商品按照支持度技术排序。 比如第一条交易数据ABCEFO,按照新的支持度表排序为ACEBF。其他交易数据同理。
算法示例3-解释
这张图展示了FP-Tree算法的第三步:对每条交易数据中的商品按照支持度计数排序。
- 排序依据: 根据上一步过滤后的支持度计数表,对商品进行降序排列。
- 例子:
- 原始交易数据:ABCEFO
- 排序后:ACEBF (A > C > E > B > F)
算法示例4
将排序好的交易数据添加到FP树中。 第一条数据ACEBF,则创建A:1, C:1, E:1, B:1, F:1的FP树分支。 第二条数据ACG,创建单独的A:1, C:1, G:1分支。 以此类推。
算法示例4-解释
这张图展示了FP-Tree算法的第四步:开始构建FP-Tree。
- 插入规则:
- 从根节点开始,按照排序后的交易数据顺序插入商品。
- 如果FP-Tree中已存在相同的商品节点,则增加该节点的计数。
- 如果不存在相同的商品节点,则创建新的节点。
- 例子:
- 第一条数据 ACEBF:创建 A:1 -> C:1 -> E:1 -> B:1 -> F:1 的分支。
- 第二条数据 ACG:创建 A:1 -> C:1 -> G:1 的分支。
算法示例5
当插入第四条交易数据ACEGD时,发现可以与第二条数据ACG共享A:1, C:1的前缀,所以形成A:2, C:2, G:1, E:1, D:1的分支。 以此类推。
算法示例5-解释
这张图展示了FP-Tree算法的第五步:继续构建FP-Tree,合并共享前缀。
- 合并规则:
- 如果新插入的交易数据与FP-Tree中已有的分支有相同的前缀,则共享这些前缀节点,并增加节点的计数。
- 例子:
- 第四条数据 ACEGD:与第二条数据 ACG 共享前缀 A 和 C,因此 A 和 C 的计数增加到 2,形成 A:2 -> C:2 -> G:1 -> E:1 -> D:1 的分支。
算法示例6
构建好的FP树。 挖掘FP-Tree:从FP-Tree中递归地挖掘频繁项集,比如以D为条件,找到D的条件模式基为<A:2, C:2>,这意味着在所有交易数据中,D和AC同时出现的次数为2次。其他商品同理。
算法示例6-解释
这张图展示了最终构建好的FP-Tree,以及如何从中挖掘频繁项集。
- FP-Tree:
- 根节点通常为空。
- 每个节点表示一个商品,节点上的数字表示该商品在路径中出现的次数。
- 具有相同前缀的路径会被合并。
- 挖掘频繁项集:
- 从FP-Tree的叶子节点开始,递归地向上查找其条件模式基(conditional pattern base)。
- 条件模式基是指以该节点为结尾的所有前缀路径。
- 例如,以 D 为条件,找到 D 的条件模式基为 <A:2, C:2>,这意味着在所有交易数据中,D 和 AC 同时出现的次数为 2 次。
- PrefixSpan (Prefix-Projected Pattern Growth): 一种挖掘频繁序列的算法。
- 序列 (Sequence): 一组有序的项集,例如 <(AB)(AC)D(CF)>,就像顾客按时间顺序购买的商品列表。
- 子序列 (Subsequence): 如果序列 A 的所有项集都能在序列 B 的项集中找到,则 A 是 B 的子序列,就像顾客购买了商品列表 A 中的所有商品,那么 A 就是 B 的子序列。
- 前缀 (Prefix) 和 后缀 (Suffix):
- 例如,序列 <a(abc)(ac)d(cf)> 的前缀和后缀例子:
<> |
<(abc)(ac)d(cf)> |
<> |
<(_bc)(ac)d(cf)> |
<> |
<(_c)(ac)d(cf)> |
PrefixSpan算法步骤
- 输入: 序列数据集S和支持度阈值α
- 输出: 所有满足支持度要求的频繁序列集
- 找出所有长度为1的前缀和对应的投影数据库
- 对长度为1的前缀进行计数,将支持度低于阈值α的前缀对应的项从数据集S删除,同时得到所有的频繁1项序列, i=1.
- 对于每个长度为i满足支持度要求的前缀进行递归挖掘:
- 找出前缀所对应的投影数据库。如果投影数据库为空,则递归返回。
- 统计对应投影数据库中各项的支持度计数。如果所有项的支持度计数都低于阈值, 则递归返回。
- 将满足支持度计数的各个单项和当前的前缀进行合并, 得到若干新的前缀
- 令i=i+1, 前缀为合并单项后的各个前缀, 分别递归执行第3步。