大数据管理与应用系列丛书《数据挖掘》(吕欣等著)读书笔记-Apriori 算法

强烈推荐吕欣教授的《数据挖掘》一书,书中 Apriori 算法板块!它不只讲理论,完整梳理逐层搜索、剪枝优化全流程,清晰点明算法优缺点与适用场景,同步对比实操中的阈值调参思路。从原理到业务落地一气呵成,读完既能看懂关联规则底层逻辑,也能快速上手交易数据挖掘实战,是数据分析从业者夯实关联挖掘基础的绝佳读本。

**在线学习开源代码:**https://github.com/XL-lab-bigdata

1. Apriori 算法背景

Apriori 算法是一种经典的关联规则挖掘算法,首次提出于 1994 年,由 Rakesh Agrawal 和 Ramakrishnan Srikant 等人提出。该算法主要用于发现数据库中频繁项集,并基于此生成关联规则。它广泛应用于市场篮分析、推荐系统、网络安全等领域。

Apriori 算法的核心目标是从大量的事务数据中发现频繁出现的项集,并通过这些项集生成有价值的关联规则。例如,某些商品经常一起购买,Apriori 可以帮助发现这一规律。

2. Apriori 算法相关的核心概念

  • 项集 (Itemset):一个项集是数据库中一个事务包含的物品集合。例如,在超市交易中,{牛奶, 面包} 就是一个项集。

  • 频繁项集 (Frequent Itemset):一个项集如果在数据库中出现的频率(支持度)高于给定的最小支持度阈值,则该项集被称为频繁项集。支持度是指一个项集在所有事务中出现的比例。

  • 关联规则 (Association Rule) :关联规则是从频繁项集中挖掘出的规则,通常表示为 A -> B,其中 A 和 B 是项集。例如,{牛奶} -> {面包} 表示购买牛奶的人倾向于购买面包。

  • 支持度 (Support):项集的支持度表示项集在事务数据库中出现的频率。

  • 置信度 (Confidence):置信度是关联规则的准确性度量,表示在包含 A 的事务中,也包含 B 的事务的比例。

  • 提升度 (Lift) :提升度是衡量规则 A -> B 的相关性,表示在考虑了 A 的出现概率后,B 的出现概率是否较高。

3. Apriori 算法基本原理

Apriori 算法的基本原理基于以下两个概念:

  • 自下而上的搜索策略:算法首先找出包含一个元素的频繁项集,然后逐步扩展到包含更多元素的频繁项集。

  • 剪枝策略:如果某个项集不是频繁的,那么它的所有超集也不可能是频繁项集。因此,Apriori 算法通过剪枝来减少搜索空间,避免不必要的计算。

4. Apriori 算法基本步骤(举例说明)

假设有以下事务数据库,其中每个事务包含若干物品:

事务 ID 物品
T1 牛奶, 面包
T2 牛奶, 尿布
T3 面包, 尿布
T4 牛奶, 面包, 尿布
T5 面包, 尿布

步骤 1:生成候选项集

首先,生成所有的候选项集。例如,候选项集可以是大小为 1 的项集(单个物品),如:{牛奶}, {面包}, {尿布}。

步骤 2:计算支持度并筛选频繁项集

计算每个候选项集的支持度,若支持度大于等于最小支持度阈值,则保留该项集作为频繁项集。假设我们设定最小支持度为 60%(即 3/5)。

  • 支持度({牛奶}) = 4/5 = 80%

  • 支持度({面包}) = 4/5 = 80%

  • 支持度({尿布}) = 4/5 = 80%

这些项集都满足最小支持度,因此被选为频繁项集。

步骤 3:生成候选项集的超集

接下来,生成大小为 2 的候选项集(两个物品的组合),例如:{牛奶, 面包}, {牛奶, 尿布}, {面包, 尿布}。

步骤 4:重复步骤 2 和 3

计算这些候选项集的支持度,并筛选出频繁项集。这个过程将一直持续,直到没有新的频繁项集被发现。

最终频繁项集

  • {牛奶, 面包}:支持度 60%

  • {牛奶, 尿布}:支持度 60%

  • {面包, 尿布}:支持度 60%

步骤 5:生成关联规则

最后,从频繁项集中生成关联规则。以 {牛奶, 面包} 为例,可以生成如下规则:

  • {牛奶} -> {面包}

  • {面包} -> {牛奶}

5. Apriori 算法优缺点及适用场景

优点:

  • 直观易懂:Apriori 算法简单直观,易于理解。

  • 高效剪枝:通过剪枝策略减少了计算量。

  • 广泛应用:Apriori 算法在实际应用中具有较高的普适性,尤其在零售、推荐系统等领域。

