当前位置: 首页 > news >正文

Apriori和FP-Growth算法Python实现对比包(含可运行代码+详细说明)

本文还有配套的精品资源,点击获取

简介:提供两个主流关联规则挖掘算法的轻量级Python实现:Apriori和FP-Growth。每个算法封装为独立脚本(Apriori.py、FP_growth.py),支持灵活设置最小支持度、最小置信度等关键参数,输入标准事务数据(如CSV格式的购物篮数据),输出频繁项集及关联规则结果。不依赖复杂框架,仅需NumPy和pandas,兼容Python 3.7及以上版本。配套项目说明.md文档涵盖算法逻辑要点、文件结构解析、输入数据格式要求、执行命令示例、输出结果解读及常见报错处理建议。所有代码注释清晰、模块划分明确,便于理解算法流程、调试验证效果或嵌入课程设计、毕设项目中作对比分析模块。支持快速运行观察两种算法在执行速度、内存占用、结果一致性等方面的差异,也可基于现有结构扩展计时统计、规则筛选、结果导出等功能。

1. 项目概述:为什么你需要亲手跑一遍Apriori和FP-Growth?

如果你正在学数据挖掘、机器学习导论,或者正为课程设计/毕业设计里“关联规则”这一章发愁——别急,这不是又要你从头推公式、手算候选项集、再画FP树的噩梦。这个包,是我自己在带三届本科生做《数据挖掘实践》课设时,反复打磨出来的“可执行教具”。它不包装成黑盒API,也不依赖mlxtend那种封装过深的库(虽然它们很好用),而是把Apriori怎么一层层生成候选项集、FP-Growth怎么建树又怎么递归挖掘,全摊开在两个干净的.py文件里。核心关键词就五个:Apriori、FP-Growth、关联规则挖掘、Python实现、算法对比——每一个词都对应着你在真实场景中必须直面的问题:为什么FP-Growth在超市数据上快3倍?为什么调低min_support后Apriori直接卡死而FP-Growth还能出结果?为什么两条规则置信度一样,提升度却差10倍?这些,光看PPT讲义是永远摸不到边的。

这个包不是给你一个“能跑就行”的玩具。它真正解决的是三个层次的痛点:第一层是入门验证——学生第一次写关联规则,需要看到自己改一个参数,输出就变;第二层是性能体感——不用查论文图表,你用同一份CSV数据(比如经典的Groceries.csv),分别跑两个脚本,终端里打印出的耗时、生成的频繁项集数量、规则条数,就是最真实的对比;第三层是教学可拆解性——每个.py文件只有200行左右,函数边界清晰(generate_candidates → prune_by_support → generate_rules),注释不是“此处计算支持度”,而是“注意:这里用pandas.Series.value_counts()替代双重for循环,实测提速40%”。我甚至把FP_growth.py里最关键的mine_fp_tree函数拆成了build_header_tablefind_prefix_pathcreate_conditional_fp_tree三个子函数,就是为了让你调试时能单步进去,看清条件模式基是怎么一步步缩成单节点的。它不追求工业级吞吐,但追求每一行代码都经得起课堂提问:“这一步删掉会怎样?”“如果我把这里的排序改成按字母序,结果还对吗?”——答案我都写在项目说明.md的“原理简述”和“常见问题提示”里了。适合谁?刚接触关联规则的大三学生、需要快速嵌入毕设对比模块的研一同学、或者像我这样总被学生问“老师,FP树到底长啥样”的一线讲师。它不教你数学证明,但它让你亲手把数学变成终端里跳动的数字。

2. 算法设计思路与选型逻辑:为什么只选这两个,且坚持手写?

2.1 为什么是Apriori和FP-Growth?而不是Eclat或PrefixSpan?

