啤酒和尿布:一文看懂关联规则
啤酒和尿布:一文看懂关联规则
- 一、关联规则
- 二、Apriori算法
- 2.1 相关概念
- 2.2 实现步骤
- 2.3 代码实现
谈到大数据在零售业的应用,不得不提到一个经典的营销案例–啤酒和尿布的故事,有个有趣的现象——啤酒和尿布赫然摆放在一起出售,但是,这个奇怪的举措却使啤酒和尿布的销量双双增加了。这是发生在美国沃尔玛超市的真实案例,并一直为商家所津津乐道。
为人们所知的是因为男人去超市买尿布时顺手买了啤酒,所以啤酒和尿布销量增加,那么从数据和算法层面分析,大家知道为什么啤酒和尿布放在一起销量会增加吗。
一、关联规则
站在啤酒和尿布故事后面的是关联规则算法,进行关联性分析是涉及到三个指标:
1.支持度(Support)
支持度表示项集{X,Y}在总项集里出现的概率。表示A和B同时在总数I中发生的概率\color{#FF0000}{表示A和B同时在总数I 中发生的概率}表示A和B同时在总数I中发生的概率 ,公式为:
Support(X→Y) = P(X,Y) / P(I) = P(X∩Y) / P(I) = num(X∩Y) / num(I)
其中,I表示总事务集。num()表示求事务集里特定项集出现的次数。
2.置信度 (Confidence)
置信度表示在先决条件X发生的情况下,由关联规则”X→Y“推出Y的概率。表示在发生X的项集中,同时会发生Y的可能性,即X和Y同时发生的个数占仅仅X发生个数的比例\color{red}{表示在发生X的项集中,同时会发生Y的可能性,即X和Y同时发生的个数占仅仅X发生个数的比例}表示在发生X的项集中,同时会发生Y的可能性,即X和Y同时发生的个数占仅仅X发生个数的比例,公式为:
Confidence(X→Y) = P(Y|X) = P(X,Y) / P(X) = P(X∩Y) / P(X)
3.提升度(Lift)
提升度表示含有X的条件下,同时含有Y的概率,与只看Y发生的概率之比。提升度反映了关联规则中的X与Y的相关性\color{red}{提升度反映了关联规则中的X与Y的相关性}提升度反映了关联规则中的X与Y的相关性,提升度>1且越高表明正相关性越高,提升度<1且越低表明负相关性越高,提升度=1表明没有相关性,即相互独立。
Lift(X→Y) = P(Y|X) / P(Y)
下面用例子直观的解释一下三个指标:
比如有100个订单I,其中10个订单中有牛奶A,20个订单中有面包B,5个订单即有牛奶又有面包:
Support(A->B) = P(A,B) / P(I) = 5/100 = 0.05;
Confidence(A->B) = P(B/A) = P(A,B) / P(A) = 5/10 = 0.5;
Lift(A->B) = P(B/A) / P(B) = 0.5/0.2 = 2.5;
LIFT>1,表示牛奶面包正相关性;
二、Apriori算法
2.1 相关概念
- 项与项集:设itemset={item1, item_2, …, item_m}是所有项的集合,其中,item_k(k=1,2,…,m)成为项。项的集合称为项集(itemset),包含k个项的项集称为k项集(k-itemset)。
- 事务与事务集:一个事务T是一个项集,它是itemset的一个子集,每个事务均与一个唯一标识符Tid相联系。不同的事务一起组成了事务集D,它构成了关联规则发现的事务数据库。
- 关联规则:关联规则是形如A=>B的蕴涵式,其中A、B均为itemset的子集且均不为空集,而A交B为空。
- 频繁项集(frequent itemset):如果项集I的相对支持度满足事先定义好的最小支持度阈值(即I的出现频度大于相应的最小出现频度(支持度计数)阈值),则I是频繁项集。
强关联规则:满足最小支持度和最小置信度的关联规则,即待挖掘的关联规则。
2.2 实现步骤
一般而言,关联规则的挖掘是一个两步的过程:
比如对于数据集:
[['l1', 'l2', 'l5'],
['l2', 'l4'],
['l2', 'l3'],
['l1', 'l2', 'l4'],
['l1', 'l3'],
['l2', 'l3'],
['l1', 'l3'],
['l1', 'l2', 'l3', 'l5'],
['l1', 'l2', 'l3']]
- 找出所有的频繁项集
遍历数据集,首先找出频繁1项集:[‘l1’]、[‘l2’]、[‘l3’]、[‘l4’]、[‘l5’]
然后找出频繁2项集:[‘l1’,‘l2’]、[‘l1’,‘l3’]、[‘l1’,‘l4’]、[‘l1’,‘l5’]、[‘l2’,‘l3’]、[‘l2’,‘l4’]、[‘l2’,‘l5’]、…、[‘l3’,‘l4’];
找出频繁3项集:[‘l1’, ‘l2’, ‘l5’]、[‘l1’, ‘l2’, ‘l4’]… - 由频繁项集产生强关联规则
把每个频繁项集的支持度和置信度和阈值对比,找出强关联规则。
2.3 代码实现
"""
# Python 2.7
# Filename: apriori.py
# Author: llhthinker
# Email: hangliu56[AT]gmail[DOT]com
# Blog: http://www.cnblogs.com/llhthinker/p/6719779.html
# Date: 2017-04-16
"""def load_data_set():"""Load a sample data set (From Data Mining: Concepts and Techniques, 3th Edition)Returns: A data set: A list of transactions. Each transaction contains several items."""data_set = [['l1', 'l2', 'l5'], ['l2', 'l4'], ['l2', 'l3'],['l1', 'l2', 'l4'], ['l1', 'l3'], ['l2', 'l3'],['l1', 'l3'], ['l1', 'l2', 'l3', 'l5'], ['l1', 'l2', 'l3']]return data_setdef 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"""data_set = load_data_set()L, support_data = generate_L(data_set, k=3, min_support=0.2)big_rules_list = generate_big_rules(L, support_data, min_conf=0.7)for Lk in L:print "="*50print "frequent " + str(len(list(Lk)[0])) + "-itemsets\t\tsupport"print "="*50for freq_set in Lk:print freq_set, support_data[freq_set]printprint "Big Rules"for item in big_rules_list:print item[0], "=>", item[1], "conf: ", item[2]
代码运行结果截图如下:
参考:https://www.cnblogs.com/llhthinker/p/6719779.html
啤酒和尿布:一文看懂关联规则相关推荐
- 一文看懂 AI 训练集、验证集、测试集(附:分割方法+交叉验证)
2019-12-20 20:01:00 数据在人工智能技术里是非常重要的!本篇文章将详细给大家介绍3种数据集:训练集.验证集.测试集. 同时还会介绍如何更合理的讲数据划分为3种数据集.最后给大家介绍一 ...
- 一文看懂计算机视觉-CV(基本原理+2大挑战+8大任务+4个应用)
2020-03-06 20:00:00 计算机视觉(Computer Vision)是人工智能领域的一个重要分支.它的目的是:看懂图片里的内容. 本文将介绍计算机视觉的基本概念.实现原理.8 个任务和 ...
- 一文看懂人脸识别(4个特点+4个实现步骤+5个难点+算法发展轨迹)
2020-03-09 20:01:00 人脸识别是身份识别的一种方式,目的就是要判断图片和视频中人脸的身份时什么. 本文将详细介绍人脸识别的4个特点.4个步骤.5个难点及算法的发展轨迹. 什么是人脸识 ...
- 一文看懂卷积神经网络-CNN(基本原理+独特价值+实际应用)
http://blog.itpub.net/29829936/viewspace-2648775/ 2019-06-25 21:31:18 卷积神经网络 – CNN 最擅长的就是图片的处理.它受到人类 ...
- 【深度学习理论】一文看懂卷积神经网络
[深度学习理论]一文看懂卷积神经网络 https://mp.weixin.qq.com/s/wzpMtMFkVDDH6scVcAdhlA 选自Medium 作者: Pranjal Yadav 经机器之 ...
- python读取excelsheet-一文看懂用Python读取Excel数据
原标题:一文看懂用Python读取Excel数据 导读:现有的Excel分为两种格式:xls(Excel 97-2003)和xlsx(Excel 2007及以上). Python处理Excel文件主要 ...
- 【Python基础】一文看懂 Pandas 中的透视表
作者:来源于读者投稿 出品:Python数据之道 一文看懂 Pandas 中的透视表 透视表在一种功能很强大的图表,用户可以从中读取到很多的信息.利用excel可以生成简单的透视表.本文中讲解的是如何 ...
- angular 字符串转换成数字_一文看懂Python列表、元组和字符串操作
好文推荐,转自CSDN,原作星辰StarDust,感觉写的比自己清晰-大江狗荐语. 序列 序列是具有索引和切片能力的集合. 列表.元组和字符串具有通过索引访问某个具体的值,或通过切片返回一段切片的能力 ...
- 一文看懂深度学习——人工智能系列学习笔记
深度学习有很好的表现,引领了第三次人工智能的浪潮.目前大部分表现优异的应用都用到了深度学习,大红大紫的 AlphaGo 就使用到了深度学习. 本文将详细的给大家介绍深度学习的基本概念.优缺点和主流的几 ...
最新文章
- c++调用python3
- InvocationHandler的invoke方法如何被调用?
- python全排列问题_Python基于回溯法子集树模板解决全排列问题示例
- 【Elasticsearch】Elasticsearch 集群 运维 高性能 架构设计 高负载
- 非常实用的Android Studio快捷键
- Python3.x:定义一个类并且调用
- Excel的Range对象(C#)
- C#调用新浪微博API生成RSS资源文件
- Atiitt 自我学习法流程 1.预先阶段 1.1.目标搜索 资料搜索 1.2. 1.3.通过关联关键词 抽象 等领域 拓展拓宽体系树 1.4. 2.分析整理阶段 2.1.找出重点 压缩要学会
- Session使用方法
- Linux文件管理器默认不显示隐藏文件
- Layui树形表格组件的实现
- 如何让win7在桌面显示ie图标
- js 如何处理缓存?如何清除缓存。
- omnigraffle mac 破解
- scala 自带json_在scala中格式化JSON字符串
- Artemis集群(18)
- pyqt创建窗口没有句柄_史上最强之《Pyqt》写游戏
- python绘制正六边形
- 生活风水系列(更避邪常识)之一
热门文章
- 阿里巴巴一件代发怎么下单
- 计算机瑞士留学经验,瑞士留学生活分享
- java 打开word(docx)替换内容,并插入图片(盖章)
- 第二章 核心动画渲染框架
- CSS3元素闪烁效果
- Axure RP 基于母版实现页面框架/页眉/页脚/导航栏
- 好好说话之IO_FILE利用(1):利用_IO_2_1_stdout泄露libc
- 好用的用户准入控制管理系统
- spring boot项目使用ojdbc8连接oracle 12c(12.2.0.1.0),解决启动极慢问题!
- Win10 Chromedriver安装教程