Apriori算法是寻找关联规则的最早算法之一,比较经典的算法。下面从5个方面对该算法进行说明
1.任务
对于关联分析来说,任务就是描述变量之间的关联关系(这里一定要注意区分关联关系与因果关系,关联并不一定导致因果),目前常见到的应用场景可能就是商品销售了,比如有名的“尿布与啤酒”案例,Apriori算法的任务就是找出具有一定关联度的变量。
2.结构
关联规则是形如的表达式,和是样本数据属性集的两个非空子集, Apriori算法的结构就是用概率的形式表示关联规则。在Apriori算法中,有两个基于概率的参数:支持度(support)和置信度(confidence),支持度表示的是同时出现在数据项中的频繁程度,置信度指的是出现在包含X的数据项中的频繁程序。以一个简单的例子说明支持度和置信度的定义形式,现有样本集如下所示,要计算与的支持度与置信度
, :同时包含的数据项个数
:包含的数据项个数
:数据项总数
3.评分函数
关联分析属于模式的探索,而模式一般无法像模型那样有比较客观的评分函数,模式的评分函数带有较强的主观性,就像贝叶斯理论那样。在Apriori算法中,可以用支持度和置信度的阈值作为一个评价指标,对于0.5的支持度/置信度和0.7的支持度/置信度两种情况,不能说0.7的一定比0.5的更好,支持度/置信度过高容易遗漏部分的关联变量,过低则容易引入噪声,支持度和置信度阈值的选择就存在着较强的主观性。
4.搜索方法
基于“用概率表示关联规则”的结构以及“支持度和置信度的阈值”这样的评分函数,该使用怎样的搜索方法来建立这样的关联模式呢?在一般的关联分析中,搜索过程主要分为两步:
- 产生频繁项集:寻找大于支持度阈值的项集,该项集即称为频繁项集
- 生成规则:在频繁项集中寻找大于置信度阈值的项集,生成关联规则
对于有个属性的样本集,所有可能的关联规则数量为,如果使用贪婪的搜索方法,计算量将是指数级的,大数据环境中一般能达到几十个,计算量非常可怕。当时,整个规则的搜索过程如下图所示
R. Agrawal 和 R. Srikant于1994年提出了Apriori(Apriori一词即为先验的)算法,优化了这种搜索过程。R. Agrawal 和 R. Srikant提出了两条先验原理
- 如果一个项集是频繁项集,那么其子集也是频繁项集
- 如果一个项集不是频繁项集,那么其所有超集都不是频繁项集
这两原理的证明及理解都比较容易,基于这两条原理,Apriori算法中计算频繁集的具体过程如下,先看一下原著中的描述
- Let =1
- Generate frequent itemsets of length
- Repeat until no new frequent itemsets are identified
- Generate length (+1) candidate itemsets from length frequent itemsets
- Prune candidate itemsets containing subsets of length +1 that are infrequent
- Count the support of each candidate by scanning the DB
- Eliminate candidates that are infrequent, leaving only those that are frequent
基于自己的理解,Apriori算法计算频繁集的具体执行步骤可描述如下。设数据集中属性集为,为包含个变量的属性子集,其数量为,表示中的频繁项集
- 令=1
- 计算中的频繁项集
- for =2:
- 从中产生
- 计算中的频繁项集 (该步中使用了第一条及第二条先验原理)
- end
这个过程可以用下图来简易描述
得到频繁集后,可以利用超过置信度阈值的频繁项集生成关联规则,不过此时有个问题,在第2节的公式
中,分母为而不是,从语义上理解可以理解为:与有关联,而不是与有关联。很显然,在多数情况下分母为和分母为的计算结果是不同的,当置信度阈值为某个值时,这有可能导致或者中的某条规则被丢弃。在实际商品销售中,考虑一下这二者的区别
- 当关联规则成立、不成立时,可以在销售商品(这里简单的以代替商品)时打折销售商品
- 当关联规则成立、不成立时,可以在销售商品时打折销售商品
- 当关联规则成立、也成立时,可以商品、一起打折销售
5.数据管理技术
Apriori算法在数据库中采用的是多重线性扫描的方式,在不同的值下都需要对数据库扫描一次,判断哪些项集是频繁项集,但是相对于贪婪式的搜索方法,Apriori算法已能大大减小数据库扫描次数了。在关联规则算法中,很多算法中搜索和数据管理部分是算法的关键部分,特别的,关联规则使用广度优先、一般到特殊的系统搜索方法,以尽可能使数据库的扫描次数减少到最小。
(PS:文中所有的图表均引用自博客https://blog.csdn.net/baimafujinji/article/details/53456931)