Apriori 算法-如何进行关联规则挖掘

摘要:
Apriori算法是一种发掘事物内在关联关系的算法,它可以加快关联分析的速度,从而让我们更有效的进行关联分析。Apriori原理是说:如果一个项集是非频繁集,那么它的所有超集也是非频繁的。Apriori算法用于加快关联分析的速度,但它也需要多次扫描数据集。其实除了Apriori算法,还有其它算法也可以加快寻找频繁项集的速度。2000年提出的FP-Growth算法,对Apriori算

公号:码农充电站pro
主页:https://codeshellme.github.io

在数据分析领域有一个经典的故事,叫做“尿布与啤酒”。

据说,在美国西部的一家连锁超市发现,很多男人会在周四购买尿布和啤酒。这样超市就可以将尿布与啤酒放在一起卖,便可以增加销售量。

“尿布与啤酒”这个案例就属于数据分析中的关联分析,也就是分析数据集中的内在隐含关系。

关联分析可以被用于发掘商品与商品之间的内在关联关系,进而通过商品捆绑销售或者相互推荐,来增加商品销量。

关联分析除了可以用于零售行业外,还可以用于网站流量分析医药行业等。

Apriori 算法是一种发掘事物内在关联关系的算法,它可以加快关联分析的速度,从而让我们更有效的进行关联分析。

1,关联分析

关联分析用于发掘大规模数据集中的内在关系。

关联分析一般要分析数据集中的频繁项集(frequent item sets)和关联规则(association rules):

  • 频繁项集:是数据集中频繁项的集合,集合中可以有一项或多项物品。
  • 关联规则:暗示了两种物品之间可能存在很强的内在关系。

假设,我们收集了一家商店的交易清单:

交易编号购物清单
1牛奶,面包
2牛奶,面包,火腿
3面包,火腿,可乐
4火腿,可乐,方便面
5面包,火腿,可乐,方便面

频繁项集是一些经常出现在一起的物品集合。比如:{牛奶,面包}{火腿,方便面,可乐}都是频繁项集的例子。

项集中的物品,一般不考虑顺序关系。

关联规则意味着有人买了一种物品,还会买另一种物品。比如方便面->火腿,就是一种关联规则,表示如果买了方便面,还会买火腿。

2,三个重要概念

关联分析中有三个重要的概念,分别是:

  • 支持度
  • 可信度 / 置信度
  • 提升度

支持度

要进行关联分析,首先要寻找频繁项,也就是频繁出现的物品集。那么怎样才叫频繁呢?我们可以用支持度来衡量频繁。

支持度是针对项集来说的,一个项集的支持度就是该项集的记录占总记录的比例。通常可以定义一个最小支持度,从而只保留满足最小支持度的项集。

一个项集{A} 的支持度的定义如下:

在这里插入图片描述

比如,在上面表格中的5 项记录中,{牛奶} 出现在了两条记录中,所以{牛奶} 的支持度为 2/5;而{面包,火腿} 出现在了三条记录中,所以{面包,火腿}的支持度为3/5

可信度

可信度又叫置信度,它是针对关联规则来说的,比如{火腿}->{可乐}

一个关联规则{A}->{B} 表示,如果购买了物品A,会有多大的概率购买物品B?它的可信度的定义如下:

在这里插入图片描述

所以,在上面的表格中,{火腿,可乐} 的支持度是 3/5{火腿} 的支持度是 4/5,所以{可乐}->{火腿} 的可信度为 3/5 除以 4/5,等于 0.75。这意味着,如果购买了火腿,有 75% 的可能性会购买可乐。

提升度

提升度也是针对关联规则来说的,它表示的是“如果购买物品A,会对购买物品B 的概率提升多少”。

一个关联规则{A}->{B} 的提升度的定义如下:

在这里插入图片描述

提升度会有三种情况:

  • 提升度{A}->{B} > 1:表示购买物品A 对购买物品B 的概率有提升。
  • 提升度{A}->{B} = 1:表示购买物品A 对购买物品B 的概率没有提升,也没有下降。
  • 提升度{A}->{B} < 1:表示购买物品A 对购买物品B 的概率有下降。

