【数据挖掘实战】从购物篮到推荐系统:Apriori与FP-Growth算法Python全解析
1. 从啤酒与尿布说起频繁模式挖掘的商业价值1990年代沃尔玛的工程师在分析销售数据时发现一个有趣现象啤酒和尿布经常出现在同一张购物小票上。经过调查发现年轻父亲们常在购买婴儿用品时顺手带走几罐啤酒。这个发现让沃尔玛调整货架布局将啤酒和尿布陈列在相邻区域销售额因此显著提升。这个经典案例揭示了购物篮分析Market Basket Analysis的魔力——通过挖掘商品之间的关联关系可以优化销售策略。现代推荐系统、广告投放、库存管理等场景都依赖这项技术。比如电商平台猜你喜欢功能外卖App的套餐搭配建议超市的促销商品组合设计频繁模式指在数据集中反复出现的组合可以是项集{牛奶,面包}同时出现子序列用户先浏览手机再查看保护壳子结构社交网络中的常见互动模式2. 核心概念与评估指标2.1 关键术语解析事务(Transaction)一组物品的集合如一次购物记录项集(Itemset)若干物品的集合如{牛奶,面包}支持度(Support)项集出现的频率计算式为support(X) count(X) / total_transactions置信度(Confidence)规则X→Y的可信程度confidence(X→Y) support(X∪Y) / support(X)2.2 算法目标找出所有满足最小支持度的频繁项集从频繁项集中提取置信度高于阈值的强关联规则2.3 示例计算假设有以下5条交易记录1: 牛奶,面包 2: 牛奶,尿布,啤酒 3: 牛奶,尿布,面包 4: 尿布,啤酒 5: 面包,鸡蛋计算{牛奶,尿布}的支持度出现次数2次(交易2和3)总交易数5支持度 2/5 40%计算规则牛奶→尿布的置信度support(牛奶,尿布) 2/5support(牛奶) 3/5置信度 (2/5)/(3/5) ≈ 66.7%3. Apriori算法详解3.1 算法原理Apriori基于一个关键性质如果一个项集是频繁的那么它的所有子集也是频繁的。反之若某子集不频繁则包含它的超集也不频繁。算法采用逐层搜索的迭代方法扫描数据库找出频繁1项集L₁用L₁生成候选2项集C₂筛选得到L₂用L₂生成C₃依此类推直到无法生成更大项集3.2 Python实现3.2.1 使用现成库from efficient_apriori import apriori transactions [(牛奶,面包), (牛奶,尿布,啤酒), (牛奶,尿布,面包), (尿布,啤酒), (面包,鸡蛋)] itemsets, rules apriori(transactions, min_support0.4, min_confidence0.6) print(rules) # 输出关联规则3.2.2 从零实现def create_C1(data): 生成候选1项集 C1 [] for transaction in data: for item in transaction: if [item] not in C1: C1.append([item]) return list(map(frozenset, C1)) def scan_D(D, Ck, min_support): 筛选满足支持度的项集 ss_cnt {} for tid in D: for can in Ck: if can.issubset(tid): ss_cnt[can] ss_cnt.get(can,0) 1 num_items float(len(D)) ret_list [] support_data {} for key in ss_cnt: support ss_cnt[key]/num_items if support min_support: ret_list.insert(0,key) support_data[key] support return ret_list, support_data3.3 优缺点分析优势原理简单直观适合小规模数据集缺陷多次扫描数据库I/O开销大候选项集数量可能爆炸式增长对长模式效率低下4. FP-Growth算法进阶4.1 算法思想FP-Growth通过构建FP树压缩数据只需扫描数据库两次第一次扫描统计项频次过滤非频繁项第二次扫描构建FP树从FP树挖掘频繁模式4.2 FP树结构示例对于之前的交易数据按频次降序排列后尿布:4, 牛奶:3, 面包:3, 啤酒:2, 鸡蛋:1构建的FP树如下数字表示出现次数Null ├─ 尿布:4 │ ├─ 牛奶:2 │ │ ├─ 面包:1 │ │ └─ 啤酒:1 │ └─ 啤酒:1 └─ 牛奶:1 └─ 面包:14.3 Python实现class TreeNode: FP树节点类 def __init__(self, name, count, parent): self.name name self.count count self.parent parent self.children {} self.link None # 相似项链接 def create_tree(dataset, min_sup1): 构建FP树 header_table {} # 第一次扫描统计频次 for trans in dataset: for item in trans: header_table[item] header_table.get(item,0) dataset[trans] # 移除不满足最小支持度的项 for k in list(header_table.keys()): if header_table[k] min_sup: del header_table[k] freq_items set(header_table.keys()) if not freq_items: return None, None # 初始化头指针表 for k in header_table: header_table[k] [header_table[k], None] # 构建树 root TreeNode(Null, 1, None) for items, count in dataset.items(): localD {} for item in items: if item in freq_items: localD[item] header_table[item][0] if localD: ordered_items [v[0] for v in sorted(localD.items(), keylambda x: x[1], reverseTrue)] update_tree(ordered_items, root, header_table, count) return root, header_table4.4 性能对比指标AprioriFP-Growth扫描次数多次2次速度慢快5-10倍内存占用较低较高适合场景小数据集大数据集5. 实战构建推荐系统5.1 数据准备使用MovieLens电影评分数据集import pandas as pd ratings pd.read_csv(ratings.csv) movies pd.read_csv(movies.csv) # 将评分转换为二元数据评分3视为喜欢 ratings[liked] ratings[rating] 3 user_movies ratings[ratings[liked]].groupby(userId)[movieId].apply(list)5.2 关联规则挖掘from mlxtend.preprocessing import TransactionEncoder from mlxtend.frequent_patterns import apriori, association_rules # 数据编码 te TransactionEncoder() te_ary te.fit(user_movies).transform(user_movies) df pd.DataFrame(te_ary, columnste.columns_) # 挖掘频繁项集 frequent_itemsets apriori(df, min_support0.1, use_colnamesTrue) # 提取关联规则 rules association_rules(frequent_itemsets, metriclift, min_threshold1.2) rules rules.sort_values([lift, confidence], ascending[False, False])5.3 推荐实现def recommend(movie_id, rules, top_n5): 根据关联规则推荐电影 related rules[rules[antecedents].apply(lambda x: movie_id in x)] recommendations [] for _, row in related.iterrows(): for movie in row[consequents]: if movie not in recommendations: recommendations.append(movie) if len(recommendations) top_n: return recommendations return recommendations6. 算法选择与优化技巧6.1 选择依据数据规模小数据用Apriori大数据用FP-Growth模式长度长模式优先FP-Growth实时性要求FP-Growth更适合实时系统6.2 性能优化数据预处理离散化连续变量合并稀疏类别移除高频常见项如购物袋参数调优# 动态调整支持度阈值 def adaptive_support(current_iter): return max(0.1, 0.5 - 0.05*current_iter)并行计算from pyspark.mllib.fpm import FPGrowth data sc.textFile(data.txt).map(lambda line: line.strip().split(,)) model FPGrowth.train(data, minSupport0.2, numPartitions10)7. 扩展应用场景7.1 异常检测频繁模式可识别正常行为模式偏离这些模式的即为异常信用卡欺诈检测网络入侵识别工业设备故障预警7.2 序列模式挖掘分析时间序列中的频繁模式from prefixspan import PrefixSpan ps PrefixSpan([ [C,A,B], [A,B,D], [B,A,C] ]) ps.minlen 2 print(ps.frequent(2)) # 最小支持度为27.3 图模式挖掘在复杂网络中寻找频繁子图社交网络中的常见互动模式分子结构中的功能基团识别交通网络中的热点路径实际项目中我曾在用户行为分析中使用FP-Growth算法从千万级事件日志中挖掘出高频操作序列帮助产品团队优化了工作流设计使关键路径的完成率提升了18%。需要注意的是算法结果需要结合业务知识解读——有时高置信度规则可能是数据偏差所致而非真实关联。

