关联规则之 Apriori 算法实现

news2025/8/16 16:26:40

一、数据预览

Apriori 算法是电商数据挖掘中的经典算法,用于发现商品之间的关联规则,例如买了 A 和 B 的情况下是否还会买 C,通过计算商品组合之间的支持度置信度来实现。首先我们来看一张订单表,包含订单编号,和商品列表。如订单一表示同时购买了 A, B, E 三个商品。可用下方代码生成此表。

tradeIdgoodsLst
id001A,B,E
id002A,B,C,E
id003A,B,C
id004B,D
id005B,C
id006A,B,D
id007B,C,D
id008A,C
id009B,C
id0010A,C
data_goods = pd.DataFrame({'tradeId': [f'id00{i}' for i in range(1,11)],
	'goodsLst': ['A,B,E', 'A,B,C,E', 'A,B,C', 'B,D', 'B,C', 'A,B,D', 'B,C,D', 'A,C', 'B,C', 'A,C']})

以前述的 A+B=>C 为例,这条规则的支持度 = 同时包含 A, B, C 的订单数 / 订单总数,即 2 / 10 = 0.2 。其置信度 = 同时包含 A, B, C 的订单数 / 同时包含 A, B 的订单数,即 2 / 4 = 0.5。支持度体现了商品(组)的受欢迎程度,置信度体现了商品(组)对另一商品(组)的影响力。在挖掘关联规则时,需指定最小支持度和最小置信度,毕竟不收欢迎的商品,即使它们之间相辅相成,把它们摆在一起也不会有很多人买。

二、频繁项集

为了批量计算所有组合之间的关系,我们需要构建频繁项集,以下为百度百科对频繁项集的定义。

项集:最基本的模式是项集,它是指若干个项的集合。频繁模式是指数据集中频繁出现的项集、序列或子结构。频繁项集是指支持度大于等于最小支持度(min_sup)的集合。

先将原始数据转为集合形式,便于进行运算。

data_goods['goodsSet'] = data_goods['goodsLst'].apply(lambda x: set(x.replace(',', '')))
data_goods

在这里插入图片描述
将所有订单的中的商品整合成一个列表,用于对每个商品进行计数,即可生成频繁 1 项集,如商品 A 出现在 6 个订单中。

all_goods = sum(data_goods['goodsLst'].str.split(','), [])
itemset_1 = Counter(list(all_goods)).items()
itemset_1

dict_items([(‘A’, 6), (‘B’, 8), (‘E’, 2), (‘C’, 7), (‘D’, 3)])

计算关联规则需要生成频繁 k 项集(k≤最大组合个数),编写一个 get_item_set() 以便使用。默认最小支持度计数为 2 ,即某商品组至少要出现 2 次。利用 comb() 生成 k 个商品构成的组合,再判断这些组合集是否出现在订单集中。下图为生成的频繁 2 项集,如第一行即表示商品 A+B 出现在 4 个订单中。

def count_grp(s, the_col):  # 计算目标集合在集合列中是子集的数量
    return the_col.apply(lambda x: 1 if s.issubset(x) else 0).sum()


def get_item_set(uni_lst, the_col, k, min_support=2):  # 生成 k 项集
    grp_goods = [i for i in comb(uni_lst, k)]
    df_itemset = pd.DataFrame({'grp': [set(i) for i in grp_goods]})

    df_itemset['count'] = df_itemset['grp'].apply(
        lambda x: count_grp(x, the_col))
    return df_itemset[df_itemset['count'] >= min_support]

uni_goods = [i[0] for i in itemset_1]
itemset_2 = get_item_set(uni_goods, data_goods['goodsSet'], k=2)
itemset_2

在这里插入图片描述

再写一个 get_all_item_set() 用于生成候选总集,我们选择生成至频繁 4 项集(但 4 个商品构成的组合没有在订单中出现 2 次,被过滤)。

def get_all_item_set(uni, the_col, n, min_support=2):  # 生成候选总集
    all = []
    for i in range(1, n+1):
        all.append(get_item_set(uni, the_col, k=i, min_support=min_support))
    return pd.concat(all)

all_itemset = get_all_item_set(uni_goods, data_goods['goodsSet'], n=4)
all_itemset

在这里插入图片描述

三、置信度

