关联规则挖掘——Apriori算法的基本原理以及改进

article/2025/9/20 18:49:57

问题引入

关联规则挖掘发现大量数据中项集之间有趣的关联或者相互联系。关联规则挖掘的一个典型例子就是购物篮分析,该过程通过发现顾客放入其购物篮中不同商品之间的联系,分析出顾客的购买习惯,通过了解哪些商品频繁地被顾客同时买入,能够帮助零售商制定合理的营销策略。购物篮事务的例子如下图所示:
购物篮事务的例子
例如:在同一次去超级市场时,如果顾客购买牛奶,同时他也购买面包的可能性有多大?
通过帮助零售商有选择地经销和安排货架,这种信息会引导销售。零售商有两种方法可以进行安排货架,第一种方法是将牛奶和面包尽可能的放的近一些,方便顾客自取,第二种方法是将牛奶和面包放的远一些,顾客在购买这两件物品的时候,这中间货架上的物品也会被顾客选择购买。这两种方法都可以进一步刺激消费。但是,如何发现牛奶和面包之间的关联关系呢?Apriori算法可以进行关联规则挖掘。

算法中的基本概念

1、项集和K-项集

令I={i1,i2,i3……id}是购物篮数据中所有项的集合,而T={t1,t2,t3….tN}是所有事务的集合,每个事务ti包含的项集都是I的子集。在关联分析中,包含0个或多个项的集合称为项集。如果一个项集包含K个项,则称它为K-项集。空集是指不包含任何项的项集。例如,在购物篮事务的例子中,{啤酒,尿布,牛奶}是一个3-项集。

2、支持度计数

项集的一个重要性质是它的支持度计数,即包含特定项集的事务个数,数学上,项集X的支持度计数σ(X)可以表示为
σ(X)=|{ti|X⊆ti,ti∈T}|
其中,符号|*|表示集合中元素的个数。
在购物篮事务的例子中,项集{啤酒,尿布,牛奶}的支持度计数为2,因为只有3和4两个事务中同时包含这3个项。

3、关联规则

关联规则是形如X→Y的蕴含表达式,其中X和Y是不相交的项集,即X∩Y=∅。
关联规则的强度可以用它的支持度(support)和置信度(confidence)来度量。支持度确定规则可以用于给定数据集的频繁程度,而置信度确定Y在包含X的事务中出现的频繁程度。
支持度(s)和置信度(c)这两种度量的形式定义如下:
s(X→Y)=σ(X∪Y)/N
c(X→Y)=σ(X∪Y)/σ(X)
其中, σ(X∪Y)是(X∪Y)的支持度计数,N为事务总数,σ(X)是X的支持度计数。

Example

在购物篮事务的例子中,考虑规则{牛奶,尿布}→{啤酒}。由于项集{牛奶,尿布,啤酒}的支持度计数为2,而事务的总数为5,所以规则的支持度为2/5=0.4。
规则的置信度是项集{牛奶,尿布,啤酒}的支持度计数与项集{牛奶,尿布}支持度技术的商,由于存在3个事务同时包含牛奶和尿布,所以规则的置信度为2/3=0.67。

关联规则发现

给定事务的集合T,关联规则发现是指找出支持度大于等于minsup (最小支持度)并且置信度大于等于minconf(最小置信度)的所有规则,minsup和minconf是对应的支持度和置信度阈值。

关联规则的挖掘是一个两步的过程:
(1)频繁项集产生:其目标是发现满足最小支持度阈值的所有项集(至少和预定义的最小支持计数一样),这些项集称作频繁项集。
(2)规则的产生:其目标是从上一步发现的频繁项集中提取所有高置信度的规则,这些规则称作强规则。(必须满足最小支持度和最小置信度)

Apriori算法介绍

Apriori算法的实质使用候选项集找频繁项集。
Apriori 算法是一种最有影响的挖掘布尔关联规则频繁项集的算法。算法的名字基于这样的事实:算法使用频繁项集性质的先验知识, 正如我们将看到的。Apriori 使用一种称作逐层搜索的迭代方法,k-项集用于探索(k+1)-项集。首先,找出频繁1-项集的集合。该集合记作L1。L1 用于找频繁2-项集的集合L2,而L2 用于找L3,如此下去,直到不能找到频繁k-项集。找每个Lk 需要一次数据库扫描。