市面上讲关联规则的教程,动辄列七八个算法。但真正在实际教学和轻量级分析中扛大旗的,从来就俩:Apriori是理解门槛的标尺,FP-Growth是性能优化的分水岭。Eclat用垂直数据格式(事务ID列表)确实省内存,但它的“深度优先搜索+交集运算”对初学者来说,抽象程度不亚于理解递归本身;PrefixSpan专攻序列模式,和购物篮这种无序集合场景根本不匹配。而Apriori和FP-Growth,恰好构成一个完美的认知闭环:前者用“自底向上、逐层扩展”的朴素思想,把关联规则的逻辑骨架(支持度→频繁项集→规则生成)刻进你的DNA;后者用“压缩存储+条件模式基”的工程智慧,告诉你当数据量涨10倍时,怎么避免指数爆炸。我刻意没加任何“改进版”(比如Apriori的Hash树优化、FP-Growth的Node-link优化),因为那些会模糊核心思想——就像教人骑车,先让你感受平衡和蹬踏,而不是一上来就装碳纤维轮组和液压碟刹。

2.2 为什么坚持纯Python手写,而非调用mlxtend或sklearn?

这是我在前三届课设中踩过的最大坑。有学生直接pip install mlxtend,5行代码搞定,结果答辩时被问“你的frequent_itemsets里support列是怎么算出来的?”,当场卡壳。mlxtend的apriori()函数内部用了numba加速和多线程,源码层层嵌套,对新手就是黑洞。而这个包里的Apriori.py,核心循环就三步:
1.candidates = generate_next_level(frequent_k_minus_1)—— 用itertools.combinations生成候选项集;
2.support_count = count_support_in_dataset(candidates, transactions)—— 用pandas.DataFrame.isin()批量判断包含关系;
3.frequent_k = [c for c in candidates if support_count[c] >= min_support * len(transactions)]—— 直接阈值过滤。

没有魔法,全是你可以打断点、print中间变量的代码。FP_growth.py同理:build_fp_tree()里用字典模拟树节点,mine_fp_tree()里用递归+字典推导式处理条件模式基。所有复杂度都暴露在外——当你看到FP-Growth在构建条件FP树时,对每个频繁项都要扫描整个事务列表找前缀路径,你就立刻明白为什么它内存友好但CPU吃紧;当你看到Apriori在k=4时生成C5候选项集要遍历C4中所有两两组合,你就懂了“候选集爆炸”不是术语,是实实在在的内存告警。这种“可触摸的复杂度”,是任何黑盒库给不了的教学价值。

2.3 为什么只依赖NumPy和pandas?这背后是数据流设计的取舍

有人问:“为啥不用scikit-learn?它也有关联规则模块啊。”——答案很实在:scikit-learn压根没提供关联规则算法。而mlxtend虽然有,但它依赖networkx(画图)、matplotlib(可视化),还要求Python>=3.8。这个包锁定Python 3.7+,只靠NumPy(做向量化计数)和pandas(做事务数据加载与筛选),是因为我见过太多学生卡在环境配置上:conda install networkx失败、pip install matplotlib报错、甚至因为系统缺少libfreetype导致字体渲染异常……最后课设进度拖了一周。所以,所有数据操作都回归本质:
- 用pandas.read_csv()读购物篮数据,每行是一个事务(如”milk, bread, butter”),自动转成list of list;
- 用numpy.array()存支持度计数,避免Python原生list的O(n)查找;
- 规则生成后,用pandas.DataFrame()组织输出,字段明确为antecedent,consequent,support,confidence,lift

没有花哨的GUI,没有实时图表,只有终端里干净的表格和耗时统计。你要可视化?项目说明.md里写了三行代码示例:用seaborn画lift分布直方图,用plotly做规则网络图——但那是你扩展的事,基础包绝不越界增加依赖。这种克制,让代码真正服务于“理解算法”,而不是“折腾环境”。

3. 核心细节解析与实操要点:从数据准备到结果解读的完整链路

3.1 输入数据格式:为什么CSV必须是“事务列表”,而不是“宽表”?

这是学生最容易栽跟头的地方。很多人下意识把购物篮数据做成Excel宽表:第一列用户ID,后面几十列是商品名,值为0/1(买了没)。但Apriori和FP-Growth的输入,必须是事务列表(Transaction List)格式——即每行代表一次购买行为,列是商品名,但值不是0/1,而是商品本身。比如:

milk,bread,diapers beer,diapers milk,bread,beer,diapers bread,butter

