一、介绍
Apriori算法是一种最有影响的挖掘布尔关联规则频繁项集的算法,它用来找出数据值中频繁出现的数据集合,找出这些集合的模式有助于我们做一些决策。比如在常见的超市购物数据集,或者电商的网购数据集中,如果我们找到了频繁出现的数据集,那么对于超市,我们可以优化产品的位置摆放,对于电商,我们可以优化商品所在的仓库位置,达到节约成本,增加经济效益的目的。
二、Apriori算法思想
1. 基本概念
频繁项集:经常出现在一块的物品的集合
关联规则:暗示两种物品之间可能存在很强的关系
支持度(Support):一个项集的支持度被定义为数据集中包含该项集的记录所占的比例。公式为:支持度 = (包含物品A的记录数量) / (总的记录数量)。
置信度(Confidence):指如果购买物品A,有较大可能购买物品B。公式为:置信度( A -> B) = (包含物品A和B的记录数量) / (包含 A 的记录数量)
提升度(Lift):提升度指当销售一个物品时,另一个物品销售率会增加多少。公式为:提升度( A -> B) = 置信度( A -> B) / (支持度 A)。
2. Apriori算法的基本思想
关联规则挖掘的步骤分两步:1.找所有的频繁项集;2.根据频繁项集生产强关联规则。
频繁项集产生:其目标是发现满足最小支持度阈值的所有项集,这些项集称作频繁项集(frequent itemset)。
规则的产生:其目标是从上一步发现的频繁项集中提取所有高置信度的规则,这些规则称作强规则(strong rule)。
既然都知道了支持度的计算公式,那直接遍历所有组合计算它们的支持度不就可以了吗?是的,没错。确实可以通过遍历所有组合就能找出所有频繁项集。但问题是遍历所有组合花的时间太多,效率太低,假设有N个物品,那么一共需要计算2^N-1次。每增加一个物品,数量级是成指数增长。
通常,频繁项集产生所需的计算开销远大于产生规则所需的计算开销。
而Apriori就是一种找出频繁项集的高效算法。
Apriori定律1:如果一个集合是频繁项集,则它的所有子集都是频繁项集。
Apriori定律2:如果一个集合不是频繁项集,则它的所有超集都不是频繁项集。
Apriori算法的核心是基于两阶段频集思想的递推算法。该关联规则在分类上属于单维、单层、布尔关联规则。
在Apriori算法中,寻找最大项目集(频繁项集)的基本思想是:算法需要对数据集进行多步处理。第一步,简单统计所有含一个元素项目集出现的频数,并找出那些不小于最小支持度的项目集,即一维最大项目集。从第二步开始循环处理直到再没有最大项目集生成。循环过程是:第k步中,根据第k-1步生成的(k-1)维最大项目集产生k维侯选项目集,然后对数据库进行搜索,得到侯选项目集的项集支持度,与最小支持度进行比较,从而找到k维最大项目集。
算法举例:https://www.cnblogs.com/pinard/p/6293298.html
3. Apriori算法流程总结
输入:数据集合D,支持度阈值α
输出:最大的频繁k项集
1)扫描整个数据集,得到所有出现过的数据,作为候选频繁1项集。k=1,频繁0项集为空集。
2)挖掘频繁k项集
a) 扫描数据计算候选频繁k项集的支持度
b) 去除候选频繁k项集中支持度低于阈值的数据集,得到频繁k项集。如果得到的频繁k项集为空,则直接返回频繁k-1项集的集合作为算法结果,算法结束。如果得到的频繁k项集只有一项,则直接返回频繁k项集的集合作为算法结果,算法结束。
c) 基于频繁k项集,连接生成候选频繁k+1项集。
3) 令k=k+1,转入步骤2。
从算法的步骤可以看出,Aprior算法每轮迭代都要扫描数据集,因此在数据集很大,数据种类很多的时候,算法效率很低。
四、Apriori算法的优缺点
优点:
简单、易理解、数据要求低
缺点:
(1)在每一步产生侯选项目集时循环产生的组合过多,没有排除不应该参与组合的元素;
(2)每次计算项集的支持度时,都对数据库D中的全部记录进行了一遍扫描比较,如果是一个大型的数据库的话,这种扫描比较会大大增加计算机系统的I/O开销。而这种代价是随着数据库的记录的增加呈现出几何级数的增加。因此人们开始寻求更好性能的算法,如F-P算法。
五、Apriori算法的参数说明
from apyori import apriori
apriori(df, min_support=0.5,
use_colnames=False,
max_len=None)
参数说明:
df:数据集。
min_support:给定的最小支持度。
use_colnames:默认False,则返回的物品组合用编号显示,为True的话直接显示物品名称。
max_len:最大物品组合数,默认是None,不做限制。如果只需要计算两个物品组合的话,便将这个值设置为2。
参考:
https://blog.csdn.net/u011067360/article/details/24368085
https://www.cnblogs.com/listenfwind/p/10280392.html
https://www.cnblogs.com/pinard/p/6293298.html
https://blog.csdn.net/qq_36523839/article/details/82191677
https://www.jianshu.com/p/ff82fb98855d
https://blog.csdn.net/huihuisd/article/details/86489810?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase