关联分析之Apriori学习笔记

article/2025/9/18 7:24:48

关联分析(Association analysis)

简介

大量数据中隐藏的关系可以以‘关联规则’和‘频繁项集’的形式表示。rules:{Diapers}–>{Beer}说明两者之间有很强的关系,购买Diapers的消费者通常会购买Beer。
除了应用在市场篮子数据(market basket data)中,关联分析(association analysis)也可以应用在其他领域像bioinfomatic(分析复杂生物知识的学科)、medical diagnosis、Web mining和scientific data analysis。
在关联分析中有两个问题需要解决:1,从大量交易数据中发现隐藏的模式需要大量运算;2,有些模式可能只是刚好发生,因此这些模式是虚假的。所以以下内容包括两点:1,利用某种算法高效的挖掘这种模式;2,通过评估这些模式避免产生虚假结果。1
下面以market basket data分析为例:
这里写图片描述

几个概念:

  • Itemset
    I=i1,i2,,id 是所有项的集合。在association analysis中,0或更多项的集合称为itemset,具有 k 项的itemset称为k-itemset。
  • support count
    包含某个特定的Itemset的交易数目。在表6.1中2-itemset{Bread,Milk}的support count:σ({Bread,Milk})=3(1)
  • rule
    规则,不难理解, XY(XY=) ,箭头左边称为先决条件(antecedent),箭头右边称为结果(consequent)
  • support
    某一项集或规则发生次数占总交易次数的百分比。 s(XY)=s({X,Y})=σ(XY)N(2)
    例如:项集{Bread,Milk}的support为 35
  • confidence
    X发生时Y发生的概率,也即条件概率。
    Confidence,c(XY)=σ(XY)σ(X)(3)

寻找关联规则的两个步骤

给定一个交易集合 T ,寻找所有的满足supportminsup,并且confidence minconf的规则,minsup和minconf是相应的support和confidence的阈值。
一种寻找关联规则的方法是计算每一条可能规则的support和confidence,也就是我们说的蛮力法。这种方法需要大量的运算,因为规则的个数是呈指数增长的。一个包含 d 个项的数据集可以提取出的规则的数目是

R=3d2d+1+1()

既然我们不想使用蛮力法,那么应该使用什么方法来寻找关联规则呢?从上式(1)可以看出规则 XY 的support仅仅依赖于相应的项集 XY 的support。例如,下面的规则的support完全相同,因为他们有相同的项集{Beer,Diapers,Milk}:
{Beer,Diapers} {Milk},{Beer,Milk} {Diapers},{Diapers,Milk} {Beer},{Beer} {Diapers,Milk},{Milk} {Beer,Diapers},{Diapers} {Beer,Milk}
如果项集{Beer,Diapers,Milk}不是频繁的,那么可以直接裁剪掉以上所有6个候选规则。
因此,许多关联规则挖掘算法将这个问题分解成两个主要子任务:
- 产生频繁项集:寻找所有达到support阈值的项集。
- 产生规则:从频繁项集中提取具有高置信度的规则,这些规则称为强规则。2

产生频繁项集

Apriori原理

我们可以使用枚举法列举出所有可能的k-itemset,然后计算每个项集的support。一个具有 m 项的数据集可以产生2m1个项集,而其中满足support阈值的项集可能很少。显然,当数据集很大时,枚举法并不是个高效的方法。从下图可以看出,有4个项的数据集,共有15个项集。
图来自 机器学习实战
为了提高寻找频繁项集的效率,我们应该把那些不可能满足support阈值的项集裁剪掉。
Apriori原理:如果一个项集是频繁的,那么它的子项集也一定是频繁的
反过来说,如果一个项集不是频繁的,那么它的父项集也一定不是频繁的。下图加了阴影的项集被裁剪掉。
这里写图片描述
来自 机器学习实战
根据以上原理,我们可以从上往下寻找频繁项集。也就是,首先寻找频繁项集:1-itemset,然后再由1-itemset组合成2-itemset…..(其实上图的例子并没有减少需要计算support的项集个数(这个是不是程序需要改进??怎么只有1-itemset是infrequent的时候才能减少需要计算的项集数),如果 3 是infrequent的,那么以下包含3的项集可以全部忽略)
伪代码
1. 计算得到频繁项集1-itemset的集合: Iii=1
2. k=2
当 k le 项的个数 N 时:
Ik=generateIk(D,Ii) …从I_i中产生频繁项集的集合 Ii+1
i=k,k++