3,如何寻找频繁项

寻找频繁项的一个简单粗暴的方法是,对所有的物品进行排列组合,然后计算所有组合的支持度,这种算法也可以叫做穷举法

穷举法

穷举法就是列出所有物品的组合,然后计算每种组合的支持度。

比如,我们有一个物品集{0,1,2,3},其中有四个物品,那么所有的物品组合如下:

在这里插入图片描述

从图中可以看到一共有15 种组合,计算每一种组合的支持度都需要遍历一遍所有的记录,检查每个记录中是否包含该组合。因此有多少种组合,就需要遍历多少遍记录,时间复杂度则会很大。

可以总结出:包含N 种物品的数据集,共有 2N - 1 种组合。为了计算每种组合的支持度,则需要遍历 2N - 1 次记录。

如果一个商店中有100 款商品,将会有1.26*1030 种组合,这是一个非常庞大的数字。而普通商店一般都会有成千上万的商品,那么组合数将大到无法计算。

4,Apriori 算法

为了降低计算所需的时间,1994 年 Agrawal 提出了著名的 Apriori 算法,该算法可以有效减少需要计算的组合的数量,避免组合数量的指数增长,从而在合理的时间内计算出频繁项集。

Apriori 原理是说:如果一个项集是非频繁集,那么它的所有超集也是非频繁的

比如下图中的项集{1,3} 是非频繁集,那么{0,1,3}{1,2,3}{0,1,2,3} 就都是非频繁项集。这就大大减少了需要计算的项集的数量。

在这里插入图片描述

5,Apriori 算法的实现

这里,我们使用Apriori 算法来寻找上文表格中的购物清单的频繁项集(为了方便查看,我把表格放在这里)。

交易编号购物清单
1牛奶,面包
2牛奶,面包,火腿
3面包,火腿,可乐
4火腿,可乐,方便面
5面包,火腿,可乐,方便面

efficient_apriori 模块

Efficient-Apriori 包是Apriori 算法的稳定高效的实现,该模块适用于 Python 3.6+

使用Apriori 算法要先安装:pip install efficient-apriori

efficient_apriori 包中有一个 apriori 函数,原型如下(这里只列出了常用参数):

apriori(data, 
  min_support = 0.5, 
  min_confidence = 0.5)

参数的含义:

  • data:表示数据集,是一个列表。列表中的元素可以是元组,也可以是列表。
  • min_support:表示最小支持度,小于最小支持度的项集将被舍去。
    • 该参数的取值范围是 [0, 1],表示一个百分比,比如0.3 表示30%,那么支持度小于30% 的项集将被舍去。
    • 该参数的默认值为0.5,常见的取值有0.5,0.1,0.05
  • min_confidence:表示最小可信度。
    • 该参数的取值范围也是 [0, 1]
    • 该参数的默认值为0.5,常见的取值有1.0,0.9,0.8

使用 apriori 函数

首先,将表格中的购物清单转化成 Python 列表,如下:

data = [
    ('牛奶', '面包'), 
    ('牛奶', '面包', '火腿'),
    ('面包', '火腿', '可乐'),
    ('火腿', '可乐', '方便面'),
    ('面包', '火腿', '可乐', '方便面')
]

挖掘频繁项集和频繁规则:

# 该函数的使用很简单,就一行代码
# 最小支持度为 0.5
# 最小可信度为 1
itemsets, rules = apriori(data, min_support=0.5,  min_confidence=1)

查看频繁项集和频繁规则:

>>> itemsets # 频繁项集
{1: { # 只有一个元素的项集
    ('面包',): 4, # 4 表示记录数
    ('火腿',): 4, 
    ('可乐',): 3
    }, 
 2: { # 有两个元素的项集
    ('火腿', '面包'): 3, 
    ('可乐', '火腿'): 3
    }
}
>>> rules # 频繁规则
[{可乐} -> {火腿}]

6,总结

本篇文章主要介绍了什么是关联分析,关联分析中三个重要的概念,以及 Apriori 算法。

Apriori 算法用于加快关联分析的速度,但它也需要多次扫描数据集。其实除了Apriori 算法,还有其它算法也可以加快寻找频繁项集的速度。