缺点:

  • 计算成本高:当数据集非常大时,计算频繁项集的支持度和生成候选项集的数量会变得非常庞大。

  • 需要存储大量数据:需要存储整个数据库以便计算频繁项集的支持度。

  • 对于长项集支持度的计算较慢:随着项集的增大,候选项集的数目会呈指数增长,导致计算复杂度增加。

适用场景:

  • 适用于需要挖掘频繁项集和生成关联规则的场景,例如市场篮分析、推荐系统等。

6. Apriori 算法案例实操

6.1 课内案例:基于 Apriori 算法的超市购物篮分析

(1)案例背景与学习目的

为加深对 Apriori 算法的理解,本案例采用课程提供的超市购物篮数据,利用 Python 调用 mlxtend 库中的 Apriori 算法,对交易数据进行关联规则挖掘。

本案例的主要学习目标包括:

  • 理解 Apriori 算法在真实交易型数据上的完整执行流程;

  • 掌握频繁项集与强关联规则的生成方法;

  • 通过运行结果验证支持度、置信度和提升度等指标的含义。

(2)数据集说明与参数设置

案例数据来自 groceries.csv,该数据集为典型的事务型数据,其中每一行代表一笔交易,每一列对应一种商品,取值为 0/1(或 False/True),表示该商品是否出现在该交易中。

在算法实现中,主要参数设置如下:

  • 最小支持度(min_support):0.02表示某一商品组合至少出现在 2% 的交易中,才被视为频繁项集。

  • 最小置信度(min_threshold):0.35用于筛选具有较强预测能力的关联规则。

上述参数在保证规则数量适中的同时,能够较好地体现 Apriori 算法的筛选效果。

(3)Apriori 算法的核心代码实现

本案例使用 mlxtend.frequent_patterns 模块完成 Apriori 算法的实现,

其核心代码如下所示:

plain 复制代码
frequent_itemsets = apriori(
    dataSet,
    min_support=0.02,
    use_colnames=True
)

上述代码基于 Apriori 算法自动生成满足最小支持度阈值的频繁项集,其中 use_colnames=True 用于直接显示商品名称,提高结果的可读性。

在得到频繁项集后,进一步生成关联规则:

plain 复制代码
rules = association_rules(
    frequent_itemsets,
    metric="confidence",
    min_threshold=0.35
)

该步骤以置信度为评价指标,从频繁项集中筛选出强关联规则。

(4)运行结果展示与说明

程序运行后,首先输出所有满足支持度条件的频繁项集,随后展示符合置信度阈值的关联规则,包括:

  • 规则前件(antecedents)

  • 规则后件(consequents)

  • 支持度(support)

  • 置信度(confidence)

  • 提升度(lift)

典型结果形式如下:

前件 后件 支持度 置信度 提升度
{whole milk} {yogurt} 0.03 0.40 >1

从结果可以观察到:

  • 单商品项集的支持度通常高于多商品组合;

  • 部分规则具有较高置信度和提升度,说明商品之间存在较强的关联关系;

  • 提升度大于 1 的规则表明前件的出现显著提高了后件出现的概率。

(5)结果与 Apriori 算法原理的对应分析

从该案例的执行过程可以清晰地看到 Apriori 算法的基本思想:

  1. 首先通过多次扫描数据库,逐层生成频繁 1-项集、2-项集及更高阶项集;

  2. 利用"频繁项集的所有子集也必须是频繁的"这一反单调性性质,对候选项集进行有效剪枝;

  3. 在频繁项集基础上,进一步计算置信度与提升度,生成强关联规则。

该案例表明,Apriori 算法虽然在计算过程中需要多次扫描数据集,但通过支持度剪枝机制,能够有效控制搜索空间,在中小规模交易数据分析中仍具有较高的实用价值。

6.2 课外案例:基于 Apriori 算法的用户观影行为关联分析

(1)案例背景与现实意义

在推荐系统中,平台往往需要从大量用户行为数据中挖掘潜在偏好模式。以电影网站为例,用户在同一时间段内观看的多部电影,往往反映了其兴趣结构和内容偏好。本案例以用户观影记录为研究对象,将"用户一次观影行为"视为一笔事务,利用 Apriori 算法挖掘电影之间的关联规则,从而为"基于规则的推荐系统"提供支持。

(2)数据集构造与问题建模

设想一个简化的观影数据集,其中:

  • 每一行代表一名用户在一定周期内观看过的电影集合;

  • 每一列代表一部电影;

  • 数据采用 0/1 形式表示是否观看。

示例事务数据如下:

用户 Titanic Inception Avengers La La Land
U1 1 1 0 0
U2 1 0 1 0
U3 0 1 1 1
U4 1 1 1 0
U5 0 0 1 1

在该建模方式下:

  • 项(Item):一部电影

  • 事务(Transaction):一名用户的观影集合

关联规则含义

"观看了电影 A 的用户,往往也观看了电影 B"

(3)Apriori 算法的核心实现思路

在实现层面,该案例同样可采用 Apriori 算法进行频繁项集挖掘,并在此基础上生成关联规则。

核心步骤包括:

  1. 设定最小支持度阈值,筛选频繁电影组合;

  2. 利用频繁项集生成候选关联规则;

  3. 基于置信度与提升度筛选具有推荐价值的规则。

示例核心代码结构如下:

plain 复制代码
frequent_itemsets = apriori(
    movie_data,
    min_support=0.3,
    use_colnames=True
)

rules = association_rules(
    frequent_itemsets,
    metric="confidence",
    min_threshold=0.5
)

该实现逻辑与课内超市购物篮案例保持一致,体现了 Apriori 算法在不同应用场景中的通用性。

(4)运行结果展示与解释

假设挖掘得到如下典型关联规则:

前件 后件 支持度 置信度 提升度
{Titanic} {Inception} 0.30 0.60 >1
{Avengers} {La La Land} 0.40 0.67 >1

可以做出如下解释:

  • 规则 {Titanic} → {Inception} 表明偏好经典剧情片的用户,也较可能对高概念科幻片感兴趣;

  • 提升度大于 1,说明这种共现关系并非随机,而具有实际参考价值;

  • 该类规则可直接用于构建"如果你看过 X,也可以试试 Y"的推荐逻辑。

(5)与 Apriori 算法原理的对应分析

该案例完整体现了 Apriori 算法的核心思想:

  • 从单电影频繁项集出发,逐步扩展到多电影组合;

  • 利用支持度阈值剪枝,避免组合数量爆炸;

  • 在频繁项集基础上,通过置信度与提升度衡量规则的有效性。

与课内"商品共购分析"相比,该案例说明 Apriori 算法本质上并不依赖于"商品"这一具体语义,而适用于所有离散、共现型行为数据

(6)案例局限性与进一步思考

尽管 Apriori 算法能够发现清晰、可解释的关联规则,但在推荐系统场景中仍存在一定局限:

  • 无法刻画用户兴趣的时间变化;

  • 难以处理高维稀疏的行为数据;

  • 在用户和电影规模较大时,计算成本迅速上升。

因此,在实际系统中,Apriori 方法往往作为规则型推荐的补充手段,与协同过滤、矩阵分解等方法结合使用。

7. Apriori 算法的优化方向

尽管 Apriori 算法在关联规则挖掘中具有奠基性意义,但其在大规模数据集上面临候选项集数量爆炸多次扫描数据库 等效率瓶颈。因此,围绕"减少候选项集规模 "和"降低数据库扫描代价"这两个核心问题,目前研究者提出了多种优化方向。

7.1 减少候选项集生成规模

(1)基于哈希的候选项集剪枝(Hash-based Pruning)

在生成候选 ( k )-项集时,可以利用哈希表对候选项集进行预筛选。

具体思想是:在扫描数据库时,将事务中的项集映射到哈希桶中,若某个哈希桶的计数低于最小支持度阈值,则该桶中对应的所有候选项集都不可能成为频繁项集,可直接剪枝。

优点:

  • 在早期阶段(尤其是 2-项集)效果明显

  • 显著减少无效候选项集数量

局限:

  • 哈希冲突可能导致剪枝不完全

  • 随着项集长度增加,效果逐渐减弱

👉 本质理解

这是在 Apriori 原有"基于支持度的剪枝"之外,引入了结构性剪枝手段

(2)事务压缩与无关项剔除(Transaction Reduction)

在每一轮迭代后,可以删除那些不包含任何频繁 ( k )-项集的事务,因为它们不可能对更高阶频繁项集产生贡献。

例如:

  • 若某事务不包含任何频繁 2-项集

  • 则该事务在寻找频繁 3-项集时可以直接忽略

效果:

  • 随着 ( k ) 增大,数据库规模不断缩小

  • 降低后续扫描的计算成本

👉 关键思考

这是从"减少数据量"而非"减少模型复杂度"的角度进行优化。

7.2 减少数据库扫描次数

(3)基于分区的 Apriori(Partition-based Apriori)

分区思想的核心结论是:

如果一个项集在整个数据库中是频繁的,那么它必然在至少一个分区中是频繁的