其中,generateIk函数是从k-itemset产生(k+1)-itemset
这个函数包含两个过程:连接和筛选。
- 连接
当确定了一个频繁项集k-itemset的全部集合后,它需要和自身连接,生成k+1-itemset。所谓连接,就是两个不同的频繁项集k-itemset,当它们的前(k-1)项都相同时,就进行合并。
- 筛选
从上面的定理我们得知,当子项不是频繁项集时,父项也一定不是频繁项集。但当子项都是频繁项集时,其父项却不一定是频繁项集。因此,在连接得到(k+1)-itemset后,还需要计算它的support,如果不满足support的阈值,那么就删去。

python程序

下面的程序和 机器学习实战 中的程序思想基本相同,但我个人感觉书中的程序有些难以理解,因此自己写了一个。 感谢 机器学习实战 作者

'''产生频繁项集'''
def genFreqItemset(dataSet,minSupp=0.5):'''input:dataSet:training data,type:listoutput:freqSet:a list of all the k-itemset.each element is frozensetsupport:a dict,the support of frequent itemset'''unique_value={}I1=[]support={}freqSet=[]m=len(dataSet)for tran in dataSet:for item in tran:if item not in unique_value.keys():unique_value[item]=0unique_value[item]+=1for item in unique_value.keys():supp=float(unique_value[item])/mif supp>=minSupp:I1.append(frozenset([item]))  #frozeset can serve as a key to dictionarysupport[frozenset([item])]=supp #only record the support of frequent itemsetI1.sort();freqSet.append(I1)k=2Lk=[]while k<=m:Lk=generateLk(freqSet[k-2],k)Lk,LkSupp=filterLk(dataSet,Lk,minSupp)freqSet.append(Lk)support.update(LkSupp)k+=1return freqSet,supportdef generateLk(freq,k):'''input:freq:  the itemset in freq is k-1 itemsetk:  create k-itemset from k-1_itemsetoutput:Lk:a list of k-itemset,frequent and infrequent'''Lk=[]for i in range(0,len(freq)-1):for j in range(i+1,len(freq)):if list(freq[i])[0:k-2]==list(freq[j])[0:k-2]:#fore k-1 item is identityLk.append(frozenset(freq[i]|freq[j]))return Lkdef filterLk(dataSet,Lk,minSupp=0.5):'''input:  Lk: all the k-itemset that need to be prunedoutput:filteredLk: frequent k-itemset which satisfy the minimum supportLkSupp: the support of frequent k-itemset'''LkSupp={}filteredLk=[]for itemset in Lk:supp=calcSupport(dataSet,itemset)if supp>=minSupp:LkSupp[frozenset(itemset)]=suppfilteredLk.append(frozenset(itemset))return filteredLk,LkSuppdef calcSupport(dataSet,Lk):'''calculate the support of Lk,Lk is a frozenset'''# Lk=list(Lk)[0]dataSet=map(set,dataSet)m=len(dataSet)num=0for tran in dataSet:if Lk.issubset(tran):num+=1return float(num)/m

测试