为什么?因为算法的核心操作是“判断一个项集是否被某个事务包含”,这在列表格式下是O(k)时间(k是事务长度),用set(antecedent).issubset(set(transaction))就能搞定;而在宽表格式下,你得先找出所有非零列名,再转成集合,多一层转换不说,还容易因空值、数据类型(字符串‘1’ vs 整数1)出错。项目说明.md里专门强调:用pandas.read_csv(file, header=None, squeeze=True)读取后,再用.str.split(',').apply(lambda x: [item.strip() for item in x])清洗,strip()去空格这一步,我亲眼见过三次因“milk ”和“milk”被视为不同项导致支持度归零的案例。另外,数据里绝对不能有空行或纯空格行——FP_growth.py的build_fp_tree()函数遇到空事务会直接抛KeyError,而错误提示是“’NoneType’ object is not iterable”,非常误导。我的解决方案是在load_transactions()函数开头加了一行:transactions = [t for t in transactions if t and len(t) > 0],默默过滤掉所有无效行。这种细节,不跑一遍根本想不到。

3.2 参数设置的艺术:min_support和min_confidence不是越大越好

很多学生以为“min_support设成0.5,肯定比0.1更‘严格’”,结果跑出来频繁项集为空。这里藏着一个关键认知:min_support是全局比例,不是绝对数量。假设你的数据集有1000条事务,min_support=0.01意味着至少10条事务包含该项集。但如果数据极度稀疏(比如99%的事务只含1-2个商品),那min_support=0.01可能连所有单商品项集都筛不掉;反之,如果数据密集(平均事务长度15),min_support=0.01可能生成上万条频繁项集,Apriori直接内存溢出。我在项目说明.md的“参数建议”里给了经验值:
- 初学调试:min_support=0.02~0.05,min_confidence=0.5~0.7;
- 实际分析:先用pandas.Series.value_counts()统计单商品支持度分布,取P90分位数作为min_support起点;
- FP-Growth专属技巧:它的min_support可以设得更低(0.005),因为它不生成候选项集,但要注意——过低会导致条件FP树分支爆炸,递归深度超限。

置信度同理。confidence(A→B) = support(A∪B)/support(A),分子分母都是支持度。如果A本身支持度极低(比如0.001),即使A∪B支持度是0.0009,置信度也高达90%,但这毫无业务意义——买A的人太少,规则不可推广。所以项目说明.md里强制建议:只输出support(A) > min_support * 10的规则(即前件本身必须是“较频繁”的),这个过滤逻辑已写进generate_rules()函数的最后一步。你可以在Apriori.py第156行看到:if support_antecedent > min_support * len(transactions) * 10:——这个*10是经验值,来自我分析12个真实零售数据集的统计结果。

3.3 输出结果结构:如何读懂频繁项集和关联规则的深层含义?

两个脚本的输出都是pandas DataFrame,但字段设计暗藏玄机。以FP_growth.py为例,frequent_itemsets输出包含四列:items(frozenset类型,如frozenset({‘milk’, ‘bread’}))、support_count(绝对频次)、support(比例)、length(项集长度)。这里frozenset是关键——它保证项集无序且可哈希,方便后续规则生成时做集合运算。而rules输出的六列中,antecedentconsequent也是frozenset,但supportconfidencelift三列才是灵魂。lift(提升度)常被忽略,但它决定规则是否真的“相关”:lift=1表示A和B独立,lift>1表示正相关,lift<1表示负相关。比如milk → bread的lift=1.8,说明买牛奶的人买面包的概率,是随机人群买面包概率的1.8倍;而coffee → tea的lift=0.3,则暗示二者互斥。项目说明.md里有个真实案例:某便利店数据中cigarettes → lighter的lift=4.2,但cigarettes → milk的lift=0.1——这直接指导了货架摆放:打火机必须紧挨香烟,而牛奶要放在远离香烟区的位置。这种业务洞察,必须从原始输出里手动提取lift值,没法靠“一键分析”得到。

4. 实操过程与核心环节实现:手把手跑通两个算法

4.1 环境准备与代码结构速览

先确认你的Python版本:终端输入python --version,确保≥3.7。然后安装依赖(仅两行):

pip install numpy pandas # 如果你用conda,换成:conda install numpy pandas

不需要其他包,绝对干净。资源包解压后,目录结构极简:

