Apriori 算法分析:
利用my_new_apriori.py文件,对杂货店商品进行关联规则挖掘,支持度=0.06,置信度=0.2
使用的数据集:

数据集下载地址:
链接:https://pan.baidu.com/s/14Vgvv5OK-luwTgoEZozbRw
提取码:vvym

# -*- coding: utf-8 -*-
"""
Created on Fri Mar 22 10:21:02 2019@author: Administrator
"""
import pandas as pda
import numpy as np#定义函数data_set装载数据集
def load_data_set():'''定义数据集data_set列表:每一个列表中又包含了一些列表,这些列表表示事物数据库中的每一次交易,每个小列表表示的是每一次交易中所包含的产品项'''#读取文件数据,且数据中不包含数据的表头,所以header = Nonefilename = r'E:\杂货店商品.xlsx'data_x = pda.read_excel(filename,header = None)#默认打开Sheet1#用空格将所读取文件中的NaN进行替换data_x = data_x.fillna('')#将所得到的的data_x处理成为数组之后再将其类型转换为字符串类型train_data = np.array(data_x).astype(str)#再将数组train_data转换为列表赋值给data_setdata_set = train_data.tolist()#针对数据集中的每一笔交易i进行处理for i in data_set:while "" in i:i.remove("")return data_set  def create_C1(data_set):"""Create frequent candidate 1-itemset C1 by scaning data set.Args:data_set: A list of transactions. Each transaction contains several items.Returns:C1: A set which contains all frequent candidate 1-itemsets"""#定义一个空集合C1C1 = set()#针对传入函数的数据集data_set中的每一项事务例如:t = ['l1', 'l2', 'l5']for t in data_set:#针对事物数据库中的每一项事务例如:['l1', 'l2', 'l5']中的一个元素item = ’l1‘for item in t:'''由于要使用字典(support_data)记录项集的支持度,需要用项集作为key,而可变集合无法作为字典的key,因此在这里应将项集转为固定集合frozenset'''item_set = frozenset([item])#将上一步所得到的item_set加入到集合C1里面C1.add(item_set)'''因为集合中是不可能产生重复元素的,所以C1最后得到的结果集就是C1(l1,l2,l3,l4,l5)这样就得到了事务数据库中的一阶候选项集'''return C1#利用函数is_apriori和k-1阶的频繁项集对所得到的的一个个k阶候选项集Ck_item进行剪枝
def is_apriori(Ck_item, Lksub1):"""Judge whether a frequent candidate k-itemset satisfy Apriori property.Args:Ck_item: a frequent candidate k-itemset in Ck which contains all frequentcandidate k-itemsets.Lksub1: Lk-1, a set which contains all frequent candidate (k-1)-itemsets.Returns:True: satisfying Apriori property.False: Not satisfying Apriori property."""#扫描函数create_Ck中所传过来的参数Ck_item<k阶候选项集>中的每一个元素for item in Ck_item:#从Ck_item依次减去Ck_item中的一个元素并赋值给sub_Cksub_Ck = Ck_item - frozenset([item])#然后判断sub_Ck是否是k-1阶频繁项集的子集,如果是返回True,否则返回Falseif sub_Ck not in Lksub1:return Falsereturn True#create_Ck函数通过对Lk-1阶频繁项集自连接产生k阶候选项集
def create_Ck(Lksub1, k):"""Create Ck, a set which contains all all frequent candidate k-itemsetsby Lk-1's own connection operation.Args:Lksub1: Lk-1, a set which contains all frequent candidate (k-1)-itemsets.k: the item number of a frequent itemset.Return:Ck: a set which contains all all frequent candidate k-itemsets."""#定义一个空集合Ck用来存放Lk-1阶频繁项集自连接产生k阶候选项集Ck = set()#计算Lk-1阶频繁项集集合的长度len_Lksub1 = len(Lksub1)#将Lk-1阶频繁项集Lksub1转换为列表list_Lksub1list_Lksub1 = list(Lksub1)#针对列表list_Lksub1中的第i个元素for i in range(len_Lksub1):#针对列表list_Lksub1中的第j个元素for j in range(1, len_Lksub1):#将列表中的第i个元素和第j个元素分表转换为列表l1和l2l1 = list(list_Lksub1[i])l2 = list(list_Lksub1[j])#对列表l1和l2进行排序l1.sort()l2.sort()#针对排序好后的列表l1和l2,判断他们的第0:k-2元素是否相等if l1[0:k-2] == l2[0:k-2]:'''注意:这里如果是由一阶频繁项集产生二阶候选项集时:k=2,则l1[0:k-2] == l2[0:k-2]为l1[0:0] == l2[0:0]因为他们是空的所以他们始终为ture,就可以由1阶频繁项集自连接产生二阶候选项集如果相等,则他们进行自连接得到一个列表Ck_item'''# '|'表示的是联合:两个集合的联合是一个新集合,该集合中的每个元素都至少是其中一个集合的成员#  即属于两个集合其中之一的成员,联合符号有一个等价的方法union()Ck_item = list_Lksub1[i] | list_Lksub1[j]#判断是否满足函数is_apriori,如果满足则将得到的一个个k阶候选项集添加到集合Ck中if is_apriori(Ck_item, Lksub1):Ck.add(Ck_item)#返回所得到的k阶候选大项集return Ck'''
generate_Lk_by_Ck:根据所传入的交易数据data_set,Ck是我们在函数create_C1所产生的候选项集min_support、support_data分别是最小支持数和所用来记录频繁项集的支持数定义的字典这个函数主要是通过所传入的参数,由一阶候选项集产生一阶频繁项集并返回
'''
def generate_Lk_by_Ck(data_set, Ck, min_support, support_data):"""Generate Lk by executing a delete policy from Ck.Args:data_set: A list of transactions. Each transaction contains several items.Ck: A set which contains all all frequent candidate k-itemsets.min_support: The minimum support.support_data: A dictionary. The key is frequent itemset and the value is support.Returns:Lk: A set which contains all all frequent k-itemsets."""#定义一个空集合LK用来存放所产生的频繁项集Lk = set()#定义一个空字典item_count来存放所产生的候选项集的支持数item_count = {}#对整个事务数据库进行扫描t = ['l1', 'l2', 'l5']for t in data_set:#针对候选项集Ck进行扫描 item = 'l1',item = l2,item = l3...等for item in Ck:#判断候选项集Ck中的item是否存在于事务数据库的一项事务中的一个子集if item.issubset(t):#判断它是否已经存在字典item_count中if item not in item_count:#如果不存在字典中,则表示它是第一次出现在字典中,它相应的value为1item_count[item] = 1else:#否则它相应value就加1,item_count[item] += 1#t_num表示的是整个事务数据库中总共有几项事务t_num = float(len(data_set))#扫描所得到的字典中的数据for item in item_count:'''item_count[item] / t_num表示的是对应item所对应的支持度判断所得到的的item的支持度是否大于最小支持度,'''if (item_count[item] / t_num) >= min_support:#如果item的支持度大于最小支持度,那么就把它加到集合Lk当中Lk.add(item)#并且将item和对应的item的支持度加入到support_data字典中#support_data中的key为对应的item,value为item中对应最小支持度support_data[item] = item_count[item] / t_num#将所得到的频繁项集加入到集合Lk中return Lkdef generate_L(data_set, k, min_support):"""Generate all frequent itemsets.Args:data_set: A list of transactions. Each transaction contains several items.k: Maximum number of items for all frequent itemsets.min_support: The minimum support.Returns:L: The list of Lk.support_data: A dictionary. The key is frequent itemset and the value is support."""#定义一个空字典,用来记录频繁项集的支持数,key为各自的频繁项集,value为各自频繁项集的支持数support_data = {}#调用函数create_C1传入数据集data_set并赋值给C1C1 = create_C1(data_set)'''由C1得到的一阶候选项集产生一阶频繁项集然后调用函数generate_Lk_by_Ck产生一阶频繁项集,函数所传入的参数分别有:1.data_set:所传入的数据集2.C1:由函数create_C1所产生的一阶候选项集3.min_support、support_data分别是最小支持数和所用来记录频繁项集的支持数定义的字典然后调用函数generate_Lk_by_Ck'''#将函数generate_Lk_by_Ck所得到的频繁项集赋值给L1L1 = generate_Lk_by_Ck(data_set, C1, min_support, support_data)#对频繁项集L1进行复制到 Lksub1Lksub1 = L1.copy()#定义一个空的列表L用来存放所产生的频繁项集L = []#将Lksub1加入到列表L中,一阶频繁项集集合作为列表L中的一个元素L.append(Lksub1)for i in range(2, k+1):#上面我们得到了一阶频繁项集并作为列表L一个元素并加到了列表L中#接下来将依次扫描事务数据库中的数据利用函数create_Ck使得Lk-1阶频繁项集自连接得到K阶候选项集Ci,Ci = create_Ck(Lksub1, i)#将得到的2到k阶的候选项集利用函数generate_Lk_by_Ck依次产生2到k阶的频繁项集LiLi = generate_Lk_by_Ck(data_set, Ci, min_support, support_data)#对频繁项集Li进行复制到 LksubiLksub1 = Li.copy()#将Lksubi加入到列表L中,i阶频繁项集集合作为列表L中的一个元素L.append(Lksub1)#将所得到的K阶频繁项集所组成的列表L和存放元素item和item对应的支持数的字典support_data进行返回return L, support_data'''
将由函数generate_L产生的K阶频繁项集所组成的列表L和存放元素item和item对应的支持数的字典support_data
的数据利用函数generate_big_rules计算他们之间的强关联规则
'''
def generate_big_rules(L, support_data, min_conf):"""Generate big rules from frequent itemsets.Args:L: The list of Lk.得到的K阶频繁项集所组成的列表Lsupport_data: A dictionary. The key is frequent itemset and the value is support.存放元素item和item对应的支持数的字典support_datamin_conf: Minimal confidence.最小置信度Returns:big_rule_list: A list which contains all big rules. Each big rule is representedas a 3-tuple.强关联规则所产生的的列表big_rule_list"""#定义空列表big_rule_list用来存放所产生的强关联规则数据big_rule_list = []#定义空列表sub_set_list用来存放频繁项集sub_set_list = []#扫描所得到的K阶频繁项集所组成的列表L,这里分别是1阶、2阶、3阶频繁项集三个元素(三个集合)#针对列表L中的每一个集合,这里的i从0-len(L)for i in range(0, len(L)):#针对列表L中的每一个集合freq_setfor freq_set in L[i]:#第一轮循环加入一阶频繁项集到sub_set_list列表中,#第二轮循环就利用二阶频繁项集和sub_set_list里面的一阶频繁项集产生关联规则for sub_set in sub_set_list:#issubset() 方法用于判断集合的所有元素是否都包含在指定集合中,是返回True,否则返回False;#判断集合sub_set是否为集合freq_set的子集if sub_set.issubset(freq_set):#计算集合freq_set=>freq_set-sub_set的置信度赋值给confconf = support_data[freq_set] / support_data[freq_set - sub_set]big_rule = (freq_set - sub_set, sub_set, conf)#判断列表中所生成的强关联规则列表big_rule_list中没有所产生关联规则的big_rule这一条数据#并且这一组数据的置信度大于最小置信度;if conf >= min_conf and big_rule not in big_rule_list:# print freq_set-sub_set, " => ", sub_set, "conf: ", conf#满足上述条件就将其作为一组强关联规则的数据加入到big_rule_listbig_rule_list.append(big_rule)sub_set_list.append(freq_set)#返回强关联规则所产生的的列表big_rule_listreturn big_rule_list#主函数
if __name__ == "__main__":"""Test"""#把load_data_set()函数得到的列表集合赋值给data_set这个变量data_set = load_data_set()'''调用generate_L函数生成L阶的频繁项generate_L函数有两个返回值,分别是:1.L:存放由事物数据库所有产生的频繁项集2.support_data:generate_L函数中所定义的一个字典,用来记录项集的支持度generate_L函数有三个参数,分别是:1.data_set表示所使用的数据集<所传入的交易数据库>2.k表示由数据集data_set所能产生的数据集的阶数3.min_support表示的是数据集的最小支持度的阈值'''L, support_data = generate_L(data_set, k=3, min_support=0.06)'''将由函数generate_L产生的K阶频繁项集所组成的列表L和存放元素item和item对应的支持数的字典support_data的数据利用函数generate_big_rules得到他们之间的强关联规则存入big_rules_list'''big_rules_list = generate_big_rules(L, support_data, min_conf=0.2)#针对列表L中的各个集合Lk,打印输出所得到的频繁项集Lfor Lk in L:print( "="*50)#str(len(list(Lk)[0]))表示列表L中各个集合Lk中的几阶元素并将其转换为字符串类型print( "frequent " + str(len(list(Lk)[0])) + "-itemsets\t\tsupport")print ("="*50)for freq_set in Lk:#分别打印输出str(len(list(Lk)[0]))阶元素freq_set以及他所对应的支持度print( freq_set, support_data[freq_set])print()print( "Big Rules")#针对所得到的强关联规则的各个集合的映射关系for item in big_rules_list:#打印输出所满足的强关联规则中各个集合之间的映射关系以及他们之间的置信度priAAAAnt( item[0], "=>", item[1], "conf: ", item[2])

Apriori 算法分析相关推荐

  1. Python使用Apriori算法分析导演请某演员后还会请哪个演员

    前导课程: Python使用Apriori算法查找关系密切的演员组合 技术要点: 1)根据演员关系以及常见组合,分析某导演请了某个演员之后还可能会请哪个演员参演. 可以继续的工作: 多级关联规则,例如 ...

  2. apriori算法分析 购物篮分析

    import pandas as pd from apyori import apriori import matplotlib.pyplot as plt# 读取[StationeryOrder.c ...

  3. Python+Pandas读取Excel文件分析关系最好的两个演员

    董老师又双叒叕送书啦,6本<Python程序设计基础与应用(第2版)> 推荐图书: <Python程序设计(第3版)>,(ISBN:978-7-302-55083-9),董付国 ...

  4. Python+pandas读取Excel文件统计最受欢迎的前3位演员

    推荐教材:<Python程序设计基础与应用>(ISBN:9787111606178),董付国,机械工业出版社,2018.8出版,2021.3第11次印刷 图书详情: 配套资源: 用书教师可 ...

  5. 大数据常见的处理方法有哪些

    对于的处理任务,通常采用抽样策略.抽样的过程中应当分析抽样的规模,以及如何抽样才能实现类似于原数据的分布.常用的数据处理方法如下: 1)聚类分析:按照数据对象的相似度,把数据对象划分聚集簇,簇内对象尽 ...

  6. python编程入门与案例详解-quot;Python小屋”免费资源汇总(截至2018年11月28日)...

    原标题:"Python小屋"免费资源汇总(截至2018年11月28日) 为方便广大Python爱好者查阅和学习,特整理汇总微信公众号"Python小屋"开通29 ...

  7. “Python小屋”免费资源汇总(截至2018年11月28日)

    为方便广大Python爱好者查阅和学习,特整理汇总微信公众号"Python小屋"开通29个月以来推送过的700多篇文章清单,如果需要本清单的电子版,可以在公众号后台发送消息&quo ...

  8. 经典数据挖掘算法(介绍了包括18大数据挖掘在内的多种经典数据挖掘算法)

    前言 文章标题的两个概念也许对于许多同学们来说都相对比较陌生,都比较偏向于于理论方面的知识,但是这个算法非常的强大,在很多方面都会存在他的影子.2个概念,1个维特比算法,1个隐马尔可夫模型.你很难想象 ...

  9. R语言--数据挖掘3---关联规则分析

    文章目录 关联规则分析 数据介绍 基本原理介绍 基本概念: Apriori算法 有意义的关联规则 案例分析 总结反思 学习其他同学的代码 参考 代码 关联规则分析 本次报告主要包括以下内容: 数据介绍 ...

最新文章

  1. php图片美颜,Mac_Mac如何使用Photo Booth拍摄照片拍摄好玩好看的相片,  我们经常会使用美颜相机 - phpStudy...
  2. 领域驱动设计 敏捷_反馈失败:发现敏捷数据驱动的致命弱点的风险
  3. python分析基金数据,[Python数据分析]numpy基金会,基础
  4. hbase scan超时设置_如何在优化生产环境的hbase
  5. AWS — AWS EC2
  6. KVM 虚拟化原理探究--启动过程及各部分虚拟化原理
  7. mysql 替换 多个逗号_如何使用mySQL replace()替换多个记录中的字符串?
  8. 矩阵快速幂求大斐波那契poj3070(java)
  9. 【原创】PostgreSQL 增量备份详解以及相关示例
  10. linux串口boost,Boost串口通信第一课 boost::asio::serial_port基本使用
  11. 计算机内存知识txt,计算机内存基础知识专题
  12. 应用程序委托和新的单例(译)
  13. error while loading shared libraries: libxx.so: cannot open shared object file: No such file
  14. 地址总线、数据总线、控制总线详解
  15. java解压文件 文件过大,Java压缩/解压缩大文件( 1gb)
  16. R语言Error in model.frame.default(formula = y ~ ., data = exam.data, drop.unused.levels = TRUE) :
  17. 迁移过程中出现报错:无法解析的成员访问表达式[USERENV]
  18. C++学习系列(三)—— 泛型编程(STL)
  19. 似然函数与贝叶斯公式
  20. AP6255蓝牙语音功能的实现

热门文章

  1. 08-微服务版单点登陆系统(SSO)实践
  2. 再探https与重放攻击
  3. oracle sqlnet配置,sqlnet.ora文件配置详解
  4. net.sf.ezmorph.bean.MorphDynaBean cannot be cast to
  5. 区块链技术运用在票据领域-票据链
  6. 数据仓库项目需求分析
  7. STP生成树协议|适合初学|华为,思科配置|阿树啊~
  8. C#检索局域网内主机的IP、MAC地址
  9. 远程桌面无法连接远程计算机是什么原因?
  10. 进入BeOS的花花世界 系列三