>>> dataSet
[[1, 3, 4], [2, 3, 5], [1, 2, 3, 5], [2, 5]]
>>> Lk,support=apriori_f.genFreqItemset(dataSet,0.5)
>>> Lk[0]
[frozenset([1]), frozenset([2]), frozenset([3]), frozenset([5])]
>>> Lk[1]
[frozenset([1, 3]), frozenset([2, 3]), frozenset([2, 5]), frozenset([3, 5])]
>>> Lk[2]
[frozenset([2, 3, 5])]
>>> Lk[3]
[]
>>> support
{frozenset([5]): 0.75, frozenset([3]): 0.75, frozenset([2, 3, 5]): 0.5, frozenset([3, 5]): 0.5, frozenset([2, 3]): 0.5, frozenset([2, 5]): 0.75, frozenset([1]): 0.5, frozenset([1, 3]): 0.5, frozenset([2]): 0.75}

从频繁项集中提取强规则

修剪

从频繁项集中提取规则保证了这些规则的support一定满足minsupport,接下来就是置信度的计算。同样,我们可以使用蛮力列举所有可能的规则,并计算其置信度,但这样我们会做许多无用功。一个包含 n 项的频繁项集,可能产生的规则数是2n1
为了提高效率,我们采用同前面Apriori算法类似的裁剪方法:
如果 XYX 不满足最小置信度,那么 XYX(XX) 也一定不满足最小置信度。
证明: c(XYX)=support(Y)support(X)<minConfidence
c(XYX)=support(Y)support(X) ,其中, support(X)support(X) ,所以有 c(XYX)<minConfidence
如下图:
这里写图片描述
图中添加阴影的规则全部被裁剪掉。

python程序

def getBigRule(freq,support,minConf=0.5):'''input:  freq   : the frequent k-itemset,k=1,2,...nsupport:  corresponding support  outpur:bigRuleList: a list of all the rule that satisfy min confidence'''bigRuleList=[]m=len(freq)for i in range(1,m):genRules(freq[i],support,bigRuleList,minConf)return bigRuleListdef genRules(freq,support,brl,minConf=0.5):'''extract rules that satisfy min confidence from a list of k-itemset(k>1)put the eligible rules in the brl'''if len(freq)==0:returnif len(freq[0])==2: #handle 2-itemsetfor itemset in freq:for conseq in itemset:conseq=frozenset([conseq])conf=support[itemset]/support[itemset-conseq]if conf>=minConf:print itemset-conseq, '-->',conseq,'conf:',confbrl.append((itemset-conseq,conseq,conf))elif len(freq[0])>2:H=[]for itemset in freq:# first generate 1-consequence listfor conseq in itemset:conseq=frozenset([conseq])conf=support[itemset]/support[itemset-conseq]if conf>=minConf:print itemset-conseq, '-->',conseq,'conf:',confbrl.append((itemset-conseq,conseq,conf))H.append(conseq)m=2#  generate 2,...,k-1 consequencewhile m<len(freq[0]):H=generateLk(H,m)for conseq in H:conf=support[itemset]/support[itemset-conseq]if conf>=minConf:print itemset-conseq, '-->',conseq,'conf:',confbrl.append((itemset-conseq,conseq,conf))m+=1

利用以上得到的频繁项集测试:

>>> brl=apriori_f.getBigRule(freqSet,support,0.7)
frozenset([1]) --> frozenset([3]) conf: 1.0
frozenset([5]) --> frozenset([2]) conf: 1.0
frozenset([2]) --> frozenset([5]) conf: 1.0
frozenset([3, 5]) --> frozenset([2]) conf: 1.0
frozenset([2, 3]) --> frozenset([5]) conf: 1.0
>>> brl
[(frozenset([1]), frozenset([3]), 1.0), (frozenset([5]), frozenset([2]), 1.0), (frozenset([2]), frozenset([5]), 1.0), (frozenset([3, 5]), frozenset([2]), 1.0), (frozenset([2, 3]), frozenset([5]), 1.0)]

参考资料:

[1] 机器学习实战
[2] 使用Apriori算法和FP-growth算法进行关联分析


  1. Introduction to data mining Ch6 ↩
  2. Introduction to data mining Ch6 ↩

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

相关文章

关联分析(一)