2000 年提出的FP-Growth 算法,对 Apriori 算法进行了改进。FP-Growth 通过创建一棵 FP树来存储频繁项集。对不满足最小支持度的项不会创建节点,减少了存储空间。而且整个生成过程只遍历数据集 2 次,大大减少了计算量。

另外,还有CBA 算法,GSP 算法等,都对Apriori算法进行了改进,这里不再详细介绍。

(本节完。)


推荐阅读:

数据变换-归一化与标准化

如何使用Python 进行数据可视化

KNN 算法-实战篇-如何识别手写数字

K 均值算法-如何让数据自动分组

PageRank 算法-Google 如何给网页排名


欢迎关注作者公众号,获取更多技术干货。

码农充电站pro

免责声明:文章转载自《Apriori 算法-如何进行关联规则挖掘》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Rancher 2.4实现零宕机升级集群,无需担心组件出现短暂故障!java:线上问题排查常用手段(转)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

代价敏感学习初探

1. 代价敏感学习简介 0x1:如何将业务场景中对FP和FN损失的不同接受程度,调整我们的损失函数 1. 什么场景下需要代码敏感学习 在很多真实业务场景中,包括笔者所在的网络安全领域,误报造成的损失常常比漏报来的要大,原因很简单,如果一个IDS系统每天都在产生大量虚警,那么对事件响应处理人员的压力就会非常大,时间久了,大家对IDS的信任度就会下降,同时真实...

NetworkX系列教程(10)-算法之四:拓扑排序与最大流问题

小书匠Graph图论 重头戏部分来了,写到这里我感觉得仔细认真点了,可能在NetworkX中,实现某些算法就一句话的事,但是这个算法是做什么的,用在什么地方,原理是怎么样的,不清除,所以,我决定先把图论中常用算法弄个明白在写这部分. 图论常用算法看我的博客: 下面我将使用NetworkX实现上面的算法,建议不清楚的部分打开两篇博客对照理解. 我将图论...

ICP算法使用遇到的问题

这几天在学习数据关联的方法,本来想使用ICP算法进行距离测距数据的配准,但是用的过程中出现问题,配的不准,而且偏差更大了。 红色的和黄色的2维激光点进行ICP配准,但将变换矩阵和黄色进行乘之后偏差更大了。怀疑是因为两个点集只有部分数据重合,而ICP算法最好是点能一一对应。 之后使用PCL进行点集匹配测试,出现同样的问题。 于是我自己构造了一个数据,将A...

干货|蚁群算法求解带时间窗的车辆路径规划问题(附Java代码及详细注解)

CSDN的朋友们,大 家 好 呀 ! 我是微信公众号【程序猿声】的小编,来到CSDN与各位交流学习。我们的公众号由华中科技大学管理学院管理科学与工程专业的学生自发组建,分享运筹优化算法和一些新奇有趣的计算机方面内容。我们注重干货分享,自行编写大量代码供大家学习交流,涉及各类运筹学相关的启发式、精确式算法,解决相关的TSP、VRP等问题。 今天小编带大家了解...

sql反模式分析1

第二章:乱穿马路 2.1 目标:存储多值属性 2.2 反模式:格式化的逗号分隔列表 模糊匹配无法使用索引,影响性能;多表关联麻烦,却极大影响性能;执行聚合查询不方便开发和调试;更新某个字段值必须执行两次;字段内容出错数据很难恢复修正;选择一个用不用到的分隔符,无法确认不适用;列表长度限制; 2.3 解决方案:创建一张交叉表,实现两张表的多对多的关联 第三...

Python实现 灰色关联分析 与结果可视化

之前在比赛的时候需要用Python实现灰色关联分析,从网上搜了下只有实现两个列之间的,于是我把它改写成了直接想Pandas中的计算工具直接计算person系数那样的形式,可以对整个矩阵进行运算,并给出了可视化效果,效果请见实现 灰色关联分析法 对于两个系统之间的因素,其随时间或不同对象而变化的关联性大小的量度,称为关联度。在系统发展过程中,若两个因素变化的...