Apriori性质

Apriori性质:频繁项集的所有非空子集都必须也是频繁的。 Apriori 性质基于如下观察:根据定义,如果项集I不满足最小支持度阈值s,则I不是频繁的,即P(I)< s。如果项A添加到I,则结果项集(即I∪A)不可能比I更频繁出现。因此, I∪A也不是频繁的,即 P(I∪A)< s 。
该性质属于一种特殊的分类,称作反单调,意指如果一个集合不能通过测试,则它的所有超集也都不能通过相同的测试。称它为反单调的,因为在通不过测试的意义下,该性质是单调的。

先验定理

先验定理:如果一个项集是频繁的,则它的所有子集一定也是频繁的。

(关于先验定理、单调与反单调可以参考下面的例子理解)


http://chatgpt.dhexx.cn/article/nMDRXdYW.shtml

相关文章

学习序列模式挖掘

学习序列模式挖掘 1.1介绍 已Apriori算法为例&#xff0c;此算法是经典的挖掘频繁项集和关联规则的数据挖掘算法。A priori在拉丁语中指"来自以前"。当定义问题时&#xff0c;通常会使用先验知识或者假设&#xff0c;这被称作"一个先验"&#xff08;a pr…

Python|判断素数

1. 判断一个从键盘输入的整型数是否是素数 num int(input()) for i in range(2, num//2):if num % i 0:print("%d不是一个素数" % num)break else:print("%d是一个素数" % num)控制台输入11&#xff0c;结果即&#xff1a; 2.随机生成10个两位正整数&a…

C语言if语句判断素数,利用简单的if语句判断素数

8种机械键盘轴体对比 本人程序员&#xff0c;要买一个写代码的键盘&#xff0c;请问红轴和茶轴怎么选&#xff1f; 判断素数这个问题是c语言条件&#xff0c;循环中最简单的一个问题 下面就来介绍一下判断素数的代码吧 #include “stdio.h” void main() { int x,i; int flag1;…

C语言 - 判断素数

定义&#xff1a; 素数&#xff08;Prime number&#xff0c;又称质数&#xff09;&#xff0c;指在大于1的自然数中&#xff0c;除了1和该数自身外&#xff0c;无法被其他自然数整除的数 思路一&#xff1a;试除法 1.如果数字 i 能被 2 ~ i-1 整除&#xff0c;说明 i 就是素数…

函数判断素数

1、实现一个函数&#xff0c;判断一个数是不是素数。 2、利用上面实现的函数打印100到200之间的素数。 素数的定义&#xff1a;素数是指大于一的整数中&#xff0c;只能被1和这个数本身整除的数。 假设这个数是n&#xff0c;那么用for循环去遍历&#xff0c;在2——n-1&…

C语言判断素数

素数又称质数。所谓素数是指除了 1 和它本身以外&#xff0c;不能被任何整数整除的数&#xff0c;例如7就是素数&#xff0c;因为它不能被 2~6 的任一整数整除。注意&#xff1a;一般情况下&#xff0c;质数合数只是针对于非零自然数而言&#xff0c;负数没有质数合数一说。 思…

用python判断素数_python判断素数

广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 质数(prime number),又称素数,指在大于1的自然数中,除了1和该数自身外,无法被其他自然数整除的数(也可定义为只有1与该数本身两个因数的数)。 那么想计…

判断素数的方法(全部方法)

功能 最快、最合适地判断一个数为素数 说明 分为打表法和单个判断法两类方法 打表法 是开始时将所有素数标记出来&#xff0c;适合多次调用判断&#xff0c;前两种属于打表法 单个判断法 则是只一个数一个数判断&#xff0c;适合少量判断来节省时间&#xff0c;后俩种属…

c语言判断素数(c语言判断素数)

C语言中素数判断 是素数就返回1&#xff0c;不是的话返回0。 int IsPrime(int n) int i; if (n 1 || n 2 || n 3 || n 5) return 1; else if (n % 2) for (i 3; i < n / 2 1; i 2) if (n % i 0) return 0; return 1; else return 0; } 代码如下&#xf…

C语言判断素数的三种方法 判断素数(质数)

题目&#xff1a; 方法一&#xff1a;在2到n-1之间任取一个数,如果n能被整除则不是素数&#xff0c;否则就是素数 代码示例如下&#xff1a; #include <stdio.h> int main() {int i,n;printf("Please input: ");scanf("%d",&n);for(i2;i<n-…

C语言判断素数(求素数)

C语言判断素数&#xff08;求素数&#xff09; 素数又称质数。所谓素数是指除了 1 和它本身以外&#xff0c;不能被任何整数整除的数&#xff0c;例如17就是素数&#xff0c;因为它不能被 2~16 的任一整数整除。 思路1)&#xff1a;因此判断一个整数m是否是素数&#xff0c;只需…

Flink自定义生成 Watermark

Watermark 策略简介 # 为了使用事件时间语义&#xff0c;Flink 应用程序需要知道事件时间戳对应的字段&#xff0c;意味着数据流中的每个元素都需要拥有可分配的事件时间戳。其通常通过使用 TimestampAssigner API 从元素中的某个字段去访问/提取时间戳。 时间戳的分配与 wat…

Flink学习:WaterMark

WaterMark 一、什么是水位线?二、案例分析三、如何生成水位线?(一)、在SourceFunction中直接定义Timestamps和Watermarks(二)、自定义生成Timstamps和Watermarks 一、什么是水位线? 通常情况下,由于网络或系统等外部因素影响,事件数据往往不能及时传输至Flink系统中,导致数…

flink watermark

flink1.12版本开始&#xff0c;事件事件作为默认的时间语义 watermark是flink逻辑时钟&#xff0c;不是真正意义上的表&#xff0c;而是靠着数据去推动它的时间不停的往前走 工厂生产的商品上面印有时间戳&#xff0c;八点到九点的商品要坐一班车运走&#xff0c;商品从生产到…

Flink WaterMark 详解

摘录仅供学习使用&#xff0c;原文来自&#xff1a; Flink详解系列之五--水位线&#xff08;watermark&#xff09; - 简书 1、概念 在Flink中&#xff0c;水位线是一种衡量Event Time进展的机制&#xff0c;用来处理实时数据中的乱序问题的&#xff0c;通常是水位线和窗口结合…

Flink:watermark

Table of Contents 三种时间概念 Processing time Event Time Ingestion time watermark 并行流的Watermarks 迟到的事件 watermark分配器 watermark的两种分配器 三种时间概念 在谈watermark之前&#xff0c;首先需要了解flink的三种时间概念。在flink中&#xff0c;…

Flink 水位线(Watermark)

文章目录 什么是水位线水位线的特性如何生成水位线Flink 内置水位线生成器自定义水位线策略在自定义数据源中发送水位线水位线的总结 在实际应用中&#xff0c;一般会采用事件时间语义。而水位线&#xff0c;就是基于事件时间提出的概念。一个数据产生的时刻&#xff0c;就是流…

vue -- watermark水印添加方法

作者&#xff1a;蛙哇 原文链接&#xff1a; https://segmentfault.com/a/1190000022055867 来源&#xff1a;segmentfault 前言 项目生成公司水印是很普遍的需求&#xff0c;下面是vue项目生产水印的方法。话不多说&#xff0c;复制粘贴就可以马上解决你的需求。 步骤1 创建…

tp-watermark.js网页添加水印插件

tp-watermark.js网页添加水印插件 作者&#xff1a;鹏仔先生 上周五&#xff0c;出差去改上个前端遗留的小问题&#xff0c;用到了watermark.js这个网站添加水印插件&#xff0c;功能很简单&#xff0c;就是给网页添加个水印&#xff0c;我看了下网上&#xff0c;有很多种&…