相关新闻

让角色“活“起来的大脑:深入理解 Animator 状态机

让角色“活“起来的大脑:深入理解 Animator 状态机

引子:一具"僵硬"的木偶 想象一下,你刚刚做好了一个游戏角色。 他有精致的模型(Mesh)、逼真的皮肤贴图(Texture)、在灯光下泛着恰到好处的光泽。从外表看,他堪称完美——一个英姿飒爽的…

2026/7/15 21:51:34 阅读更多 →
嵌入式触觉反馈设计:DRV2604 I2C驱动、自动校准与波形编程实战

嵌入式触觉反馈设计:DRV2604 I2C驱动、自动校准与波形编程实战

1. 项目概述与核心价值在当今的消费电子和工业设备中,触觉反馈(Haptic Feedback)早已超越了简单的“嗡嗡”振动,演变为一种精细、可编程的交互语言。无论是智能手机上模拟实体按键的清脆点击,还是游戏手柄中传递的爆炸…

2026/7/15 21:51:34 阅读更多 →
前端资源完整性校验:Subresource Integrity 防篡改实战

前端资源完整性校验:Subresource Integrity 防篡改实战

前端资源完整性校验:Subresource Integrity 防篡改实战 一、CDN 上的 JS 文件被中间人篡改,用户浑然不知执行了恶意代码 CDN 劫持不是科幻场景。中间网络设备(路由器、ISP 缓存)在特定条件下可能篡改或替换静态资源。如果在页面中…

