数据挖掘十大经典算法之Apriori

一、介绍

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

你可能感兴趣的:(数据挖掘十大经典算法之Apriori)