数据挖掘之关联分析Apriori算法
文章目录
- 一、理论知识
- 1.1、定义
- 1.2、关联规则
- 1.3、频繁项集的产生
- 二、python实战
一、理论知识
许多商业企业在运营中积累了大量的数据。例如:普通超市的收银台每天都会收集到大量的用户购物数据。下表给出一个这样的例子,通常称为购物篮事务。每一行代表一个事务,包含唯一标识id和顾客购买的商品的集合。零售商对分析这些数据会感兴趣,因为这样可以了解到用户的购物行为,可以使用这种有价值的信息来支持各种商务应用,如市场促销,库存管理等。
TID | 项集 |
---|---|
1 | {黄油 ,苹果,香蕉} |
2 | {面包,牛奶,苹果} |
3 | {面包,黄油,苹果} |
4 | {黄油,苹果,香蕉} |
5 | {牛奶,香蕉} |
这篇博客主要讲解关联分析的方法。用于发现隐藏在大型数据集中的有意义的联系。发现的联系可以利用关联规则或频繁项集的形式表示。例如,从上表中可以提取出如下规则:{面包}->{苹果},这个规则表示买了面包的人同时也买了苹果,继而可以发现新的交叉销售商机。
1.1、定义
- 二元表示:
购物篮数据可以用下表的二元形式来表示,每行表示一个事务,每一列表示一个项集。项可以用二元值表示,若项在事务中出现,则表示为1,否则为0。
牛奶 | 苹果 | 面包 | 香蕉 | 黄油 | |
---|---|---|---|---|---|
1 | 0 | 1 | 0 | 1 | 1 |
2 | 1 | 1 | 1 | 0 | 0 |
3 | 0 | 1 | 1 | 0 | 1 |
4 | 0 | 1 | 0 | 1 | 1 |
5 | 1 | 0 | 0 | 1 | 0 |
- 项集:关联分析中,包含0个或多个项的集合被称为项集。如果一个项集中包含k个项,则称其为k项集。例如:{苹果,面包,牛奶}是一个3项集。
- 支持度计数:项集在事务中出现的次数即为支持度计数。例如:上面的二元表中,项集{面包,苹果}在5个事务中出现了2次,所以它的支持度计数就为2。
1.2、关联规则
- 关联规则是形如X->Y的蕴含表达式,其中X和Y是不相交的项集,即它们的交集为空。关联规则的强度可以利用支持度和置信度度量。支持度确定给定数据集的频繁程度,而置信度确定Y在包含X的事务中出现的频繁程度。
- 支持度(support)和置信度(confidence)的定义如下:N表示事务数量,N()表示项集在事务中出现的次数
s(X→Y)=N(XUY)N,c(X→Y)=N(XUY)N(X)s(X→Y)=\frac{N(XUY)}{N},c(X→Y)=\frac{N(XUY)}{N(X)}s(X→Y)=NN(XUY),c(X→Y)=N(X)N(XUY) - 提升度(lift):lift(X→Y)=c(X→Y)s(Y)=N(XUY)/N(X)N(Y)/Nlift(X→Y)=\frac{c(X→Y)}{s(Y)}=\frac{{N(XUY)}/{N(X)}}{N(Y)/N}lift(X→Y)=s(Y)c(X→Y)=N(Y)/NN(XUY)/N(X),如果lift=1lift=1lift=1说明X和Y没有任何关联,如果lift<1lift<1lift<1,说明X和Y是排斥的,如果lift>1lift>1lift>1,我们认为X和Y是有关联的。
例如:上面的例子中:牛奶出现在2个事务中,那么{牛奶}的支持度就是2/5=0.4;苹果出现在包含牛奶的事务中出现了1次,那么规则{牛奶}→{苹果}的置信度为1/2=0.5,规则{牛奶}→{苹果}的提升度为0.5/(4/5)=0.625。 - 给定事务的集合T,关联规则发现是指找出支持度大于等于minsup且置信度大于等于minconf的所有规则,其中minsup和minconf是对应的支持度和置信度的阈值即设置的最小支持度和最小置信度。
- 为什么使用支持度和置信度呢?
- 支持度是一种重要度量值,因为支持度很低的规则可能知识偶尔出现,从商务角度看,低支持度的规则多半是无意义的,因为对顾客很少同时购买的商品进行促销活动并无益处。因此支持度,通常是删掉那些无意义的规则。
- 置信度度量通过规则推理具有可靠性。对于给定的规则X→Y,置信度越高,说明Y在包含X的事务中出现的可能性就越大。置信度也可以估计Y在条件X下的条件概率。
- 提升度存在的意义:
置信度用于评估规则的可信程度,但是该度量有一个缺点,没有考虑规则后件的支持度问题,例如在下表中:
规则{茶}→\rightarrow→{咖啡}的支持度为150/1000=15%,置信度为150/200=75%,先不考虑支持度,只看置信度会觉得比较高,因为可能会认为爱喝茶的人一般也爱喝咖啡。我们再来看一下喝咖啡的人的支持度,达到800/1000=80%,比规则{茶}→\rightarrow→{咖啡}的置信度75%高,这说明什么问题?并不是爱喝茶的人一般爱喝咖啡,从而使得规则置信度高,而是爱喝咖啡的人本身就很多,所以这条规则是一个误导。由于置信度存在的缺陷,人们又提出了称作提升度的度量。 - 强关联规则:
- 对于给定的规则X→Y,如果规则同时满足support(X→Y)>=minsupsupport(X→Y)>=minsupsupport(X→Y)>=minsup和confidence(X→Y)>=minconfconfidence(X→Y)>=minconfconfidence(X→Y)>=minconf,那么称规则X→Y为强关联规则,否则为弱关联规则。
1.3、频繁项集的产生
- 先验原理:如果一个项集是频繁的,那么该项集的所有子集一定也是频繁的。
- Apriori算法是第一个关联挖掘算法,使用基于支持度的剪枝技术。对于例子来说,假定支持度阈值为60%,相当于最小支持度计数为3。
- 如图:初始将每个项作为一个候选1-项集,对他们的支持度计数之后,候选项集{牛奶}和{面包}被丢弃,因为它们的计数均小于3;第二次迭代,仅使用频繁集1-项集来产生2-项集,因为先验原理保证2-项集的所有子集均属于频繁集,因为只有3个频繁1-项集,所以从3个中选择两个产生2-项集,2项集数目为C32=3C^2_3=3C32=3,计算它们在所有事务中的支持度,发现2-项集中频繁项集只有一个{苹果,黄油};最终的频繁项集就是{苹果,黄油}。
二、python实战
import numpy as np
import pandas as pd
from mlxtend.frequent_patterns import apriori
from mlxtend.frequent_patterns import association_rules #关联规则data = pd.read_csv('GoodsOrder.csv',sep=',',index_col=0,encoding='gbk')
df = pd.crosstab(index=data.index,columns=data.goods)
df
goods 牛奶 苹果 面包 香蕉 黄油
row_0
1 0 1 0 1 1
2 1 1 1 0 0
3 0 1 1 0 1
4 0 1 0 1 1
5 1 0 0 1 0frequent=apriori(df,min_support=0.3,use_colnames=True) #设置最小支持度为0.3,求频繁项集,显示列标签名
rules=association_rules(frequent,metric='confidence',min_threshold=0) #置信度大于0.5,求关联规则
rules.sort_values(by='confidence',ascending=False)
- 结果解释:三项集中置信度最高的是(黄油,香蕉)→(苹果)( 黄油,香蕉 )\rightarrow(苹果)(黄油,香蕉)→(苹果)和(苹果,香蕉)→(黄油)( 苹果,香蕉 )\rightarrow(黄油)(苹果,香蕉)→(黄油),项集(黄油,香蕉)→(苹果)( 黄油,香蕉 )\rightarrow(苹果)(黄油,香蕉)→(苹果)说明在购买了黄油和香蕉的前提下,一定会购买苹果;且它们的提升度>1,说明有着较强的相关性。
- 列名含义:针对规则{A}->{B},总事务数为N
列名 | 解释 | 公式 |
---|---|---|
antecedents | 前件 | A |
consequents | 后件 | B |
antecedent support | 前件支持度 | support(A)=N(A)/Nsupport(A)=N(A)/Nsupport(A)=N(A)/N |
consequent support | 后件支持度 | support(B)=N(B)/Nsupport(B)=N(B)/Nsupport(B)=N(B)/N |
support | 规则支持度 | support(A→B)=N(A,B)/Nsupport({A}\rightarrow{B})=N(A,B)/Nsupport(A→B)=N(A,B)/N |
confidence | 置信度 | confidence(A→B)=N(A,B)/N(A)confidence({A}\rightarrow{B})=N(A,B)/N(A)confidence(A→B)=N(A,B)/N(A) |
lift | 提升度 | lift(A→B)=confidence(A→B)/support(B)lift({A}\rightarrow{B})=confidence({A}\rightarrow{B})/support(B)lift(A→B)=confidence(A→B)/support(B) |
leverage | 杠杆率 | leverage(A→B)=support(A→B−support(A)∗support(B))leverage({A}\rightarrow{B})=support({A}\rightarrow{B}-support(A)*support(B))leverage(A→B)=support(A→B−support(A)∗support(B)) |
conviction | conviction(A→B)=1−support(B)1−confidence(A→B)conviction({A}\rightarrow{B})=\frac{1-support(B)}{1-confidence({A}\rightarrow{B})}conviction(A→B)=1−confidence(A→B)1−support(B) |
参考:
《数据挖掘导论》 范明 译
数据挖掘之关联分析Apriori算法相关推荐
- 关联分析——Apriori算法
Apriori 算法详解 当我们在百度搜索里输入一个单词或单词一部分的时候,搜索引擎会自动补全查询词项,比如:输入"机器",百度下拉词项中就会出现"机器人编程" ...
- 关联分析(Apriori算法) 面包 牛奶 尿布 啤酒 ...
关联分析时,需要处理两个关键问题 1 大量数据集中发现模式,计算代价高 2 某些模式可能是虚假的,因为他们是偶然发生的 关联分析例题:从这个商品记录得出顾客喜欢同时购买那几样东西 TID 面包 牛奶 ...
- 【机器学习】关联分析Apriori算法详解以及代码实现
Apriori算法以及统计学基础 什么是关联分析 简单的统计学基础 Apriori输出频繁集 从频繁项集中挖掘关联规则 什么是关联分析 从大规模数据集中寻找物品间的隐含关系被称作关联分析.而寻找物品的 ...
- 44 R关联分析——Apriori算法
install.packages("gridBase") install.packages("arules") install.packages("a ...
- 实验六、数据挖掘之关联分析
实验六.数据挖掘之关联分析 一.实验目的 1. 理解Apriori算法的基本原理 2. 理解FP增长算法的基本原理 3. 学会用python实现Apriori算法 4. 学会用python实现FP增长 ...
- 数据挖掘之关联分析(实验展示以及源代码)
数据挖掘之关联分析 算法实现:Apriori算法和FP-growth 算法 源代码 简单描述下,关联分析概念 关联分析概念主要参考下面的博文 原文:https://blog.csdn.net/qq_4 ...
- 挖掘频繁模式、关联和Apriori算法
挖掘频繁模式.关联和Apriori算法 1. 引入 1.1 基本概念 频繁模式:频繁出现在数据集中的模式 频繁模式挖掘:获取到给定数据集中反复出现的联系 注:模式其实可以理解为,你在淘宝购物,你的购物 ...
- 河北工业大学数据挖掘实验三 应用 Apriori 算法挖掘频繁项集
河北工业大学数据挖掘实验三 应用 Apriori 算法挖掘频繁项集 一.实验目的 二.实验原理 1.Apriori 算法 2.提高频繁项集逐层产生的效率 三.实验内容和步骤 1.实验内容 2.实验步骤 ...
- 【数据挖掘】关联规则挖掘 Apriori 算法 ( Apriori 算法过程 | Apriori 算法示例 )
文章目录 一. Apriori 算法过程 二. Apriori 算法示例 参考博客 : [数据挖掘]关联规则挖掘 Apriori 算法 ( 关联规则简介 | 数据集 与 事物 Transaction ...
最新文章
- 神童、数学家、抑郁症患者,控制论之父诺伯特·维纳的一生
- 如何配置一台计算机预计3500元,玩游戏用的电脑主机应该怎么配置?3500元组装游戏电脑主机配置推荐...
- iis日志转到sql存储
- 小师妹学IO系列文章集合-附PDF下载
- Json、Gson、Jackson
- 【渝粤题库】陕西师范大学210002儿童文学 作业(高起专、高起本、专升本)
- 是人是谁_谁是白鹤滩最可爱的人
- 基于docker搭建zookeeper集群、kafka集群(多台真机之间的集群)
- python 生成器 generator
- axure 发布 主页_车队如何在黑鸟APP发布同城活动?教程来了!
- 数据科学包1---numpy
- 阿里云推出香港高防IP服务 为中国企业出海安全护航
- ajax 循环php数组,jQuery通过ajax请求php遍历json数组到table中的代码(推荐)
- 贝叶斯网络分析软件Netica
- 联想笔记本系统重装,联想电脑重装系统
- 阿帕奇apache-apollo-1.7.1-windows-distro
- python 线性插值处理_python线性插值解析
- phpnow安装教程
- 曲面积分(Surface Integral)
- linux批量筛选序列变异位点,找变异流程之snp_call –WES学习之路
热门文章
- OS WDM OPM OSW 知识总结
- 论文汇网站第三期改版完成
- 国标28181:接收设备注册
- springboot集成通用mapper与分页助手时报错,java.lang.NoSuchMethodException: com.github.abel533.provider.....
- 7个资源丰富到爆的搜索网站,没有你找不到的资源!
- 手把手教你用Python爬中国电影票房数据
- 设置服务器连接信息是什么情况,了解有关设置 IMAP 服务器连接的更多信息
- 厦门大学计算机专业周奕毅,厦门大学2020年博士后招收计划[010].PDF
- “1万起投,年化达8%”?天安金交中心卖力“吆喝”的产品,是“香”还是“坑”?
- 小梅哥FPGA学习笔记——状态机设计学习