一、关联规则算法概述
关联规则挖掘是数据挖掘中的一个重要任务,用于发现数据集中不同项之间的关联关系。
二、Apriori算法
-
原理
- 频繁项集生成:Apriori算法基于一个先验原理,即如果一个项集是频繁的,那么它的所有子集也是频繁的;反之,如果一个项集是非频繁的,那么它的所有超集也是非频繁的。首先,扫描数据集,统计每个单项(1 - 项集)的出现次数,找出满足最小支持度阈值的频繁1 - 项集。然后,通过频繁 k − 1 k - 1 k−1 - 项集来生成候选 k k k - 项集,再扫描数据集计算候选 k k k - 项集的支持度,筛选出频繁 k k k - 项集。这个过程不断迭代,直到不能生成新的频繁项集为止。
- 关联规则生成:对于每个频繁项集
L
L
L,生成所有可能的非空子集。对于每个非空子集
A
A
A,计算关联规则
A
⇒
B
A\Rightarrow B
A⇒B(其中
B
=
L
−
A
B = L - A
B=L−A)的置信度,置信度计算公式为:
C o n f i d e n c e ( A ⇒ B ) = S u p p o r t ( A ∪ B ) S u p p o r t ( A ) Confidence(A\Rightarrow B)=\frac{Support(A\cup B)}{Support(A)} Confidence(A⇒B)=Support(A)Support(A∪B)
只保留满足最小置信度阈值的关联规则。
-
应用场景
- 超市购物篮分析。例如,分析顾客购买商品的行为,发现“购买牛奶和面包的顾客也经常购买鸡蛋”这样的关联规则,用于商品陈列优化和促销策略制定。
-
优点
- 简单易懂,是关联规则挖掘的经典算法。原理和实现相对直观,容易理解和应用。
- 能够有效地减少候选项集的数量。通过先验原理,避免了对大量不可能是频繁项集的候选项集进行计算,提高了效率。
-
缺点
- 在生成频繁项集时需要多次扫描数据集。当数据集很大时,频繁的I/O操作会导致性能下降。
- 可能会生成大量的候选项集,尤其是当最小支持度阈值设置较低时,计算和存储这些候选项集会消耗大量的资源。
三、FP - Growth算法
-
原理
- 构建FP - Tree:FP - Growth(频繁模式增长)算法首先构建一棵FP - Tree(频繁模式树)。扫描数据集一次,统计每个项的出现频率,按照频率降序排列所有项。然后再次扫描数据集,将每个事务中的项按照排好的顺序插入FP - Tree中。在插入过程中,如果树中已经存在当前项的路径,则更新路径上节点的计数;否则,创建新的分支。
- 挖掘频繁项集:从FP - Tree的头表(存储每个项及其出现次数和指向树中第一个相同项的指针)开始,通过递归的方式挖掘频繁项集。对于每个项,找到它在FP - Tree中的所有路径,根据路径构建条件模式基,然后从条件模式基构建条件FP - Tree,在条件FP - Tree上继续挖掘频繁项集。这个过程类似于FP - Tree的构建和挖掘,直到不能挖掘出新的频繁项集为止。
-
应用场景
- 同样适用于购物篮分析,能够更高效地处理大规模数据集,挖掘商品之间的关联关系。例如在大型连锁超市的销售数据挖掘中,发现不同商品类别之间的关联。
-
优点
- 只需要扫描数据集两次,相比Apriori算法大大减少了I/O开销。一次用于构建FP - Tree,另一次用于挖掘频繁项集(在挖掘过程中通过条件FP - Tree避免了对原始数据集的多次扫描)。
- 对于挖掘长频繁模式和密集数据集更有效。它能够利用FP - Tree的结构,快速地找到频繁项集,不会像Apriori算法那样生成大量的候选项集。
-
缺点
- 构建FP - Tree需要占用大量的内存空间,尤其是当数据集很大或者数据项很多时,内存消耗可能会成为瓶颈。
- 算法实现相对复杂,理解和实现FP - Tree的构建和挖掘过程需要一定的技术难度。
四、Eclat算法
-
原理
- Eclat算法基于集合的交集运算来挖掘频繁项集。它使用垂直数据表示,即将每个项的事务标识符(TID)列表存储起来。对于两个项集 A A A和 B B B,它们的交集的事务标识符列表就是同时包含 A A A和 B B B的事务集合。
- 频繁项集的支持度计算方式为:
S u p p o r t ( A ) = ∣ T I D ( A ) ∣ ∣ D ∣ Support(A)=\frac{|TID(A)|}{|D|} Support(A)=∣D∣∣TID(A)∣
其中 T I D ( A ) TID(A) TID(A)是项集 A A A的事务标识符列表, ∣ D ∣ |D| ∣D∣是数据集 D D D的事务总数。通过递归地计算项集的交集来生成频繁项集。从单个项开始,计算它们之间的交集和支持度,找到频繁1 - 项集。然后通过频繁 k − 1 k - 1 k−1 - 项集之间的交集来生成候选 k k k - 项集,计算支持度,筛选出频繁 k k k - 项集,直到不能生成新的频繁项集为止。
-
应用场景
- 在市场调查数据挖掘中,用于分析消费者对不同产品属性的组合偏好。例如,分析消费者对手机品牌、颜色、存储容量等属性组合的偏好,找出频繁出现的属性组合关联。
-
优点
- 采用垂直数据表示和集合交集运算,在某些情况下可以更高效地计算频繁项集。特别是当数据集的事务长度较短或者支持度阈值较高时,能够快速地计算出频繁项集。
- 可以方便地并行化计算。由于基于集合的交集运算,不同的项集之间的计算相对独立,可以利用并行计算资源来加速挖掘过程。
-
缺点
- 当数据集的事务长度较长或者支持度阈值较低时,计算项集的交集会导致大量的中间结果,需要大量的存储空间和计算时间。
- 对于稀疏数据集,性能可能会受到影响,因为需要处理大量的事务标识符列表和交集运算。
五、举例说明
假设我们有一个小型超市的购物篮数据集如下:
购物篮编号 | 购买商品 |
---|---|
1 | 牛奶、面包、鸡蛋 |
2 | 牛奶、面包 |
3 | 面包、鸡蛋、果汁 |
4 | 牛奶、鸡蛋 |
5 | 牛奶、面包、果汁 |
- Apriori算法示例
- 频繁项集生成:
- 首先计算1 - 项集的支持度,假设最小支持度阈值为 0.4 0.4 0.4。“牛奶”出现了4次,支持度为 4 5 = 0.8 \frac{4}{5}=0.8 54=0.8;“面包”出现了4次,支持度为 0.8 0.8 0.8;“鸡蛋”出现了3次,支持度为 0.6 0.6 0.6;“果汁”出现了2次,支持度为 0.4 0.4 0.4。所以频繁1 - 项集为{牛奶、面包、鸡蛋、果汁}。
- 然后生成候选2 - 项集:{牛奶、面包},{牛奶、鸡蛋},{牛奶、果汁},{面包、鸡蛋},{面包、果汁},{鸡蛋、果汁}。计算它们的支持度,例如{牛奶、面包}出现了3次,支持度为 3 5 = 0.6 \frac{3}{5}=0.6 53=0.6。经过筛选,频繁2 - 项集为{牛奶、面包},{牛奶、鸡蛋},{面包、鸡蛋},{牛奶、果汁}。
- 接着生成候选3 - 项集:{牛奶、面包、鸡蛋},{牛奶、面包、果汁},{牛奶、鸡蛋、果汁},{面包、鸡蛋、果汁}。计算支持度后,发现只有{牛奶、面包、鸡蛋}的支持度为 2 5 = 0.4 \frac{2}{5}=0.4 52=0.4满足阈值,是频繁3 - 项集。
- 关联规则生成:
- 对于频繁3 - 项集{牛奶、面包、鸡蛋},生成非空子集:{牛奶},{面包},{鸡蛋},{牛奶、面包},{牛奶、鸡蛋},{面包、鸡蛋}。计算关联规则的置信度,例如对于规则{牛奶、面包} ⇒ \Rightarrow ⇒{鸡蛋},置信度为 S u p p o r t ( { 牛奶、面包、鸡蛋 } ) S u p p o r t ( { 牛奶、面包 } ) = 0.4 0.6 = 2 3 \frac{Support(\{牛奶、面包、鸡蛋\})}{Support(\{牛奶、面包\})}=\frac{0.4}{0.6}=\frac{2}{3} Support({牛奶、面包})Support({牛奶、面包、鸡蛋})=0.60.4=32。根据最小置信度阈值(假设为 0.6 0.6 0.6),保留满足条件的关联规则。
- 频繁项集生成:
- FP - Growth算法示例
- 构建FP - Tree:
- 首先统计每个项的出现次数,按照出现次数降序排列为:牛奶(4次)、面包(4次)、鸡蛋(3次)、果汁(2次)。
- 构建FP - Tree,对于购物篮1(牛奶、面包、鸡蛋),先插入牛奶,然后在牛奶节点下插入面包,在面包节点下插入鸡蛋。以此类推,构建完整的FP - Tree。
- 挖掘频繁项集:
- 从FP - Tree的头表开始,对于“果汁”,找到它在树中的路径,构建条件模式基,然后从条件模式基构建条件FP - Tree,挖掘包含“果汁”的频繁项集。同样地,对其他项进行挖掘,最终得到所有的频繁项集。
- 构建FP - Tree:
- Eclat算法示例
- 垂直数据表示:
- 牛奶的TID列表为{1,2,4,5},面包的TID列表为{1,2,3,5},鸡蛋的TID列表为{1,3,4},果汁的TID列表为{3,5}。
- 频繁项集生成:
- 计算1 - 项集的支持度,方法同Apriori算法。频繁1 - 项集为{牛奶、面包、鸡蛋、果汁}。
- 计算2 - 项集的交集和支持度,例如牛奶和面包的交集TID列表为{1,2,5},支持度为 3 5 = 0.6 \frac{3}{5}=0.6 53=0.6。经过筛选得到频繁2 - 项集,然后继续生成3 - 项集并计算支持度,以此类推,挖掘出所有频繁项集。
- 垂直数据表示: