关联分析(Association analysis)

关联分析(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,并且confidenceminconf的规则,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 
当 kle项的个数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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83

测试

>>> 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}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

从频繁项集中提取强规则

修剪

从频繁项集中提取规则保证了这些规则的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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49

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

>>> 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
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

参考资料:

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


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

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

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

相关文章

机器学习11主成分分析

降维(Dimensionality Reduction) &#xff1a; 一、 降维目的&#xff1a; 目的一&#xff1a;数据压缩&#xff08;Data Compression&#xff09; 目的二&#xff1a;数据可视化&#xff08;Visualization&#xff09; 二、 主成分分析&#xff08;PCA&#xff09; 主成分…

使用Apriori进行关联分析(一)

使用Apriori进行关联分析&#xff08;一&#xff09;大型超市有海量交易数据&#xff0c;我们可以通过聚类算法寻找购买相似物品的人群&#xff0c;从而为特定人群提供更具个性化的服务。但是对于超市来讲&#xff0c;更有价值的是如何找出商品的隐藏关联&#xff0c;从而打包促…

主成分分析法 (PCA) 用于数据可视化实验 -- Matlab版

第一步&#xff1a;下载数据集。 https://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/multiclass.html#pendigits 第二步&#xff1a;改变数据格式。 注&#xff1a;此数据集的各特征值均为像素&#xff0c;即属于同一量纲&#xff0c;故无需归一化步骤。 原格式为&a…

机器学习12推荐系统

推荐系统(Recommender Systems) 推荐系统根据浏览用户过去买过什么书&#xff0c;或过去评价过什么电影来判断并推荐新产品给用户。 这些系统会为像亚马逊和网飞这样的公司带来很大一部分收入。 因此&#xff0c;对推荐系统性能的改善&#xff0c;将对这些企业的有实质性和…

使用Apriori进行关联分析(二)

使用Apriori进行关联分析&#xff08;二&#xff09;书接上文&#xff08;使用Apriori进行关联分析&#xff08;一&#xff09;&#xff09;&#xff0c;介绍如何挖掘关联规则。发现关联规则我们的目标是通过频繁项集挖掘到隐藏的关联规则。所谓关联规则&#xff0c;指通过某个…

数学笔记3——导数3(隐函数的导数)

数学笔记3——导数3&#xff08;隐函数的导数&#xff09;幂函数的扩展形式f(x) xn的导数&#xff1a;f’(x) nxn-1&#xff0c;n是整数&#xff0c;该公式对f(x) xm/n, m,n 是整数同样适用。推导过程&#xff1a;什么是隐函数引自知乎&#xff1a;“如果方程F(x,y)0能确定y…

机器学习13大规模数据集

大型数据集的学习&#xff08;Learning With Large Datasets&#xff09; 如果我们有一个低方差的模型&#xff0c; 增加数据集的规模可以帮助你获得更好的结果。 我们应该怎样应对一个有 100 万条记录的训练集&#xff1f; 以线性回归模型为例&#xff0c;每一次梯度下降…

Java07多线程

14 多线程 操作系统的多任务&#xff08;multitasking&#xff09;&#xff1a;在同一时刻运行多个程序的能力。 多线程在较低的层次上扩展了多任务的概念&#xff1a;一个程序同时执行多个任务。 通常&#xff0c;每一个任务称为一个线程&#xff08;tread&#xff09;&…

MySQL字段拼接Concat

有时候&#xff0c;从数据库中拿出的数据并不是我们想要的格式&#xff0c;比如&#xff0c;有以下的vendors表 如果&#xff0c;想以 name (location)的格式展现出来&#xff0c;那么就要用到MySQL的Concat了。 Concat()拼接串&#xff0c;即把多个串连接起来形成一个较长的串…

使用pycharm调用模块后字体变灰 是什么原因呢?