目录 一 关联分析的应用 二 关联分析定义 关联分析(又称关联挖掘) 常见关系分类 四 基本原理 ​编辑 五 常用算法 5.1 先验算法Apriori 5.2 FP-Growth算法 一 关联分析的应用 在美国国会投票记录中发现关联规则发现毒蘑菇的相似特征在Twitter源中发现一些共现词从网站…

数据分析五、Apriori 算法之关联分析

Apriori 算法 一、相关概念&#xff1a;二、Apriori 算法2.1、确定最小支持度和最小置信度2.2、找出频繁项集和强关联规则2.3、Python 调用 apriori 函数 Apriori---[əpriˈɔri] ---先天的&#xff0c;推测的一、相关概念&#xff1a; 关联分析&#xff0c;是一门分析技术&a…

数据的结构分类:结构化数据,半结构化数据以及非结构化数据

数据结构分类 结构化数据&#xff1a;具有域名与域值&#xff0c;可用二维表表示。例如关系数据库和CSV文档半结构数据&#xff1a;具有域值和域名&#xff0c;但每一笔数据的字段可能不一样。例如JSON以及XML非结构化数据&#xff1a;不具有域值和域名&#xff0c;例如文章&a…

结构化数据与非结构化数据有什么区别?

结构化数据和非结构化数据是大数据的两种类型&#xff0c;这两者之间并不存在真正的冲突。客户如何选择不是基于数据结构&#xff0c;而是基于使用它们的应用程序&#xff1a;关系数据库用于结构化数据&#xff0c;大多数其他类型的应用程序用于非结构化数据。 然而&#xff0…

结构化数据和非结构化数据有何区别?

员工离职&#xff0c;老板最关心的可能并不是工作交接是否滴水不漏&#xff0c;而是离职员工会如何处理他手里的数据。 例如设计人员的设计图纸、项目经理的项目文档等&#xff0c;这些文档属于企业珍贵的资产&#xff0c;而大部分企业却从未真正管控过这部分资产。 可以确定的…

什么是结构化数据、半结构化数据、非结构化数据

一、 结构化数据 结构化数据&#xff1a;即以关系型数据库表形式管理的数据&#xff0c;例如&#xff1a; idnameage1马百万262马龙台1 机构化数据的数据存储和排列都是具有规律性的&#xff0c;对于增删改查等功能支持友好 二、半结构化数据 半结构化数据&#xff1a;非关…

总结非结构化数据分析「十步走」

注&#xff1a;诚然&#xff0c;本文中所提到的内容并使非结构化数据结构化的唯一步骤&#xff0c;但该步骤的可行性&#xff0c;以及在创造可持续模式方面的表现已在实践中得到证实。 如今&#xff0c;数据分析逐渐在企业发展中扮演起愈加重要的角色&#xff0c;为求在业务成长…

【黑马】JavaWeb开发教程(涵盖Spring+MyBatis+SpringMVC+SpringBoot等)目录合集

​Java Web 传统路线&#xff1a; 课程讲述路线&#xff1a; 视频链接&#xff1a; 2023新版JavaWeb开发教程&#xff0c;实现javaweb企业开发全流程 学习时间&#xff1a; 断断续续&#xff0c;按照课程安排正常学习&#xff0c;历时15天&#xff0c;完结撒花&#xff01;…

搭建JavaWeb开发环境(Eclipse版)

1. 在使用eclipse搭建JavaWeb开发环境时&#xff0c;首先要确保自己电脑已经安装过Java中的JDK&#xff0c;以及配置好了相关的环境变量。 2. 开始下载JavaEE软件&#xff1a;https://www.eclipse.org/downloads/packages/。在该网址中&#xff0c;选择镜像然后下载。&#xf…

搭建JavaWeb开发环境(JDK+Tomcat+Eclipse/Idea)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、 安装JDK二、配置环境变量 二、TomCat1. 获取 Tomcat2. Tomcat安装和环境变量的配置 三、eclipse配置 前言 提示&#xff1a;这里可以添加本文要记录的大概…

好文分享:Javaweb开发环境搭建常用工具类型

