【数据挖掘】关联规则之Apriori算法
前言
关联规则就是在给定训练项集上频繁出现的项集与项集之间的一种紧密的联系。其中“频繁”是由人为设定的一个阈值即支持度 (support)来衡量,“紧密”也是由人为设定的一个关联阈值即置信度(confidence)来衡量的。这两种度量标准是频繁项集挖掘中两个至关重要的因素,也是挖掘算法的关键所在。对项集支持度和规则置信度的计算是影响挖掘算法效率的决定性因素,也是对频繁项集挖掘进行改进的入口点和研究热点。
基于关联规则的分类主要分为以下以个步骤:
- 对训练数据进行预处理(包括离散化、缺失值处理等)
- 关联规则挖掘
- 频繁项集挖掘
- 关联规则生成
- 规则处理
- 对测试集进行测试
在关联规则挖掘中,最耗费时间和空间资源的就是频繁项集挖掘,目前针对频繁项集挖掘已经有很多比较成熟的算法,在时间效率或空间效率对频繁项集的挖掘进行不断的优化和改进。
Apriori算法
关联规则挖掘算法中最经典的莫过于Apriori算法,它可以算得上是频繁项集挖掘算法的鼻祖,后续很多的改进算法也是基于Apriori算法的。但是遗憾的是Apriori算法的性能一般,但是即使如此,该算法却是频繁项集挖掘必须要掌握的入门算法。
相关定义:
定义1. 设I={i1,i2,…,im}是一个全局项的集合,其中ij(1≤j≤m)是项(item)的唯一标识,j表示项的序号。
事务数据库(transactional databases)D={t1,t2,…,tn}是一个事务(transaction)的集合,每个事务ti(1≤i≤n)都对应I上的一个子集,其中ti是事务的唯一标识,i表示事务的序号。
定义2. 由I中部分或全部项构成的一个集合称为项集(itemset),任何非空项集中均不含有重复项。如I1={i1,i3,i4}就是一个项集。
定义3. 给定一个全局项集I和事务数据库D,一个项集在D上的支持度是包含I1的事务在D中所占的百分比,即
支持度是一种重要性度量,因为低支持度的规则可能只是偶然出现。从实际情况看,低支持度的规则多半是没有意义的。例如,顾客很少同时购买a、b商品,想通过对a或b商品促销(降价)来提高另一种商品的销售量是不可能的。
定义4. 给定D上的最小支持度(记为min_sup),称为最小支持度阈值。
定义5. 给定全局项集I和事务数据库D,对于I的非空子集I1,若其支持度大于或等于min_sup,则称I1为频繁项集(Frequent Itemsets)。
定义6. 对于I的非空子集I1,若某项集I1中包含有I中的k个项,称I1为k-项集。
若k-项集I1是频繁项集,称为频繁k-项集。显然,一个项集是否频繁,需要通过事务数据库D来判断。
Apriori性质
(1)若A是一个频繁项集,则A的每一个子集都是一个频繁项集。
(2)若A是一个频繁项集,则A的每一个子集都是一个频繁项集。
基本的Apriori算法
Apriori算法的基本思路是采用层次搜索的迭代方法,由候选(k-1)-项集来寻找候选k-项集,并逐一判断产生的候选k-项集是否是频繁的。
设Ck是长度为k的候选项集的集合,Lk是长度为k的频繁项集的集合。为了简单,设最小支持度阈值min_sup为最小元组数,即采用最小支持度计数。
算法过程:
输入:事务数据库D,最小支持度阈值min_sup。
输出:所有的频繁项集集合L。
方法:其过程描述如下:
通过扫描D得到1-频繁项集L1;
for (k=2;Lk-1!=Ф;k++)
{ Ck=由Lk-1通过连接运算产生的候选k-项集;
for (事务数据库D中的事务t)
{ 求Ck中包含在t中的所有候选k-项集的计数;
Lk={c | c∈Ck and c.sup_count≥min_sup};
//求Ck中满足min_sup的候选k-项集
}
}
return L=∪kLk;
举例
对于下表所示的事务数据库,设min_sup=2,产生所有频繁项集的过程如右图所示,最后L4=Ф,算法结束,产生的所有频繁项集为L1∪L2∪L3。