├── Apriori.py # Apriori主脚本 ├── FP_growth.py # FP-Growth主脚本 ├── 项目说明.md # 所有原理、参数、问题都在这里 ├── groceries.csv # 示例数据(已预处理好的购物篮数据) └── test_data.txt # 极简测试数据(3行,用于快速验证逻辑)

两个.py文件结构完全一致,都遵循“配置区→加载区→计算区→输出区”四段式:
-配置区(第10-20行):定义min_support=0.02,min_confidence=0.5,data_file="groceries.csv"等;
-加载区(第25-40行):load_transactions()函数,处理CSV读取、清洗、转list of list;
-计算区(核心):Apriori.py的apriori_algorithm(),FP_growth.py的fp_growth_algorithm(),含所有算法逻辑;
-输出区(末尾):调用print_results(),格式化打印频繁项集和规则。

这种结构让你能快速定位:想改参数?去配置区;想换数据?改data_file路径;想看算法细节?直接跳到计算区函数。没有隐藏的import,没有动态加载,所有路径都硬编码在脚本里——方便你复制粘贴到自己的项目中。

4.2 Apriori.py核心实现:从候选项集生成到规则剪枝的全流程

Apriori.py的核心是apriori_algorithm()函数(第45行起)。我们拆解它最关键的三步:

第一步:生成并筛选频繁1-项集(第50-65行)

# 统计所有单商品出现次数 all_items = [item for transaction in transactions for item in transaction] item_counts = Counter(all_items) # 计算支持度并筛选 frequent_1_itemsets = { frozenset([item]): count / len(transactions) for item, count in item_counts.items() if count / len(transactions) >= min_support }

这里用Counter比循环计数快3倍,且frozenset([item])统一了数据类型,为后续union()操作铺路。注意:item_counts.items()返回的是(商品名,频次)元组,count / len(transactions)才是支持度比例——很多学生误用count >= min_support(把比例当绝对数),导致结果全空。

第二步:迭代生成k-项集(第70-105行)

k = 2 frequent_itemsets = frequent_1_itemsets.copy() while True: # 生成候选项集 Ck:对所有频繁(k-1)-项集两两合并 candidates = set() frequent_k_minus_1_list = list(frequent_k_minus_1.keys()) for i in range(len(frequent_k_minus_1_list)): for j in range(i+1, len(frequent_k_minus_1_list)): union_set = frequent_k_minus_1_list[i] | frequent_k_minus_1_list[j] if len(union_set) == k: # 确保合并后长度为k candidates.add(union_set) # 剪枝:去掉任何(k-1)-子集不频繁的候选项 candidates = { c for c in candidates if all(subset in frequent_k_minus_1 for subset in map(frozenset, combinations(c, k-1))) } # 计算支持度并筛选 support_count = {c: 0 for c in candidates} for transaction in transactions: transaction_set = set(transaction) for candidate in candidates: if candidate.issubset(transaction_set): support_count[candidate] += 1 frequent_k = { c: count / len(transactions) for c, count in support_count.items() if count / len(transactions) >= min_support } if not frequent_k: break frequent_itemsets.update(frequent_k) frequent_k_minus_1 = frequent_k k += 1

这段代码的精妙在于剪枝逻辑(all(subset in frequent_k_minus_1 ...)):它利用Apriori原理——“频繁项集的所有子集必频繁”,提前剔除那些包含非频繁子集的候选项,避免无效计数。比如k=3时,候选项{A,B,C}若子集{A,B}不在频繁2-项集中,就直接丢弃。实测在Groceries数据上,这一步能减少40%的计数操作。

第三步:生成关联规则(第110-145行)

rules = [] for itemset, support in frequent_itemsets.items(): if len(itemset) < 2: # 至少2个商品才能拆分规则 continue # 对项集的所有非空真子集,作为前件 items_list = list(itemset) for i in range(1, len(items_list)): for antecedent_items in combinations(items_list, i): antecedent = frozenset(antecedent_items) consequent = itemset - antecedent # 计算置信度:support(antecedent ∪ consequent) / support(antecedent) confidence = support / frequent_itemsets.get(antecedent, 0) if confidence >= min_confidence and frequent_itemsets.get(antecedent, 0) > min_support * len(transactions) * 10: lift = confidence / frequent_itemsets.get(consequent, 0) rules.append({ 'antecedent': antecedent, 'consequent': consequent, 'support': support, 'confidence': confidence, 'lift': lift })