随着互联网的不断发展&#xff0c;无论是前端开发还是后端开发都越发垂直细分化&#xff0c;而今天我们就通过案例分析来了解一下&#xff0c;Javaweb开发环境搭建常用工具类型。 一&#xff1a;Web相关概念 Web程序也就是一般所说的网站&#xff0c;由服务器、客户端浏览器和…

JavaWeb开发相关版本对应关系

Eclipse与Java Eclipse版本与Java Eclipse版本代号Eclipse版本号Java版本Mars4.5JDK7Neon&#xff0d;Photon&#xff0d;2020.064.6&#xff0d;4.16JDK82020.09&#xff0d;2021.094.17&#xff0d;4.21JDK11 Eclipse/Installation - Eclipsepediahttps://wiki.eclipse.org/…

如何利用Java,Javaweb开发网站

需求分析 基于Javaweb整合三大组件(servletFilterlisten)设计并实现一个工作室网站开发, 对于工作室的日常宣传&#xff0c;企业形象&#xff0c;简单管理来说, 如何通过计算机技术对工作室进行管理非常重要, 通过编写一个在线的工作室网站源代码, 可以直接在网站上查看并了解…

javaweb开发环境搭建-mac版

一、安装jdk 1.检查&#xff1a;终端输入 java -version (mac自带jdk, 但版本较低&#xff0c;如果自带版本满足需求&#xff0c;请跳过23步) 2.安装或升级&#xff1a;官网下载 MAC OS版本的jdk安装 3.配置jdk环境变量&#xff1a;其实就是修改~/.bash_profile文件内容(此文件…

黑马《2023最新JavaWeb开发教程》发布啦~

急你所急&#xff0c;解你所需&#xff0c;黑马《2023最新JavaWeb开发教程》发布啦&#xff01;&#xff01;&#xff01; JavaWeb传统学习路线中的jQuery、JDBC、Servlet、JSP、EL & JSTL等技术点都已经过时啦。2023年了&#xff0c;学JavaWeb&#xff0c;一定要跟着黑马程…

JavaWeb开发入门

JavaWeb开发笔记 十年生死两茫茫&#xff0c;不思量&#xff0c;自难忘&#xff0c;华年短暂&#xff0c;陈辞岁月悠悠伤&#xff0c; 满腔热血已芜荒&#xff0c;展未来&#xff0c;后生强&#xff0c;战战兢兢&#xff0c;如履薄冰心彷徨&#xff0c; 青丝化雪、鬓角成霜&a…

JAVAweb开发资源库

JAVAweb开发资源库内含各种JAVAweb项目的代码模板&#xff0c;方便JAVAweb初学者进行学习&#xff0c;各种功能应有尽有&#xff0c;请自行下载体验&#xff1a;

实验一 JavaWeb开发环境

文章目录 前言具体操作总结 前言 一、实验目的&#xff1a;1.掌握JDK的安装的环境变量的配置。2.掌握Tomcat的安装及配置&#xff0c;Tomcat端口号的修改。3.掌握在IDE环境中编写web页面&#xff0c;发布应用并测试。4.理解IDE开发环境的安装&#xff0c;使用和运行方式&#…

JavaWeb开发框架——Spring

目录 1、Spring简介 1.1、Spring是什么 1.2、Spring发展历程 1.3、Spring的优势 1.3.1、方便解耦&#xff0c;简化开发 1.3.2、AOP编程的支持 1.3.3、声明式事务的支持 1.3.4、方便程序的测试 1.3.5、方便继承各种优秀框架 1.3.6、降低JavaEE API 的使用难度 1.3.7、…

JavaWeb开发环境搭建

JavaWeb开发环境搭建 我们都知道&#xff0c;学习java首先要进行java运行环境的搭建&#xff0c;也就是JDK的安装&#xff0c;许多有着java学习基础的人都进行过JDK和JavaSE的安装和配置。 一、进行Java运行环境的配置&#xff0c;安装JDK并进行环境变量配置&#xff08;我安…