【数据挖掘实战】从购物篮到推荐系统: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%。需要注意的是算法结果需要结合业务知识解读——有时高置信度规则可能是数据偏差所致而非真实关联。

相关新闻

遗传算法实战:N皇后问题的Python工程实现与调优

遗传算法实战:N皇后问题的Python工程实现与调优

1. 这不是教科书,而是一次真实的GA工程复盘:从Matlab到Python的N皇后实战手记你点开这篇文章,大概率不是为了背诵“遗传算法是模拟生物进化过程的优化方法”这种定义。你真正想搞懂的是:当一个真实问题——比如100个皇后怎么在100…

2026/7/15 21:50:20阅读更多 →
热成像技术应用指南:从原理到工业实践全解析

热成像技术应用指南:从原理到工业实践全解析

1. 先搞清楚热成像到底解决哪些实际问题 热成像好不好用,关键看你用它解决什么问题。它不是万能工具,但在特定场景下,能直接看到肉眼看不见的温度分布,这个能力是其他设备很难替代的。 热成像最核心的价值是 非接触测温 和 可…

2026/7/15 21:50:20阅读更多 →
背包问题:购物单问题(牛客HJ6)中等

背包问题:购物单问题(牛客HJ6)中等

一、问题描述二、解题思路(好难!!!!--看代码注释)背包问题1.第一步:先把所有物品全部缓存,物品编号1~m2.第二步:只遍历主件,创建分组,记录belong映射(记录第几…

2026/7/15 21:50:20阅读更多 →
Excel无分支逻辑:用数学运算替代IF提升性能与可维护性

Excel无分支逻辑:用数学运算替代IF提升性能与可维护性

我注意到输入内容存在严重错配:项目标题为“An Example of Branchless Logic Using Excel”,但正文、关键词和摘要描述全部指向一篇关于IRIS数据集与几何平均分类器的AI/机器学习文章,且明确标注来源为Towards AI期刊——这与Excel无任何技术…

2026/7/15 22:50:31阅读更多 →
Linux系统压测工具

Linux系统压测工具

Linux系统压测工具 掌握常用的测试命令和工具。 一、前言 部分场景下,定位和复现项目问题需要使用工具进行系统压测,模拟和还原故障现场。那么测试或者压测工具就派上用场了,下面我们分不同场景来模拟工具的使用 二、测试工具 2.1 网络限速工…

2026/7/15 22:50:31阅读更多 →
Spring 事务管理深度解析——传播行为、隔离级别与生产踩坑历次复盘

Spring 事务管理深度解析——传播行为、隔离级别与生产踩坑历次复盘

Spring 事务管理深度解析——传播行为、隔离级别与生产踩坑历次复盘 一、背景与问题 Spring 的声明式事务管理(Transactional)是 Java 开发者最熟悉的工具之一,也是最容易被误用的工具。在代码评审中,我见过太多"加了 Transa…

2026/7/15 22:50:31阅读更多 →
AI 推理服务的 GPU 资源调度——从静态分配到动态共享的架构演进实践

AI 推理服务的 GPU 资源调度——从静态分配到动态共享的架构演进实践

AI 推理服务的 GPU 资源调度——从静态分配到动态共享的架构演进实践 一、背景与问题 GPU 是 AI 推理服务中最昂贵的资源,也是调度最复杂的资源。不同于 CPU,GPU 的资源特性更"非标":一张 A100 80GB 显卡,可能承载 1 个…

2026/7/15 22:50:31阅读更多 →
大模型推理的请求调度算法——FCFS、连续批处理与优先级队列的多维对比

大模型推理的请求调度算法——FCFS、连续批处理与优先级队列的多维对比

大模型推理的请求调度算法——FCFS、连续批处理与优先级队列的多维对比 一、背景与问题 大模型推理服务的核心瓶颈不在单次推理的延迟,而在并发请求的调度效率。当推理网关同时接收到数十个请求时,如何组织这些请求的执行顺序,直接决定了 G…

2026/7/15 22:50:31阅读更多 →
纯MATLAB实现的BER测试双脚本(yf1.m/yf2.m,无需工具箱)

纯MATLAB实现的BER测试双脚本(yf1.m/yf2.m,无需工具箱)

本文还有配套的精品资源,点击获取 简介:两段开箱即用的MATLAB误码率测试代码:yf1.m专注BPSK/QPSK在AWGN信道下的基础BER仿真,支持灵活设置SNR范围、帧长,自动完成比特生成、调制、加噪、解调、判决与统计&#xff0…

2026/7/15 22:45:30阅读更多 →
VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异当你在VSCode中启动一个新的TypeScript项目时,第一个技术决策往往从安装方式开始。这个看似简单的选择——全局安装还是项目本地安装——实际上会深刻影响你的开发流程、团队协作和…

2026/7/15 6:42:19阅读更多 →
智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 智慧树刷课插件是一款专为智慧树在线教育平台设计的Chrome浏…

2026/7/15 6:12:45阅读更多 →
Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在GOG或Epic Games Store购买了心仪的游戏…

2026/7/15 10:54:00阅读更多 →
AI框架决定企业AI能走多远

AI框架决定企业AI能走多远

企业AI建设的第一性原理 企业搞AI,最关键的决定是什么?不是选哪家大模型,不是先做哪个场景,不是招多少AI人才——而是选哪个AI开发框架。 为什么?因为框架决定了企业AI能力的"天花板"。选对了框架&#xff0…

2026/7/15 0:01:30阅读更多 →
Java企业为什么需要AI框架

Java企业为什么需要AI框架

Java企业在AI时代的尴尬处境 Java是全球企业级应用开发的主流语言——全球超过一半的企业系统跑在Java上。但在AI浪潮面前,很多Java企业感到尴尬:大模型的接口是各种语言的,AI开发社区以其他语言为主流,似乎Java在AI时代"掉队…

2026/7/15 0:01:30阅读更多 →
CC3230x嵌入式开发实战:SD主机、定时器与低功耗模式深度解析

CC3230x嵌入式开发实战:SD主机、定时器与低功耗模式深度解析

1. 项目概述:为什么需要关注CC3230x的SD主机、定时器与低功耗?在物联网和嵌入式设备开发领域,我们常常面临一个核心矛盾:设备需要具备强大的连接能力、可靠的数据存储和实时控制功能,同时又必须严格控制功耗以延长电池…

2026/7/15 0:01:30阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/15 15:50:47阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/15 8:52:38阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/15 14:06:23阅读更多 →