这里的关键是frequent_itemsets.get(antecedent, 0)——因为前件antecedent一定是某个频繁项集(由剪枝保证),所以get()不会返回None,但加个默认值0是防御性编程。lift计算用confidence / support(consequent),而support(consequent)直接从frequent_itemsets字典里取,避免重复计算。整个流程下来,Apriori.py的输出就是两个DataFrame:frequent_itemsets_dfrules_df,字段清晰,可直接to_csv()导出。

4.3 FP_growth.py核心实现:FP树构建与条件模式基挖掘的深度解析

FP_growth.py的fp_growth_algorithm()(第55行起)是重头戏,我们聚焦三个核心函数:

build_fp_tree()(第60-115行):如何用字典模拟树结构?
FP树节点定义为字典:{'count': int, 'children': dict, 'parent': node_ref}。构建时,对每条事务按支持度降序排序(sorted_transaction = sorted(transaction, key=lambda x: item_counts.get(x, 0), reverse=True)),然后逐个插入。关键点在于:
- 插入前先检查children字典里是否有该商品节点,有则count++,无则新建;
- 每个节点还要维护一个header_table(全局头表),记录相同商品所有节点的链表(用next指针),这是后续挖条件模式基的基础。

mine_fp_tree()(第120-190行):递归挖掘的终止条件是什么?
这是最易出错的部分。函数签名是mine_fp_tree(tree, header_table, min_support, prefix_path, frequent_itemsets),其中prefix_path是当前递归的前缀(如[‘beer’]),frequent_itemsets是累积结果。递归终止条件有两个:
1.header_table为空(树已挖完);
2.header_table中所有项的支持度都<min_support(当前路径无频繁项)。

核心逻辑是:
- 取header_table中支持度最小的项(按升序排,先处理最难的);
- 遍历该项所有节点,用find_prefix_path()获取从根到该节点的路径(不含该项本身);
- 用这些路径构建conditional_fp_tree(条件FP树),其支持度阈值是该项的支持度;
- 对条件树递归调用mine_fp_tree(),并将prefix_path + [item]传入。

find_prefix_path()(第195-220行):为什么路径要“反向拼接”?
因为FP树的parent指针是从叶子指向根的。所以获取路径时,必须从当前节点开始,沿parent一路向上,把节点商品名收集到列表,最后reversed()反转,才得到从根到叶子的正确顺序。比如路径是root → milk → breadparent链是bread.parent=milk, milk.parent=root,收集顺序是[bread, milk],反转后[milk, bread]——这才是事务中商品的实际顺序(尽管关联规则不关心顺序,但条件模式基需要)。

跑通FP_growth.py后,你会发现它比Apriori快得多,尤其在min_support较低时。但注意:它的内存占用略高(因为要存整棵树和头表),而Apriori的内存是波动的(k增大时候选项集爆炸)。项目说明.md里有一张实测对比表(基于Groceries数据,min_support=0.01):

算法耗时(秒)内存峰值(MB)频繁项集数规则数
Apriori12.4851,2473,892
FP-Growth2.11121,2473,892

结果完全一致,证明实现正确;而耗时差异,就是算法本质的体现。

5. 常见问题与排查技巧实录:那些文档里不会写的坑

5.1 “ModuleNotFoundError: No module named ‘xxx’”——但你明明装了!

这是环境问题的典型症状。根本原因往往不是包没装,而是Python解释器路径混乱。比如你用pip install pandas,但VS Code默认运行的是conda环境里的Python,而conda里没装pandas。解决方案只有两个:
1. 在终端里确认当前Python路径:which python(Mac/Linux)或where python(Windows),然后用该路径下的pip安装:/usr/bin/python3 -m pip install pandas
2. 在VS Code里按Ctrl+Shift+P(Win)或Cmd+Shift+P(Mac),输入“Python: Select Interpreter”,手动选择你pip安装包的那个环境。

我见过最离谱的案例:学生用Anaconda Prompt装了包,却在Git Bash里运行脚本——两个终端用的完全是不同的Python环境。项目说明.md里写了“务必在同一个终端里完成安装和运行”,但很多人跳过这句。

5.2 “KeyError: ‘xxx’”——数据清洗不到位的铁证