前置准备做好了,接下来就可以根据前述公式计算商品(组)间的置信度了。 我们以 A+E=>B 做测试,可见买了商品 A 和 E 时极有可能会买商品 B。

def get_confidence(term, aim, itemsets):  # 计算置信度
    result = term.union(aim)
    support_term = itemsets[itemsets['grp'] == term]['count'].values
    support_result = itemsets[itemsets['grp'] == result]['count'].values
    support_term = support_term[0] if support_term else 0
    support_result = support_result[0] if support_result.size > 0 else 0
    confidence = support_result/support_term if support_term > 0 else 0
    return f'{term}=>{aim}', confidence

get_confidence({'A', 'E'}, {'B'}, all_itemset)

(“{‘A’, ‘E’}=>{‘B’}”, 1.0)

四、关联规则

最后计算一下所有的关联规则,传入之前生成的候选总集 all_itemset,默认最小置信度为 0.6。由此,我们得到了所有存在较强关联的商品(组)。

def apriori(itemsets, gro_col='grp', min_confidence=0.6):  # 计算所有关联规则并筛选
    all_tuple = [i for i in perm(itemsets[gro_col], 2)]  # 生成条件=>目标组
    all_tuple = [(term, aim) for term, aim in all_tuple if  aim.isdisjoint(term)]  # 条件和目标无交集
    grp_c_lst = []
    for term, aim in all_tuple:
        grp, c = get_confidence(term, aim, itemsets)) # 逐个计算置信度
        grp_c_lst.append((grp, c))
    df = pd.DataFrame(data=grp_c_lst, columns=['关联规则', '置信度'])
    return df[df['置信度'] > min_confidence].sort_values('置信度', ascending=False)

apriori(all_itemset)

在这里插入图片描述

五、小结

本文初步实现了 Apriori 算法,对商品的关联规则进行了探索,如有不足,欢迎大佬们指出改正。这里是再不水文的话下班回家就只想睡觉的 Seon塞翁,下一篇见!
简明使用:三个步骤,整理指定格式数据输入->生成候选项集->计算关联规则。

# 输入唯一商品名列表,所有订单商品集合列,最大项集数
all_itemset = get_all_item_set(uni_goods, data_goods['goodsSet'], n=3)
# 输入候选项集(组合集+频数的形式)
apriori(all_itemset)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/33163.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据可视化之雷达图:自助数据集处理,完美演绎球员数据可视化

数据可视化,不只应用于工作或者财务报告,在某些场合通过使用图表展示数据,进行信息可视化表达,不仅可以省去繁冗的文字,还能更为清晰直观地展示,化平庸为神奇,让任何人有认真看的欲望。 当今世…

Thinkpad X201i笔记本电脑开机Fan Error

Thinkpad X201i笔记本电脑开机Fan Error1 背景2 现象3 更换风扇3.1 准备工具3.2 开始拆机1 背景 家里的老笔记本电脑,thinkpad X201i笔记本电脑,一直在使用,之前给风扇清过会,添加过硬盘,基本上也是拆了卸&#xff0c…

Logger.error还不知道怎么传参打印?看完这个你就明白了

Logger.error方法打印出堆栈信息,非常重要,可以使我们快速定位出相关问题,提高效率。 但是Logger.error有多个重载方法,不同的传参,打印结果各不一样。 下面,来看一个示例, 一、代码示例 impor…

WordPress Mixed Content混合内容警告:4 种简单的修复方法

如果您在 WordPress 网站上看到混合内容警告,请不要惊慌,它是一个常见警告。即使您安装了 SSL(安全套接字层)证书,也可能在任何网站上发生这种情况。 WordPress Mixed Content混合内容警告不会阻止您的网站在页面上显示…

[附源码]java毕业设计医学季节性疾病筛查系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

学生Dreamweaver静态网页设计 基于HTML+CSS+JavaScript制作简食餐厅美食网站制作

🎀 精彩专栏推荐👇🏻👇🏻👇🏻 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业…

计算机组成原理4小时速成:系统总线,片内总线,系统总线,通信总线,数据总线,地址总线,控制总线,传输率=带宽/传输周期

计算机组成原理4小时速成:系统总线,片内总线,系统总线,通信总线,数据总线,地址总线,控制总线,传输率带宽/传输周期 2022找工作是学历、能力和运气的超强结合体,遇到寒冬…

