机器学习实战8-Apriori算法
1. 用途和原理
1.1 用途
用于关联分析,即在大规模数据中寻找有趣的关系,有两种形式:频繁项集和关联规则。频繁项集:指经常出现在一块的物品集合。关联规则:暗示两种物品之间可能存在很强的关系。典型一个案例便是:尿布与啤酒(感兴趣可以了解一下)。
1.2 原理
Apriori原理:如果某个项集是频繁的那么它的所有子集也是频繁的。反过来,如果某个项集非频繁,那么其所有的超集也非频繁。如下图,阴影部分 [2,3] 以及其超集均为为非频繁集。
两个概念:
支持度:一个项集的支持度定义为数据集中包含该项集的记录所占的比例。
可信度:针对关联规则所定义,如规则 A->B(可简单理解为 A 导致 B ),则该规则可信度=支持度{A,B}/支持度{A}
1.3 算法过程
收集数据
找出满足阈值条件的频繁项集
运用关联规则找出物品间关系
2. Python实现
2.1 构建频繁项集
伪代码如下:
当集合中项的个数大于0时:
- 构建一个K个项组成的候选项集的列表
- 检查数据以确认每个项集是频繁的(即观察支持度是否大于阈值)
- 保留频繁项集并构建K+1项组成的候选项集列表
主要核心代码如下:
1 # 创建候选项集Ck 2 def aprioriGen(Lk,k): 3 retList=[] 4 lenLk=len(Lk) 5 # 将每一个集合与其他所有集合遍历配对,每两个元素检查其前k-2个值是否相同,如果相同,合并之,减小配对时间 6 for i in range(lenLk): 7 for j in range(i+1,lenLk): 8 # list[:k-2]返回的是前k-2个数 9 L1=list(Lk[i])[:k-2] 10 L2=list(Lk[j])[:k-2] 11 L1.sort() 12 L2.sort() 13 if L1==L2: 14 retList.append(Lk[i]|Lk[j]) 15 return retList 16 17 # 创建频繁项集L,及其对应的支持度 18 def apriori(dataSet,minSupport=0.5): 19 C1=creatC1(dataSet) 20 D=list(map(set,dataSet)) 21 L1,supportData=scanD(D,C1,minSupport) 22 L=[L1] 23 k=2 24 # 循环产生Lk,并放入列表中[L1,L2,.....Lk],直到Lk为空 25 while (len(L[k-2])>0): 26 Ck=aprioriGen(L[k-2],k) 27 Lk,supK=scanD(D,Ck,minSupport) 28 # 将新的集合支持度添加入支持度集合中去 29 supportData.update(supK) 30 L.append(Lk) 31 k+=1 32 return L,supportData
当我们输入一组数据时:[[1,3,4],[2,3,5],[1,2,3,5],[2,5]],观察其构建的频繁项集。
完整代码如下:
1 # 1.创建数据集 2 def loadDataSet(): 3 return [[1,3,4],[2,3,5],[1,2,3,5],[2,5]] 4 5 # 2.构建集合C1,C1是所有种类(大小为1)的集合 6 def creatC1(dataSet): 7 C1=[] 8 for transaction in dataSet: 9 for item in transaction: 10 if not [item] in C1: 11 C1.append([item]) 12 C1.sort() 13 # 与原文比有所修改 14 return list(map(frozenset,C1)) 15 16 # 3.创建某一级频繁项集Lk 17 def scanD(D,Ck,minSupport): 18 ssCnt={} 19 for tid in D: 20 # print(tid) 21 for can in Ck: 22 # print(can) 23 # 判断tid中是否包含can 24 if can.issubset(tid): 25 # 创建字典,key是can,值是次数 26 # 与原文有所差别 27 if not can in ssCnt: 28 ssCnt[can]=1 29 else: 30 ssCnt[can]+=1 31 numItems=float(len(D)) 32 retList=[] 33 supportData={} 34 for key in ssCnt: 35 # 计算每个key支持度 36 support=ssCnt[key]/numItems 37 # 如果支持度大于最小支持度,插入种类key,并添加入到关于支持度的字典 38 if support>=minSupport: 39 retList.insert(0,key) 40 supportData[key]=support 41 return retList,supportData 42 43 # 4.创建候选项集Ck 44 def aprioriGen(Lk,k): 45 retList=[] 46 lenLk=len(Lk) 47 # 将每一个集合与其他所有集合遍历配对,每两个元素检查其前k-2个值是否相同,如果相同,合并之,减小配对时间 48 for i in range(lenLk): 49 for j in range(i+1,lenLk): 50 # list[:k-2]返回的是前k-2个数 51 L1=list(Lk[i])[:k-2] 52 L2=list(Lk[j])[:k-2] 53 L1.sort() 54 L2.sort() 55 if L1==L2: 56 retList.append(Lk[i]|Lk[j]) 57 return retList 58 59 # 5.创建频繁项集L,及其对应的支持度 60 def apriori(dataSet,minSupport=0.5): 61 C1=creatC1(dataSet) 62 D=list(map(set,dataSet)) 63 L1,supportData=scanD(D,C1,minSupport) 64 L=[L1] 65 k=2 66 # 循环产生Lk,并放入列表中[L1,L2,.....Lk],直到Lk为空 67 while (len(L[k-2])>0): 68 Ck=aprioriGen(L[k-2],k) 69 Lk,supK=scanD(D,Ck,minSupport) 70 # 将新的集合支持度添加入支持度集合中去 71 supportData.update(supK) 72 L.append(Lk) 73 k+=1 74 return L,supportData 75 76 dataSet=loadDataSet() 77 L,suppData=apriori(dataSet) 78 print(L) 79 print(suppData)
View Code
如图表达:
2.2 构建关联规则
主要用到的是分级法,可以首先从一个频繁项集开始,接着建立一个规则列表,其中规则右部只包含一个元素,测试这些规则,去掉不满足最低可信度条件的规则。接着再利用剩余的规则,合并,规则右边包含两个元素,一直往后延续。观察下面几个主要的程序更易理解。
1 ''' freqSet--频繁项集 2 H--频繁项集中的所有元素 3 ''' 4 def generateRules(L,supportData,minConf=0.7): 5 bigRuleList=[] 6 for i in range(1,len(L)): 7 for freqSet in L[i]: 8 H1=[frozenset([item]) for item in freqSet] 9 if (i>1): 10 rulesFormConseq(freqSet,H1,supportData,bigRuleList,minConf) 11 else: 12 calcConf(freqSet,H1,supportData,bigRuleList,minConf) 13 return bigRuleList 14 15 # 依次计算:【(freqSet-H中的单个元素)-->H中的单个元素】的可信度 16 def calcConf(freqSet,H,supportData,br1,minConf=0.7): 17 prunedH=[] 18 for conseq in H: 19 conf=supportData[freqSet]/supportData[freqSet-conseq] 20 # 如果大于最低可信度值,规则存入br1中,记录入prunedH 21 if conf>=minConf: 22 # print(freqSet-conseq,'-->',conseq,'conf:',conf) 23 br1.append((freqSet-conseq,conseq,conf)) 24 prunedH.append(conseq) 25 return prunedH 26 27 # 建立某频繁集项的所有满足阈值条件的规则 28 def rulesFormConseq(freqSet,H,supportData,br1,minConf=0.7): 29 m=len(H[0]) 30 # 分级法:右边是规则列表,从一个规则到两个规则到三个规则...... 31 # 此处的 m+1 条件保证的是:创建最后一层级的规则不会使用所有频繁集项中的元素,即左边不会为空至少保证一个元素 32 if (len(freqSet)>(m+1)): 33 Hmp1=aprioriGen(H,m+1) 34 Hmp1=calcConf(freqSet,Hmp1,supportData,br1,minConf) 35 if (len(Hmp1)>1): 36 rulesFormConseq(freqSet,Hmp1,supportData,br1,minConf)
接着2.1中内容,找出关联规则,完整程序如下:
1 # 1.创建数据集 2 def loadDataSet(): 3 return [[1,3,4],[2,3,5],[1,2,3,5],[2,5]] 4 5 # 2.构建集合C1,C1是所有种类(大小为1)的集合 6 def creatC1(dataSet): 7 C1=[] 8 for transaction in dataSet: 9 for item in transaction: 10 if not [item] in C1: 11 C1.append([item]) 12 C1.sort() 13 # 与原文比有所修改 14 return list(map(frozenset,C1)) 15 16 # 3.创建某一级频繁项集Lk 17 def scanD(D,Ck,minSupport): 18 ssCnt={} 19 for tid in D: 20 # print(tid) 21 for can in Ck: 22 # print(can) 23 # 判断tid中是否包含can 24 if can.issubset(tid): 25 # 创建字典,key是can,值是次数 26 # 与原文有所差别 27 if not can in ssCnt: 28 ssCnt[can]=1 29 else: 30 ssCnt[can]+=1 31 numItems=float(len(D)) 32 retList=[] 33 supportData={} 34 for key in ssCnt: 35 # 计算每个key支持度 36 support=ssCnt[key]/numItems 37 # 如果支持度大于最小支持度,插入种类key,并添加入到关于支持度的字典 38 if support>=minSupport: 39 retList.insert(0,key) 40 supportData[key]=support 41 return retList,supportData 42 43 # 4.创建候选项集Ck 44 def aprioriGen(Lk,k): 45 retList=[] 46 lenLk=len(Lk) 47 # 将每一个集合与其他所有集合遍历配对,每两个元素检查其前k-2个值是否相同,如果相同,合并之,减小配对时间 48 for i in range(lenLk): 49 for j in range(i+1,lenLk): 50 # list[:k-2]返回的是前k-2个数 51 L1=list(Lk[i])[:k-2] 52 L2=list(Lk[j])[:k-2] 53 L1.sort() 54 L2.sort() 55 if L1==L2: 56 retList.append(Lk[i]|Lk[j]) 57 return retList 58 59 # 5.创建频繁项集L,及其对应的支持度 60 def apriori(dataSet,minSupport=0.5): 61 C1=creatC1(dataSet) 62 D=list(map(set,dataSet)) 63 L1,supportData=scanD(D,C1,minSupport) 64 L=[L1] 65 k=2 66 # 循环产生Lk,并放入列表中[L1,L2,.....Lk],直到Lk为空 67 while (len(L[k-2])>0): 68 Ck=aprioriGen(L[k-2],k) 69 Lk,supK=scanD(D,Ck,minSupport) 70 # 将新的集合支持度添加入支持度集合中去 71 supportData.update(supK) 72 L.append(Lk) 73 k+=1 74 return L,supportData 75 76 ''' freqSet--频繁项集 77 H--频繁项集中的所有元素 78 ''' 79 def generateRules(L,supportData,minConf=0.7): 80 bigRuleList=[] 81 for i in range(1,len(L)): 82 for freqSet in L[i]: 83 H1=[frozenset([item]) for item in freqSet] 84 if (i>1): 85 rulesFormConseq(freqSet,H1,supportData,bigRuleList,minConf) 86 else: 87 calcConf(freqSet,H1,supportData,bigRuleList,minConf) 88 return bigRuleList 89 90 # 依次计算:【(freqSet-H中的单个元素)-->H中的单个元素】的可信度 91 def calcConf(freqSet,H,supportData,br1,minConf=0.7): 92 prunedH=[] 93 for conseq in H: 94 conf=supportData[freqSet]/supportData[freqSet-conseq] 95 # 如果大于最低可信度值,规则存入br1中,记录入prunedH 96 if conf>=minConf: 97 # print(freqSet-conseq,'-->',conseq,'conf:',conf) 98 br1.append((freqSet-conseq,conseq,conf)) 99 prunedH.append(conseq) 100 return prunedH 101 102 # 建立某频繁集项的所有满足阈值条件的规则 103 def rulesFormConseq(freqSet,H,supportData,br1,minConf=0.7): 104 m=len(H[0]) 105 # 分级法:右边是规则列表,从一个规则到两个规则到三个规则...... 106 # 此处的 m+1 条件保证的是:创建最后一层级的规则不会使用所有频繁集项中的元素,即左边不会为空至少保证一个元素 107 if (len(freqSet)>(m+1)): 108 Hmp1=aprioriGen(H,m+1) 109 Hmp1=calcConf(freqSet,Hmp1,supportData,br1,minConf) 110 if (len(Hmp1)>1): 111 rulesFormConseq(freqSet,Hmp1,supportData,br1,minConf) 112 113 dataSet=loadDataSet() 114 L,suppData=apriori(dataSet) 115 rules=generateRules(L,suppData,minConf=0.5) 116 print(L) 117 print(suppData) 118 print(rules)
View Code
3.示例:毒蘑菇
完整程序:
1 # 1.创建数据集 2 def loadDataSet(): 3 return [[1,3,4],[2,3,5],[1,2,3,5],[2,5]] 4 5 # 2.构建集合C1,C1是所有种类(大小为1)的集合 6 def creatC1(dataSet): 7 C1=[] 8 for transaction in dataSet: 9 for item in transaction: 10 if not [item] in C1: 11 C1.append([item]) 12 C1.sort() 13 # 与原文比有所修改 14 return list(map(frozenset,C1)) 15 16 # 3.创建某一级频繁项集Lk 17 def scanD(D,Ck,minSupport): 18 ssCnt={} 19 for tid in D: 20 # print(tid) 21 for can in Ck: 22 # print(can) 23 # 判断tid中是否包含can 24 if can.issubset(tid): 25 # 创建字典,key是can,值是次数 26 # 与原文有所差别 27 if not can in ssCnt: 28 ssCnt[can]=1 29 else: 30 ssCnt[can]+=1 31 numItems=float(len(D)) 32 retList=[] 33 supportData={} 34 for key in ssCnt: 35 # 计算每个key支持度 36 support=ssCnt[key]/numItems 37 # 如果支持度大于最小支持度,插入种类key,并添加入到关于支持度的字典 38 if support>=minSupport: 39 retList.insert(0,key) 40 supportData[key]=support 41 return retList,supportData 42 43 # 4.创建候选项集Ck 44 def aprioriGen(Lk,k): 45 retList=[] 46 lenLk=len(Lk) 47 # 将每一个集合与其他所有集合遍历配对,每两个元素检查其前k-2个值是否相同,如果相同,合并之,减小配对时间 48 for i in range(lenLk): 49 for j in range(i+1,lenLk): 50 # list[:k-2]返回的是前k-2个数 51 L1=list(Lk[i])[:k-2] 52 L2=list(Lk[j])[:k-2] 53 L1.sort() 54 L2.sort() 55 if L1==L2: 56 retList.append(Lk[i]|Lk[j]) 57 return retList 58 59 # 5.创建频繁项集L,及其对应的支持度 60 def apriori(dataSet,minSupport=0.5): 61 C1=creatC1(dataSet) 62 D=list(map(set,dataSet)) 63 L1,supportData=scanD(D,C1,minSupport) 64 L=[L1] 65 k=2 66 # 循环产生Lk,并放入列表中[L1,L2,.....Lk],直到Lk为空 67 while (len(L[k-2])>0): 68 Ck=aprioriGen(L[k-2],k) 69 Lk,supK=scanD(D,Ck,minSupport) 70 # 将新的集合支持度添加入支持度集合中去 71 supportData.update(supK) 72 L.append(Lk) 73 k+=1 74 return L,supportData 75 76 ''' freqSet--频繁项集 77 H--频繁项集中的所有元素 78 ''' 79 def generateRules(L,supportData,minConf=0.7): 80 bigRuleList=[] 81 for i in range(1,len(L)): 82 for freqSet in L[i]: 83 H1=[frozenset([item]) for item in freqSet] 84 if (i>1): 85 rulesFormConseq(freqSet,H1,supportData,bigRuleList,minConf) 86 else: 87 calcConf(freqSet,H1,supportData,bigRuleList,minConf) 88 return bigRuleList 89 90 # 依次计算:【(freqSet-H中的单个元素)-->H中的单个元素】的可信度 91 def calcConf(freqSet,H,supportData,br1,minConf=0.7): 92 prunedH=[] 93 for conseq in H: 94 conf=supportData[freqSet]/supportData[freqSet-conseq] 95 # 如果大于最低可信度值,规则存入br1中,记录入prunedH 96 if conf>=minConf: 97 print(freqSet-conseq,'-->',conseq,'conf:',conf) 98 br1.append((freqSet-conseq,conseq,conf)) 99 prunedH.append(conseq) 100 return prunedH 101 102 # 建立某频繁集项的所有满足阈值条件的规则 103 def rulesFormConseq(freqSet,H,supportData,br1,minConf=0.7): 104 m=len(H[0]) 105 # 分级法:右边是规则列表,从一个规则到两个规则到三个规则...... 106 # 此处的 m+1 条件保证的是:创建最后一层级的规则不会使用所有频繁集项中的元素,即左边不会为空至少保证一个元素 107 if (len(freqSet)>(m+1)): 108 Hmp1=aprioriGen(H,m+1) 109 Hmp1=calcConf(freqSet,Hmp1,supportData,br1,minConf) 110 if (len(Hmp1)>1): 111 rulesFormConseq(freqSet,Hmp1,supportData,br1,minConf) 112 113 114 mushDatSet=[line.split() for line in open('mushroom.dat').readlines()] 115 print(mushDatSet) 116 L,suppData=apriori(mushDatSet,minSupport=0.3) 117 rules=generateRules(L,suppData,minConf=0.7) 118 for item in L[3]: 119 if item.intersection('2'): 120 print(item) 121 print(rules) 122 print(L)
View Code
转载于:https://www.cnblogs.com/Ray-0808/p/10953648.html
机器学习实战8-Apriori算法相关推荐
- 机器学习实战——密度聚类算法
机器学习实战--密度聚类算法 1 密度聚类 2 sklearn中的实现 1 密度聚类 密度聚类假设聚类结构能够通过样本分布的密集程度确定,通常情形下,密度聚类算法从样本密度的角度来考察样本之间的可连接 ...
- 机器学习实战——层次聚类算法
机器学习实战--层次聚类算法 1 层次聚类概述 2 sklearn中的实现 1 层次聚类概述 层次聚类试图在不同层次对数据集进行划分,从而形成树形的聚类结构. 数据集的划分可采用"自底向上& ...
- 机器学习-关联之Apriori算法原理及实战
Apriori算法 前言 关联分析是一种无监督的机器学习方法,主要用于发现大规模数据集中事物之间的依存性和关联性.挖掘数据中隐藏的有价值的关系(如频繁项集.关联规则),有利于对相关事物进行预测,也能帮 ...
- 机器学习---实战---K-近邻算法--笔记
参考:机器学习实战 一.概念重梳理 二.使用K-近邻算法改进约会网站的匹配效果关键要点 数据归一化: 转载于:https://www.cnblogs.com/qing1991/p/10163901 ...
- 算法代码[置顶] 机器学习实战之KNN算法详解
改章节笔者在深圳喝咖啡的时候突然想到的...之前就有想写几篇关于算法代码的文章,所以回家到以后就奋笔疾书的写出来发表了 前一段时间介绍了Kmeans聚类,而KNN这个算法刚好是聚类以后经常使用 ...
- 【机器学习实战】KNN算法
机器学习作为人工智能的重要分支,同时也是数据挖掘中不可或缺的算法支撑.本人接触时间不短,但研究尚浅.我计划用python来实现机器学习中较为常见的算法. 看透了自己,便无须小看别人. (老舍) 机器学 ...
- 【机器学习实战】KNN算法的两个经典例子(电影类型判断,约会网站的改进)
KNN算法的两个常用实际例子 一.使用K-邻近算法来对电影的类型进行判断 1.实验思路: 2.代码实现: 3.运行截图: 4.完整代码展示: 二.在约会网站上使用KNN算法 (一)准备数据:从文本文件 ...
- 《机器学习实战》KNN算法实现
本系列都是参考<机器学习实战>这本书,只对学习过程一个记录,不做详细的描述! 注释:看了一段时间Ng的机器学习视频,感觉不能光看不练,现在一边练习再一边去学习理论! KNN很早就之前就看过 ...
- 机器学习实战—使用FP-growth算法来高效发现频繁项集
FP-growth算法基于Apriori构建,但采用了高级的数据结构减少扫描次数,大大加快了算法速度.FP-growth算法只需要对数据库进行两次扫描,而Apriori算法对于每个潜在的频繁项集都会扫 ...
- 模式识别和机器学习实战-K近邻算法(KNN)- Python实现 - 约会网站配对效果判断和手写数字识别
文章目录 前言 一. k-近邻算法(KNN) 1.算法介绍 2.举个例子--电影分类 3.步骤描述 4.来了--代码实现 二.实战之约会网站配对效果判断 1.导入数据 2.分析数据 3.数据归一化 4 ...
最新文章
- linux 浏览器源码下载,Android开发:图片浏览器源码
- iangularjs 模板_AngularJS中的模板安全与作用域绑定
- Linux内核网络丢包查看工具dropwatch的安装和使用
- oracle数据库是db还是dbnms,Oracle数据库中各种类型的文件损坏与修复过程详解(2)...
- Redis添加密码认证Cacti监控读取Redis状态值为 -1 的最快速解决方案
- 使用xml及java代码混合的方式来设置图形界面
- vue笔记(四)注册组件,路由,vuex
- python 图形_Python图形数据
- 实战 | WebMagic 爬取某保险经纪人网站经纪人列表之网站列表爬取
- 为GridView-Delete列添加确认对话框(2种方法)
- ERP项目实施记录06
- python禁用键盘鼠标_在Python中禁用或锁定鼠标和键盘?
- HDU1290 重建希望小学【递推+打表】
- 1012 数字分类 (20 分)—PAT (Basic Level) Practice (中文)
- 1.1顺序表的初始化及基本操作(菜单实现)
- 上海项目危机经历与感想
- RemObjects Elements Crack,用途软件开发工具链
- jmeter配置远程运行
- 网络学习(一)--基本模型学习
- js-键盘事件案例-小人快跑
热门文章
- java集合框架介绍_Java集合框架全面介绍(一)
- [运维]PowerShell简体中文编码转换
- 抖音昵称html,抖音名字600个
- s5原生android 5.0,三星Galaxy S5/S4吃上原生安卓5.0棒棒糖
- java怎么对用户做自定义模版打印_Printing tools 自定义模板打印的实现
- 推荐模块︱apple.Turicreate个性化推荐recommender(五)
- saltstack系列~第四篇
- Java EnumMap工作原理及实现
- Android人脸检测类FaceDetector
- C++:在堆上创建对象,还是在栈上?