具体步骤:

  1. 将数据库划分为若干不重叠的分区

  2. 在每个分区内独立挖掘局部频繁项集

  3. 汇总所有局部频繁项集,作为全局候选集

  4. 对全数据库进行一次扫描,验证真正的全局频繁项集

优势:

  • 数据库只需扫描 两次

  • 适合大规模磁盘数据

理论价值:

  • 利用"必要条件"降低计算复杂度

  • 在保证正确性的前提下减少 I/O 开销

(4)采样(Sampling)

采样方法通过从数据库中随机抽取一个子集,在样本上挖掘频繁项集,再对结果进行验证或修正。

优点:

  • 显著减少计算量

  • 适用于对精度要求不极端的场景

风险:

  • 可能遗漏真实的频繁项集

  • 需要额外机制纠正假阴性

👉 实务视角

在商业分析中,采样 + 验证往往比"完全精确"更有性价比。

7.3 算法层面的改进与替代

(5)动态项集计数(DIC, Dynamic Itemset Counting)

传统 Apriori 要等完整扫描一次数据库后,才能进入下一轮迭代。而 DIC 允许在一次扫描过程中:

  • 动态引入新的候选项集

  • 并对其支持度进行持续更新

改进点:

  • 打破了"轮次严格同步"的限制

  • 提高了数据库扫描的利用率

(6)向非 Apriori 框架的演进:FP-Growth

从根本上看,Apriori 的性能瓶颈源于显式生成候选项集

FP-Growth 算法通过构建 FP-Tree

  • 将数据库压缩为树结构

  • 避免候选项集的显式生成

  • 通过条件模式基递归挖掘频繁项集

👉 思想转变

从"枚举 + 验证"转向"结构压缩 + 模式生长"

这也体现了数据挖掘算法从理论可行性 走向工程可扩展性的演进路径。

7.4 并行化与分布式优化(工程层面)

在大数据环境下,Apriori 的优化往往不再局限于算法本身,而是结合计算框架:

  • MapReduce Apriori

  • Spark MLlib 关联规则

  • 基于内存计算的并行支持度统计

优势:

  • 横向扩展能力强

  • 适合 TB 级数据分析

代价:

  • 实现复杂度上升

  • 网络通信成本不可忽视

7.5 小结:优化方向的本质分类

从本质上看,Apriori 算法的优化可以归结为三类:

优化维度 代表方法
减少候选项集 哈希剪枝、事务压缩
减少扫描次数 分区、采样、DIC
改变挖掘范式 FP-Growth、并行化
  • 压缩候选项集:通过优化候选项集的生成方式,例如使用哈希表或树结构,减少生成候选项集的数量。

  • 改进剪枝策略:通过更精确的剪枝条件,减少无效项集的生成。

  • 并行化:利用多核处理器或分布式计算框架(如 Hadoop 或 Spark)来加速 Apriori 算法的执行。

8. 个人学习总结与关联思考

在学习 Apriori 算法的过程中,我对其自下而上的搜索和剪枝策略有了更深的理解。尽管该算法较为简单,但在实际应用中,它的性能和效率往往受到数据规模的限制。因此,在实际应用中,如何优化 Apriori 算法,使其能够更高效地处理大规模数据,是我接下来深入思考的方向。结合现有的分布式计算技术,Apriori 算法的性能有了显著提升,这也为大数据时代的关联规则挖掘提供了更多的可能性。

笔记来源:董同学

相关推荐
ACP广源盛139246256731 小时前
GSV2221@ACP# DP1.4 MST 多流显示转换芯片国产工业多屏
大数据·人工智能·分布式·嵌入式硬件·spark
xiaoxiaoxiaolll1 小时前
FDTD与Python联合仿真的超表面智能设计
人工智能·机器学习
霸道流氓气质1 小时前
Harness Engineering 从理论到实战:基于 Spring AI Alibaba 的完整实现指南
数据库·人工智能·spring·harness
hangyuekejiGEO1 小时前
临沂GEO技术服务方案对比分析
大数据·人工智能·python
happyprince1 小时前
08-PEFT源码阅读-使用指南与实战案例
人工智能·peft
IT_陈寒2 小时前
Vue的响应式更新把我坑惨了,原来是这个原因
前端·人工智能·后端
weixin_549808362 小时前
AI招聘的下半场:当“匹配”从技巧变成组织能力
人工智能
武子康2 小时前
调查研究-217 Fortress:当浏览器 Agent 开始被网站识别,开源 Chromium 反拦截引擎来了
人工智能·爬虫·agent
大龄牛码2 小时前
AI大模型在金融领域的垂直应用实践:从信息检索到自动化报告
人工智能·金融·自动化