2026/7/15 21:51:34 阅读更多 →

最新新闻

实时表单校验不生效?Cursor AI 验证链路深度拆解,5类隐蔽Bug导致提交劫持(含VS Code插件级调试方案)

实时表单校验不生效?Cursor AI 验证链路深度拆解,5类隐蔽Bug导致提交劫持(含VS Code插件级调试方案)

更多请点击: https://kaifayun.com 第一章:实时表单校验不生效?Cursor AI 验证链路深度拆解,5类隐蔽Bug导致提交劫持(含VS Code插件级调试方案) 当 Cursor AI 为前端表单注入实时校验逻辑后,开…

2026/7/15 22:52:05 阅读更多 →
容器化部署下Java外卖API服务的JVM内存调优:G1垃圾回收器参数实战

容器化部署下Java外卖API服务的JVM内存调优:G1垃圾回收器参数实战

容器化部署下Java外卖API服务的JVM内存调优:G1垃圾回收器参数实战 在容器化(Docker/K8s)成为主流部署方式的今天,Java后端服务,特别是像外卖API这种高并发、低延迟要求的业务,面临着新的JVM调优挑战。传统的…

2026/7/15 22:52:05 阅读更多 →
知识图谱驱动的知识点关联:从孤立的题目到网络化的学习路径

知识图谱驱动的知识点关联:从孤立的题目到网络化的学习路径

知识图谱驱动的知识点关联:从孤立的题目到网络化的学习路径 一、一道题就是一棵知识树上的一个节点 刷了 200 道 LeetCode 后,我发现一个规律:真正决定解题能力的不是"刷了多少题",而是在大脑中建立了怎样的知识关联。&…

2026/7/15 22:50:05 阅读更多 →
故障自愈与自动恢复机制:从手动重启到无人值守

故障自愈与自动恢复机制:从手动重启到无人值守

故障自愈与自动恢复机制:从手动重启到无人值守 一、凌晨3点的PagerDuty告警 "Judge Worker 集群中 3 个 Pod 挂了,评测队列积压 1200。" 这是实习第三个月遇上的真实场景。从接到告警到手动重启 Pod,花了 18 分钟——其中有 15 分钟…