使用pycharm调用模块后字体变灰 是什么原因呢&#xff1f;点击小灯泡提示出现以下内容&#xff1a;This inspection detects names that should resolve but dont. Due to dynamic dispatch and duck typing, this is possible in a limited but useful number of cases. Top-l…

操作系统01概述

第一章 概论 《Operating System Internals and Design Principles》 《Applied Operating System Concepts》 操作系统——裸机上的第一层软件&#xff0c;它是对硬件系统功能的首次扩充&#xff0c;填补人与机器之间的鸿沟。 1.1 操作系统与计算机同在 1.2 对操作系统的…

Linux re

正则表达式并不是一个工具程序&#xff0c;而是一个字符串处理的标准依据&#xff0c;如果想要以正则表达式的方式处理字符串&#xff0c;就得使用支持正则表达式的工具&#xff0c;例如grep、vi、sed、asw等。 注意&#xff1a;ls不支持正则表达式。 grep 正则表达式: 注意gr…

操作系统02进程管理Process_Description_and_Control

作业的基本概念&#xff1a;用户再一次计算过程中或一次事务处理过程中&#xff0c;要求计算机系统所做的工作的集合。 包含多个程序、多个数据、作业控制说明书 系统调用时操作系统提供给编程人员的唯一接口。 1、文件操作类&#xff1b; 2、进程控制类&#xff1b; 3、资…

蓝桥杯 方格填数(全排列+图形补齐)

方格填数 如下的10个格子 填入0~9的数字&#xff0c;同一数字不能重复填。要求&#xff1a;连续的两个数字不能相邻。&#xff08;左右、上下、对角都算相邻&#xff09; 一共有多少种可能的填数方案&#xff1f; 请填写表示方案数目的整数。注意&#xff1a;你提交的应该是一个…

操作系统03进程管理Process_Scheduling

2 Process Scheduling >Type of scheduling >Scheduling Criteria (准则) >Scheduling Algorithm >Real-Time Scheduling (嵌入式系统) 2.1 Learning Objectives By the end of this lecture you should be able to Explain what is Response Time 响应时间-…

skimage库需要依赖 numpy+mkl 和scipy

skimage库需要依赖 numpymkl 和scipy1、打开运行&#xff0c;输入cmd回车&#xff0c;输入python回车&#xff0c;查看python版本2、在https://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy 中&#xff0c;根据自己python版本下载需要的包 &#xff08;因为我的是python 2.7.13 …

操作系统04进程同步与通信

4.1 进程间的相互作用 4.1.1 进程间的联系资源共享关系相互合作关系临界资源应互斥访问。临界区&#xff1a;不论是硬件临界资源&#xff0c;还是软件临界资源&#xff0c;多个进程必须互斥地对它们进行访问。把在每个进程中访问临界资源的那段代码称为临界资源区。显然&#x…

oracle迁移到greenplum的方案

oracle数据库是一种关系型数据库管理系统&#xff0c;在数据库领域一直处于领先的地位&#xff0c;适合于大型项目的开发&#xff1b;银行、电信、电商、金融等各领域都大量使用Oracle数据库。 greenplum是一款开源的分布式数据库存储解决方案&#xff0c;主要关注数据仓库和BI…

CNN框架的搭建及各个参数的调节

本文代码下载地址&#xff1a;我的github本文主要讲解将CNN应用于人脸识别的流程&#xff0c;程序基于PythonnumpytheanoPIL开发&#xff0c;采用类似LeNet5的CNN模型&#xff0c;应用于olivettifaces人脸数据库&#xff0c;实现人脸识别的功能&#xff0c;模型的误差降到了5%以…

操作系统05死锁

进程管理4--Deadlock and Starvation Concurrency: Deadlock and Starvation 内容提要 >产生死锁与饥饿的原因 >解决死锁的方法 >死锁/同步的经典问题&#xff1a;哲学家进餐问题 Deadlock 系统的一种随机性错误 Permanent blocking of a set of processes that eith…