Apriori关联规则算法实现及其原理(基础篇)
概念
定义一:设I={i1,i2,…,im},是m个不同的项目的集合,每个ik称为一个项目。项目的集合I称为项集。其元素的个数称为项集的长度,长度为k的项集称为k-项集。引例中每个商品就是一个项目,项集为I={bread, beer, cake,cream, milk, tea},I的长度为6。
定义二:每笔交易T是项集I的一个子集。对应每一个交易有一个唯一标识交易号,记作TID。交易全体构成了交易数据库D,|D|等于D中交易的个数。引例中包含10笔交易,因此|D|=10。
定义三:对于项集X,设定count(X⊆T)为交易集D中包含X的交易的数量,则项集X的支持度为:
support(X)=count(X⊆T)/|D|
引例中X={bread, milk}出现在T1,T2,T5,T9和T10中,所以支持度为0.5。
定义四:最小支持度是项集的最小支持阀值,记为SUPmin,代表了用户关心的关联规则的最低重要性。支持度不小于SUPmin 的项集称为频繁集,长度为k的频繁集称为k-频繁集。如果设定SUPmin为0.3,引例中{bread, milk}的支持度是0.5,所以是2-频繁集。
定义五:关联规则是一个蕴含式:
R:X⇒Y
其中X⊂I,Y⊂I,并且X∩Y=⌀。表示项集X在某一交易中出现,则导致Y以某一概率也会出现。用户关心的关联规则,可以用两个标准来衡量:支持度和可信度。
定义六:关联规则R的支持度是交易集同时包含X和Y的交易数与|D|之比。即:
support(X⇒Y)=count(X⋃Y)/|D|
支持度反映了X、Y同时出现的概率。关联规则的支持度等于频繁集的支持度。
定义七:对于关联规则R,可信度是指包含X和Y的交易数与包含X的交易数之比。即:
confidence(X⇒Y)=support(X⇒Y)/support(X)
可信度反映了如果交易中包含X,则交易包含Y的概率。一般来说,只有支持度和可信度较高的关联规则才是用户感兴趣的。
定义八:设定关联规则的最小支持度和最小可信度为SUPmin和CONFmin。规则R的支持度和可信度均不小于SUPmin和CONFmin ,则称为强关联规则。关联规则挖掘的目的就是找出强关联规则,从而指导商家的决策。
这八个定义包含了关联规则相关的几个重要基本概念,关联规则挖掘主要有两个问题:
找出交易数据库中所有大于或等于用户指定的最小支持度的频繁项集。
利用频繁项集生成所需要的关联规则,根据用户设定的最小可信度筛选出强关联规则。
目前研究人员主要针对第一个问题进行研究,找出频繁集是比较困难的,而有了频繁集再生成强关联规则就相对容易了。
理论基础
首先来看一个频繁集的性质。
定理:如果项目集X是频繁集,那么它的非空子集都是频繁集。
根据定理,已知一个k-频繁集的项集X,X的所有k-1阶子集都肯定是频繁集,也就肯定可以找到两个k-1频繁集的项集,它们只有一项不同,且连接后等于X。这证明了通过连接k-1频繁集产生的k-候选集覆盖了k-频繁集。同时,如果k-候选集中的项集Y,包含有某个k-1阶子集不属于k-1频繁集,那么Y就不可能是频繁集,应该从候选集中裁剪掉。Apriori算法就是利用了频繁集的这个性质。
算法实现过程
代码实现
def local_data(file_path):import pandas as pddt = pd.read_excel(file_path)data = dt['con']locdata = []for i in data:locdata.append(str(i).split(","))# print(locdata) # change to [[1,2,3],[1,2,3]]length = []for i in locdata:length.append(len(i)) # 计算长度并存储# print(length)ki = length[length.index(max(length))]# print(length[length.index(max(length))]) # length.index(max(length)读取最大值的位置,然后再定位取出最大值return locdata,kidef 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"""C1 = set()for t in data_set:for item in t:item_set = frozenset([item])C1.add(item_set)return C1def 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."""for item in Ck_item:sub_Ck = Ck_item - frozenset([item])if sub_Ck not in Lksub1:return Falsereturn Truedef 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 = set()len_Lksub1 = len(Lksub1)list_Lksub1 = list(Lksub1)for i in range(len_Lksub1):for j in range(1, len_Lksub1):l1 = list(list_Lksub1[i])l2 = list(list_Lksub1[j])l1.sort()l2.sort()if l1[0:k-2] == l2[0:k-2]:Ck_item = list_Lksub1[i] | list_Lksub1[j]# pruningif is_apriori(Ck_item, Lksub1):Ck.add(Ck_item)return Ckdef 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 = set()item_count = {}for t in data_set:for item in Ck:if item.issubset(t):if item not in item_count:item_count[item] = 1else:item_count[item] += 1t_num = float(len(data_set))for item in item_count:if (item_count[item] / t_num) >= min_support:Lk.add(item)support_data[item] = item_count[item] / t_numreturn 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."""support_data = {}C1 = create_C1(data_set)L1 = generate_Lk_by_Ck(data_set, C1, min_support, support_data)Lksub1 = L1.copy()L = []L.append(Lksub1)for i in range(2, k+1):Ci = create_Ck(Lksub1, i)Li = generate_Lk_by_Ck(data_set, Ci, min_support, support_data)Lksub1 = Li.copy()L.append(Lksub1)return L, support_datadef generate_big_rules(L, support_data, min_conf):"""Generate big rules from frequent itemsets.Args:L: The list of Lk.support_data: A dictionary. The key is frequent itemset and the value is support.min_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 = []sub_set_list = []for i in range(0, len(L)):for freq_set in L[i]:for sub_set in sub_set_list:if sub_set.issubset(freq_set):conf = support_data[freq_set] / support_data[freq_set - sub_set]big_rule = (freq_set - sub_set, sub_set, conf)if conf >= min_conf and big_rule not in big_rule_list:# print freq_set-sub_set, " => ", sub_set, "conf: ", confbig_rule_list.append(big_rule)sub_set_list.append(freq_set)return big_rule_listif __name__ == "__main__":"""Test"""file_path = "test_aa.xlsx"data_set,k = local_data(file_path)L, support_data = generate_L(data_set, k, min_support=0.2)big_rules_list = generate_big_rules(L, support_data, min_conf=0.4)print(L)for Lk in L:if len(list(Lk)) == 0:breakprint("="*50)print("frequent " + str(len(list(Lk)[0])) + "-itemsets\t\tsupport")print("="*50)for freq_set in Lk:print(freq_set, support_data[freq_set])print()print("Big Rules")for item in big_rules_list:print(item[0], "=>", item[1], "conf: ", item[2])
本文原博客链接
https://www.cnblogs.com/shizhenqiang/p/8251213.html
Apriori关联规则算法实现及其原理(基础篇)相关推荐
- 使用Apriori关联规则算法实现购物篮分析
Apriori算法是一种挖掘关联规则的频繁项集算法,其核心思想是通过候选集生成和情节的向下封闭检测两个阶段来挖掘频繁项集,而且算法已经被广泛的应用到商业,网络安全等各个领域. 购物篮分析是通过发视频顾 ...
- CAS原理 基础篇(漫画版)
注:本文转自 程序员小灰 微信公众号~ CAS基础篇 示例程序: 启动两个线程,每个线程中让静态变量count循环累加100次. 最终输出的count结果是什么呢?一定会是200吗? 加了同步锁之后, ...
- 利用python实现Apriori关联规则算法
关联规则 大家可能听说过用于宣传数据挖掘的一个案例:啤酒和尿布:据说是沃尔玛超市在分析顾客的购买记录时,发现许多客户购买啤酒的同时也会购买婴儿尿布,于是超市调整了啤酒和尿布的货架摆放,让这两个品类摆放 ...
- Apriori关联规则算法
关联规则算法中的几个重要概念:置信度.支持度.提升度. 例子: 支持度: 支持度是一个百分比,指某个商品组合出现的次数与总次数之间的比例,支持度越高表示该组合出现的几率越大. 在上面图中我们可以发现& ...
- apriori算法代码_sklearn(九)apriori 关联规则算法,以及FP-growth 算法
是什么: apriori算法是第一个关联规则挖掘算法,利用逐层搜索的迭代方法找出数据库中的项集(项的集合)的关系,以形成规则,其过程由连接(类矩阵运算)与剪枝(去掉没必要的中间结果)组成.是一种挖掘关 ...
- python apriori算法 sklearn_sklearn(九)apriori 关联规则算法,以及FP-growth 算法
是什么: apriori算法是第一个关联规则挖掘算法,利用逐层搜索的迭代方法找出数据库中的项集(项的集合)的关系,以形成规则,其过程由连接(类矩阵运算)与剪枝(去掉没必要的中间结果)组成.是一种挖掘关 ...
- Apriori 关联规则算法
通过Apriori算法,我们可以对数据进行关联分析,能够在大量的数据中找出数据间有趣的关系.那这个关系怎么找呢.一是根据支持度找出频繁项集,二是根据置信度产生关联规则.频繁项集指在物品经常一起出现的. ...
- 数据结构与算法之美笔记——基础篇(下):图、字符串匹配算法(BF 算法和 RK 算法、BM 算法和 KMP 算法 、Trie 树和 AC 自动机)
图 如何存储微博.微信等社交网络中的好友关系?图.实际上,涉及图的算法有很多,也非常复杂,比如图的搜索.最短路径.最小生成树.二分图等等.我们今天聚焦在图存储这一方面,后面会分好几节来依次讲解图相关的 ...
- 数据结构与算法之美笔记——基础篇(中):树,二叉树,二叉查找树,平衡二叉查找树,红黑树,递归树,堆
树: A 节点就是 B 节点的父节点,B 节点是 A 节点的子节点.B.C.D 这三个节点的父节点是同一个节点,所以它们之间互称为兄弟节点.我们把没有父节点的节点叫作根节点,也就是图中的节点 E.我们 ...
最新文章
- 全局变量用常量初始化----C和C++的不同
- asp连接mysql字符串_asp连接数据库字符串
- 删除数据表和清空数据表的内容(保存表结构)的SHELL脚本
- 微型计算机2020年7月下,2020年年7月全国高等教育自学考试微型计算机原理与接口技术试题.docx...
- [html] HTML5如何监听video的全屏和退出全屏?
- android屏幕适配流程,Android屏幕适配姿势
- 30岁过后,是继续上班,还是去做个小生意?
- SpringBoot学习总结(个人笔记)
- MySQL为啥不用平衡二叉树_MySQL的索引,为什么是B+而不是平衡二叉树
- 在blog中放置北京奥运倒计时Flash
- 形式语言与自动机总结
- java操作word(一)
- uboot启动之BL1阶段的分析1
- wps表格粗线和细线区别_wps论文三线表的粗线是多少
- 教师资格证小学计算机面试题库,小学教师资格证面试题库.docx
- js字符串 new String()、String和String()之间的深度剖析
- 超火动态可视化条形图,绘制起来这么简单!
- 强制history不记住敏感命令的方法
- html备忘录时间提醒,jQuery简单带备忘录功能的日期选择器插件
- 未能加载文件或程序集Noesis.Javascript.DLL或它的某一个依赖项。找不到指定的模块。
热门文章
- 作者:夏帆(1988-),男,华东师范大学计算机科学与软件工程学院博士后。...
- 你知道考的是平方数吗(记洛谷P1876题RE+WA的经历,Java语言描述)
- 理解Spring框架中Bean的作用域
- SpringBoot :cannot be cast to org.springframework.web.accept.ContentNegotiationManager
- MugLife app是一款可以将静态照片变成3D动画的手机应用
- nodjes 支付宝接口 - 优惠卷
- asp教程七:包含文件
- Nginx伪静态配置和常用Rewrite伪静态规则集锦
- mysql经典主从复制
- DM***+OSPF测试