2026/7/15 22:50:05 阅读更多 →
MATLAB版Shan-Chen多组分LBM模拟包:气液相分离动态可视化实现

MATLAB版Shan-Chen多组分LBM模拟包:气液相分离动态可视化实现

本文还有配套的精品资源,点击获取 简介:一套开箱即用的MATLAB仿真资源,基于Shan-Chen伪势法实现格子玻尔兹曼多组分模型,专注模拟气液两相自发分离过程。主程序shanchen.m完整封装了格子演化、非理想相互作用力计算、密度与速度…

2026/7/15 22:48:04 阅读更多 →
Laravel开发的招聘平台源码,含求职投递、企业发布职位和多角色后台管理

Laravel开发的招聘平台源码,含求职投递、企业发布职位和多角色后台管理

本文还有配套的精品资源,点击获取 简介:一套基于Laravel框架搭建的完整招聘网站源码,开箱即用。求职者能上传简历、按关键词搜索岗位、查看投递记录;企业用户可发布/编辑/下架职位、浏览并筛选收到的简历;管理员统一…

2026/7/15 22:48:04 阅读更多 →

日新闻

YOLO11 改进 - 特征融合 | STFFM空间时间特征融合模块,强化时空互补、抑制噪声,助力小目标检测高效涨点

YOLO11 改进 - 特征融合 | STFFM空间时间特征融合模块,强化时空互补、抑制噪声,助力小目标检测高效涨点

前言 本文介绍了面向红外小目标检测的时空特征融合模块——STFFM,用于增强复杂背景下目标与噪声、杂波的区分能力。该方法通过拼接空间特征与时间/运动特征,并结合通道注意力、空间注意力和残差增强机制,实现对关键语义通道与疑似目标区域的…

2026/7/15 0:01:00 阅读更多 →
YOLO26 改进 - 特征融合 | STFFM空间时间特征融合模块,强化时空互补、抑制噪声,助力小目标检测高效涨点

YOLO26 改进 - 特征融合 | STFFM空间时间特征融合模块,强化时空互补、抑制噪声,助力小目标检测高效涨点

前言 本文介绍了面向复杂背景小目标检测的时空特征融合模块——STFFM。该模块通过空间分支与时间/运动分支的特征拼接,引入通道注意力和空间注意力对融合特征进行自适应筛选,并结合残差增强与通道压缩,突出目标区域、抑制背景噪声。我们将 S…

2026/7/15 0:01:00 阅读更多 →
行星减速机为什么能提高扭矩?从功率守恒到输出扭矩校核

行星减速机为什么能提高扭矩?从功率守恒到输出扭矩校核

一、为什么减速以后扭矩会增大 旋转机械的功率、转速和扭矩之间存在以下关系: T 9550 P n 其中: T为扭矩,单位Nm; P为功率,单位kW; n为转速,单位r/min。 在功率基本不变的情况下:…

2026/7/15 0:03:00 阅读更多 →

周新闻

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨 在一个阳光明媚的上午,互联网大厂的面试官坐在桌前,准备迎接他的面试候选人——燕双非,一个以搞笑和幽默著称的程序员。第一轮提问 面试官:燕双非,作…

2026/7/15 21:09:01 阅读更多 →
车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估在智能驾驶和车联网技术快速发展的今天,车载以太网作为新一代车载网络的核心传输技术,其物理层性能直接决定了数据传输的可靠性和稳定性。1000BASE-T1作为当前主流的…

2026/7/15 19:42:20 阅读更多 →
VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战指南嵌入式开发领域正经历一场工具链的静默革命。当传统Keil用户首次打开VSCode的扩展市场搜索EIDE时,往往会惊讶于这个看似简单的插件竟能重构十余年的开发习惯。本文将揭示如何用五个精准步骤&#xff0…

2026/7/15 17:52:08 阅读更多 →

月新闻