知识图谱-KGE-对抗模型-2018:KBGAN

KBGAN paper: KBGAN: Adversarial Learning for Knowledge Graph Embeddings 论文 本文是清华大学的一名同学发表在 NAACL(虽然是 C,但是是北美的 ACL) 2018 上的一篇文章,提出了 KBGAN,首次使用生成对抗网的思想做…

【配电网优化】配电网潮流计算与经济调度模糊满意度评价【含GUI Matlab源码 2159期】

⛄一、配电网潮流计算与经济调度模糊满意度评价软件介绍 单击guimh.m文件打开系统主界面,如图1所示,界面友好、简单、易于操作。主界面上方有一个“开始”按钮,可以控制整个软件的执行。主界面右方有三个选项,分别为“配电网潮流…

S32DS 调用脚本实现Post-build处理

作者:Stephen Du 免责声明: 本文为个人学习笔记及总结,仅代表个人观点,尽可能保证内容准确性。 所有文字均是自己码出来的,所有图片均为自己勾画(除部分来源于原始标准)。 复制/转发请注明来源/…

【目标检测】swin-transformer的学习

文章目录1. swin-transformer2. swin-transformer的结构1. swin-transformer 优点: 解决transformer在cv领域速度慢的问题保持CNN的位移不变性、尺寸不变性、感受野与尺寸的关系、分阶段降低分辨率等特点在多领域表现SOTA 缺点: 不具备CNN的权值共享…

常用框架技术-07 Apache Dubbo 一款高性能、轻量级的开源Java RPC框架

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言1.软件架构的演进过程1.1 集群和分布式1.2 单体架构1.2.1 架构说明1.2.2 优点1.2.3 缺点1.3 垂直架构1.3.1 架构说明1.3.2 优点1.3.3 缺点1.4 SOA架构1.4.1 架构…

[附源码]计算机毕业设计JAVA旅游景点推荐系统

[附源码]计算机毕业设计JAVA旅游景点推荐系统 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybati…

dolphinscheduler-数据质量-源码分析

数据质量工作流程 数据质量运行流程分为2个部分:在web端进行数据质量检测的流程定义,通过dolphinscheduer进行调度,提交到spark计算引擎;spark端负责解析数据质量模型的参数,通过读取数据、执行转换、输出三个步骤&am…

Java -- 每日一问:谈谈常用的分布式ID的设计方案?Snowflake是否受冬令时切换影响?

典型回答 首先,我们需要明确通常的分布式 ID 定义,基本的要求包括: 全局唯一,区别于单点系统的唯一,全局是要求分布式系统内唯一。 有序性,通常都需要保证生成的 ID 是有序递增的。例如,在数据…

小体积单输入单输出单电源供电光电隔离转换器0-75mV/0-5V/0-200mV/0-20mA/4-20mA

概述: 导轨安装DIN11 IPO OC系列模拟信号隔离放大器是一种将输入信号隔离放大、转换成按比例输出的直流信号混合集成厚模电路。产品广泛应用在电力、远程监控、仪器仪表、医疗设备、工业自控等需要直流信号隔离测控的行业。此系列产品内部采用了线性光电隔离技术相…

Unity | 以附加模式加载场景,实现多场景叠加及注意事项

1 多场景叠加 Unity 允许多场景叠加,这种叠加包括编辑模式及运行模式 新建两个简单的场景,SampleScene 和 AdditiveScene,设置不同的天空盒及平行光源颜色 SampleScene AdditiveScene 2 编辑模式 2.1 添加场景 在编辑器中的场景资源右键选…

vue draggable怎么用?怎么写一个拖拽的看板?

项目中需要像看板一样的可以拖动的任务队列 如果自己要手写的话会很麻烦,大佬当我没说。市面上目前有很多成熟的组件,本次介绍的这个就是一个轻量级的应用。 sortable.js中文文档 - itxst.com 常规的vue文件使用,可以参考上面的网站。 本次…

C语言习题练习10--指针

1.代码结果 #include <stdio.h> int main() {int arr[] {1,2,3,4,5};short *p (short*)arr;int i 0;for(i0; i<4; i){*(pi) 0;}for(i0; i<5; i){printf("%d ", arr[i]);}return 0; } 正常&#xff1a;0001--00 02--00 03--00 04--00 05 数组内部是倒…

[附源码]java毕业设计医院管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…