这个错误90%出现在count_support_in_dataset()build_fp_tree()里。根源是:你的CSV数据里有商品名带空格、大小写混用、或特殊字符(如&,')。比如数据里有"Milk""milk",算法会当成两个不同项;"Chips & Dip"里的&符号,在str.split(',')时会被错误切分。解决方案在项目说明.md的“数据预处理建议”里:
- 用pandas.read_csv(..., converters={0: lambda x: x.strip().lower().replace('&', 'and').replace("'", '')})统一清洗;
- 或者更彻底:在load_transactions()函数里,加一行transaction = [item.strip().lower().replace(' ', '_') for item in transaction],把空格全换成下划线。

我自己在Groceries.csv里就做了这个处理,所以包里附带的数据能直接跑通。

5.3 “RecursionError: maximum recursion depth exceeded”——FP-Growth的递归陷阱

FP-Growth的mine_fp_tree()是递归函数,当数据极度不平衡(比如一个商品出现在99%的事务中),条件FP树会极深,导致递归超限。Python默认递归深度是1000,而FP树深度可能轻松破2000。解决方案很简单,在FP_growth.py开头加两行:

import sys sys.setrecursionlimit(5000) # 提高到5000,足够应付大多数数据

但要注意:这治标不治本。真正该做的是检查你的min_support是否设得太低。项目说明.md里建议:如果出现此错误,先把min_support提高到0.02再试;如果必须用低阈值,就用Apriori——它虽慢,但不会递归爆栈。

5.4 “规则太多,根本看不过来!”——结果筛选的实战技巧

两个脚本默认输出所有满足条件的规则,但真实场景中,你可能只关心lift>3的强相关规则,或support>0.1的高覆盖规则。项目说明.md的“结果扩展”章节提供了三行代码模板:

# 筛选高提升度规则 high_lift_rules = rules_df[rules_df['lift'] > 3].sort_values('lift', ascending=False) # 导出到Excel high_lift_rules.to_excel('high_lift_rules.xlsx', index=False) # 可视化lift分布 import seaborn as sns sns.histplot(rules_df['lift'], bins=50) plt.show()

这些不是包的一部分,但它是“可扩展性”的体现——你随时可以基于现有DataFrame做任意分析,而不用碰核心算法代码。

6. 实操心得与个人体会:从教学到落地的思考

我在带学生用这个包做课设时,发现一个有趣现象:前两届学生拿到包,第一反应是“赶紧跑起来”,结果花三天调参、改数据、截图结果,交报告时对“为什么FP-Growth更快”只能复述PPT里的“避免候选项集生成”;而第三届学生,我强制要求他们先读透Apriori.py的generate_next_level()和FP_growth.py的build_fp_tree(),再动手。结果,有学生在调试时发现:当事务中存在大量重复商品(比如[milk, milk, bread]),Apriori的issubset()判断会出错,因为set(['milk', 'milk', 'bread'])等于{'milk', 'bread'},丢失了重复信息——这引出了一个深刻讨论:关联规则默认假设事务是集合(无序、无重),但真实POS数据可能是多重集(multiset)。这个洞见,直接催生了他毕设的创新点:在Apriori基础上加入“支持度计数权重”,按商品出现次数加权。

所以,这个包的价值,从来不在“它能跑”,而在于“它让你敢改”。它的代码像一张透明的解剖图,肌肉(算法逻辑)、血管(数据流)、神经(参数传递)全都裸露在外。你不必担心改坏——因为所有函数都有清晰的输入输出契约,generate_rules()只接收frequent_itemsets字典和transactions列表,返回规则列表,中间任何改动,只要不破坏契约,就不会影响下游。

最后分享一个小技巧:如果你想快速对比两个算法在不同数据规模下的表现,不用手动改代码。在项目说明.md的“性能测试”章节,我写了自动化脚本框架:用pandas.concat()随机采样10%、30%、50%、100%的Groceries数据,分别保存为groceries_10p.csv等,然后用time.time()包裹两个算法的调用,生成耗时对比折线图。这个框架,已经帮三个学生拿到了课程设计最高分——因为他们不仅跑了算法,还量化了算法。

这个包没有炫酷的界面,没有云部署,甚至没有README.md(只有中文的项目说明.md,因为我知道国内学生更习惯中文文档)。它就静静躺在那里,等着你打开终端,敲下python Apriori.py,然后看着屏幕上滚动的数字,突然明白:原来“频繁项集”不是课本里的黑体字,而是你刚刚亲手从1000行数据里揪出来的1247个真实组合;原来“提升度”不是公式里的希腊字母,而是货架上牛奶和面包之间那条看不见却真实存在的销售纽带。这就是我想传递的——算法不是终点,而是你理解世界的新眼睛。

本文还有配套的精品资源,点击获取

简介:提供两个主流关联规则挖掘算法的轻量级Python实现:Apriori和FP-Growth。每个算法封装为独立脚本(Apriori.py、FP_growth.py),支持灵活设置最小支持度、最小置信度等关键参数,输入标准事务数据(如CSV格式的购物篮数据),输出频繁项集及关联规则结果。不依赖复杂框架,仅需NumPy和pandas,兼容Python 3.7及以上版本。配套项目说明.md文档涵盖算法逻辑要点、文件结构解析、输入数据格式要求、执行命令示例、输出结果解读及常见报错处理建议。所有代码注释清晰、模块划分明确,便于理解算法流程、调试验证效果或嵌入课程设计、毕设项目中作对比分析模块。支持快速运行观察两种算法在执行速度、内存占用、结果一致性等方面的差异,也可基于现有结构扩展计时统计、规则筛选、结果导出等功能。


本文还有配套的精品资源,点击获取

http://www.jsqmd.com/news/1149350/

相关文章:

  • 润乾报表+AI Copilot:语义驱动的国产BI智能生成实践
  • OpenClaw 2.6.6 Win10 原生部署实战:10分钟落地本地智能体运行时
  • 焦作气象数据EMD-LSTM联合预测工程:带完整注释的可运行Python项目
  • 放射科CT/MRI图像+诊断报告联合分析实战资源:带数据、代码与手把手教程
  • STM32F302VC与DTH-08模块的信号配置实战
  • Windows开发环境避坑指南:Node.js+Git+PowerShell分层部署
  • Unity C#编程:封装、访问修饰符与工程化实践指南
  • FontCenter:构建AutoCAD字体缺失问题的智能解决方案
  • Matlab2021a中基于DQ变换的三相异步电机矢量控制仿真工程(含实操录像与模型文件)
  • Qwen2.5-Coder:嵌入VS Code的本地化代码协作者
  • Mac运行Microsoft Project的终极解决方案:虚拟机配置与深度优化
  • 2026年自建Overleaf服务器:面向高校与科研机构的LaTeX基础设施部署指南
  • 高效智能文件去重:dupeguru完整使用指南
  • 现代C++学习:右值和移动究竟解决了什么问题?
  • Slides Agent 技术拆解:版式生成、内容记忆与视觉一致性的实现
  • openEuler 22.03 SP3 上 Oracle 12cR2 一键安装实战指南
  • STM32 PID温控项目:从零实现±0.5°C高精度温度控制
  • 3分钟拿回你的QQ聊天记录:全平台数据库解密终极指南
  • Apriori 算法 Python 实战:3步计算布尔数据集关联规则支持度与置信度
  • MATLAB一键运行IIR带阻滤波语音降噪:含测试音频与三组对比图
  • LUI报表工具:从GUI到语言交互的三大技术支柱
  • 3分钟掌握完整网页截图:告别拼接烦恼的Chrome扩展神器
  • 如何在Windows上实现完整的AirPlay 2投屏功能:免费开源解决方案终极指南
  • Matlab多变量时序预测工具:RF-Adaboost集成模型+可视化结果+可调参数源码
  • STM32F4 + FreeRTOS 下直接可用的 BQ27421-G1 电量监测工程包
  • MVTec AD 数据集实战:5种无监督缺陷检测方法对比,AUROC 最高 0.99
  • Cocos Creator游戏开发:HTTP与WebSocket网络通信实战与优化
  • WSL2下编译GROMACS实战:Ubuntu 22.04 + CMake + GPU加速全链路指南
  • 雀魂数据分析终极指南:如何用免费工具快速提升麻将水平
  • STM32L152ZD与TLA2518高精度ADC信号采集方案