Apriori 算法是关联规则挖掘领域的经典算法,尤其用于发现交易数据库。
一 核心思想
(1)Apriori 原则:
核心: 如果一个项集是频繁的,那么它的所有子集也一定是频繁的。
逆否命题: 如果一个项集的某个子集不是频繁的,那么这个项集本身也绝不可能是频繁的。
(2)名称由来: 此原则描述了算法使用的先验知识(Apriori Knowledge),即利用已知频繁项集的信息来产生候选集并高效地减少无效项的搜索空间。
(3)概念定义
项(Item): 数据集中的一个具体对象
项集(Itemset): 一个或多个项的集合
交易(Transaction): 一个具体的事件或记录,包含一组项。
数据库(Database): 包含所有交易的集合。
支持度(Support):项集 X 的支持度 support(X) = 包含 X 的交易数 / 总交易数。衡量 X 在数据集中出现频率的绝对指标。频繁项集: 满足 support(X) >= 最小支持度阈值(min_sup)
的项集 X。
置信度(Confidence):规则 X → Y
的置信度表示当 X 出现时 Y 也出现的可能性。confidence(X → Y) = support(X ∪ Y) / support(X)
。衡量规则可信度强度的指标(条件概率)。找到频繁项集后使用。
关联规则(Association Rule): 形如 X → Y
的蕴含式,其中 X
和 Y
是不相交的项集 (X ∩ Y = ∅)
。
二 算法目标
(1)找到所有的频繁项集: 找出支持度超过用户指定的最小支持度阈值(min_sup)
的所有项集。
(2)生成强关联规则: 从频繁项集中,找出置信度超过用户指定的最小置信度阈值(min_conf)
的规则 X → Y
(其中 X
和 Y
是频繁项集的子集)。
三 算法步骤
Apriori 算法寻找频繁项集的过程采用逐层搜索的迭代方法,由短到长地生成候选项集:
(1)设置参数
用户定义 最小支持度阈值 (min_sup)
(生成规则时再定义 最小置信度阈值 (min_conf)
)
(2)扫描数据库,找出所有频繁 1-项集 (L₁)
扫描整个数据库,计算每一个单个项(1-项集)出现的次数(支持计数)。
将支持度 >= min_sup
的单个项作为频繁 1-项集 L₁
。
目的: 为后续生成长频繁项集提供基础种子。
(3)迭代产生候选 k-项集 (k > 1) 并剪枝
循环条件: 直到不能再产生新的频繁 k-项集为止 (Lₖ = ∅)
。
连接(Join)产生候选 Cₖ: 使用前一层找到的频繁 (k-1)-项集 Lₖ₋₁
来生成候选 k-项集 Cₖ
。
原理:任何 k-项集的两个(k-1)-子集一定是频繁的(根据Apriori原则),因此由两个频繁 (k-1)-项集连接生成的集合,其(k-1)-子集有机会是频繁的。
剪枝(Prune)优化 Cₖ: 运用 Apriori 原则进行剪枝:
检查 Cₖ
中每一个候选 k-项集 c
的所有大小为 (k-1)
的子集。
如果存在任何一个 (k-1)
-子集 不是频繁的
(即不在 Lₖ₋₁
中),那么候选 c
绝对不可能是频繁项集。
将这个 c
从候选集 Cₖ
中删除。
比如:{1,2,3}和{4,5,6}两个3-项集是频繁的,那他们连结生成的集合{1,2,3,4,5,6}中随便选取3个作为3-项集是有机会是频繁的,当然会有不频繁的。所以生成以后再用剪枝,把含有不频繁的子集的4-项集剪掉。因为4-项集要是频繁那么它的子集3-项集都是频繁的。
(4)扫描数据库,计算候选 Cₖ 的支持度
再次扫描全部数据库。
对于每一个交易 t
,检查所有属于 Cₖ
的候选k-项集 c
:
如果 c
的所有项都包含在交易 t
中(即 c ⊆ t
),那么给 c
的支持计数加 1。
(5)确定频繁 k-项集 (Lₖ)
对于 Cₖ
中的每一项集 c
:计算其支持度 support(c) = (c的支持计数) / (总交易数)
。
如果 support(c) >= min_sup
,则将 c
加入 Lₖ
(频繁 k-项集)。
结束一次迭代(k=k+1),转回步骤3继续迭代。
四 挑战
Apriori 算法高效的核心在于 “连接-剪枝”策略极大减少了无效候选项数量,避免扫描无效项集,优化了效率。不过在实际应用中仍需注意以下挑战:
多轮扫描数据库: 每层都需扫描,数据库规模巨大时会非常耗时。
海量候选项集: 若 L₁ 元素过多或 min_sup 过低,候选项集数量会急剧增长,耗费大量内存和时间(k增大时尤甚)。
高 I/O 开销: 频繁扫描磁盘数据库是效率主要瓶颈。
五 优缺点总结
优点:
原理简洁明晰,易于理解和实现。
利用先验原理大幅减少候选项数,效率显著优化。
缺点:
多轮数据库扫描(每一k值都要扫描一次)
候选集爆炸问题: 高维项集候选量巨大(尤其是min_sup较低时)。
对长模式挖掘效率低: 大k值候选项集巨大。
I/O 密集型: 数据库扫描成为瓶颈。
参数设定敏感: min_sup
及 min_conf
需仔细调参,参数设定直接影响结果。
六 更高效的算法
为克服 Apriori 的缺陷(特别是磁盘I/O瓶颈和候选数量),后来研发出更优算法:
FP-Growth (频繁模式增长): 核心优势在于只需扫描两遍数据库,无需产生大量候选项集。使用高效的FP-Tree (频繁模式树) 数据结构存储压缩的频繁项信息。
Eclat 算法: 基于垂直数据格式(Transaction ID 列表)直接通过项集交集挖掘频繁项集,通常无需生成大量候选项集。
Apriori算法是关联分析里程碑算法,尽管其在面临大数据集时效率有限,但其设计思想仍具启发性。通过理解Apriori,开发者可以深刻掌握连接剪枝机制,并能迁移至更高阶算法中。实践中面对小规模或结构清晰的关联问题,Apriori仍然是一个可靠工具。