一句话,Apriori关联算法就是寻找事物之间的关联关系,典型案例就是推荐系统中的推荐算法,将你热爱的东西与你所搜索的内容关联起来,一股脑的推送给你,另一个实际案例就是沃尔玛超市将尿布和啤酒放在一起的货物摆放策略也是用的是关联规则。
那么Apriori关联算法是什么?
一、Apriori关联算法概念
1.1 思想来源
A priori在拉丁语中指"来自以前"。当定义问题时,通常会使用先验知识或者假设,这被称作"一个先验"(a priori)。Apriori算法的名字正是基于这样的事实:算法使用频繁项集性质的先验性质,即频繁项集的所有非空子集也一定是频繁的。
1.2 关联分析的步骤
以超市为例,关联规则算法主要分为两步,简单点说,就是先找频繁项集,再根据关联规则找关联物品:
第一步: 找出频繁一起出现的物品集的集合,其称之为频繁项集。比如一个超市的频繁项集可能有{{啤酒,尿布},{鸡蛋,牛奶},{香蕉,苹果}}
第二步: 在频繁项集的基础上,使用关联规则算法找出其中物品的关联结果。
1.3 关联分析基本概念
①支持度(Support):支持度可以理解为数据项集当前的流行程度。计算方式是:
支持度 = (数据项集合的记录数量) / (总的记录数量)
假设超市一天的总交易是10,而购买牛奶的交易数目为6,那么支持度则为:6/10=0.6,因此支持度是特定事物的支持度。
如果我们有两个想分析关联性的数据X和Y,则对应的支持度为:
以此类推,如果我们有三个想分析关联性的数据X,Y和Z,则对应的支持度为:
一般来说,支持度高的数据不一定构成频繁项集,但是支持度太低的数据肯定不构成频繁项集。
②置信度(Confidence):置信度是指如果购买物品A,有较大可能购买物品B。计算方式是这样:
置信度( A -> B) = (包含物品A和B的记录数量) / (包含 A 的记录数量)
举例:超市中,如果(牛奶,鸡蛋)组合一起购买的次数是3次,牛奶的购买次数是6次。那么Confidence(牛奶->鸡蛋)的计算方式是Confidence(牛奶->鸡蛋)=3 / 6。
置信度体现了一个数据出现后,另一个数据出现的概率,或者说数据的条件概率。如果我们有两个想分析关联性的数据X和Y,X对Y的置信度为:
也可以以此类推到多个数据的关联置信度,比如对于三个数据X,Y,Z,则X对于Y和Z的置信度为:
③提升度(Lift):当销售一个物品时,另一个物品销售率会增加多少。计算方式是:
提升度( A -> B) = 置信度( A -> B) / (支持度 A)
举例:计算了牛奶和鸡蛋的置信度Confidence(牛奶->鸡蛋)=3 / 6。牛奶的支持度Support(牛奶)=6 / 10,那么我们就能计算牛奶和鸡蛋的支持度Lift(牛奶->鸡蛋)=0.3.
提升度表示含有Y的条件下,同时含有X的概率,与X总体发生的概率之比,即:
当提升度(A->B)的值大于1的时候,说明物品A卖得越多,B也会卖得越多。而提升度等于1则意味着产品A和B之间关系。最后,提升度小于1那么意味着购买A反而会减少B的销量。总体而言,提升度大于1则X⇐Y是有效的强关联规则, 提升度小于等于1则X⇐Y是无效的强关联规则 。(上面的例子我们只是举例说明模型,数值也是随便举例列出来的,因此不可能符合实际情况)。
1.4 关联规则概念
关联规则就是有关联的规则,形式是这样定义的:两个不相交的非空集合X、Y,如果有
X->Y,就说X-->Y是一条关联规则,例如,{啤酒}-->{尿布}就是一条关联规则。
其中支持度和Apriori相关,而置信度和提升度是寻找物品关联规则的时候会用到的模型。
二、Apriori关联算法细节
2.1 认识两个定律
由第一部分的概念部分,知道算法分为两步,①找出频繁项集,②挖掘关联规则,那么是首先需要找到频繁项集,如何寻找呢,一般存在下面的两定律。
1.高级到低级。如果一个集合是频繁项集,则它的所有子集都是频繁项集。假设一个集合{A,B}是频繁项集,则它的子集{A}, {B} 都是频繁项集。
2.低级到高级。如果一个集合不是频繁项集,则它的所有超集都不是频繁项集。假设集合{A}不是频繁项集,则它的任何超集如{A,B},{A,B,C}必定也不是频繁项集对于Apriori算法。
2.2 算法流程
我们使用支持度来作为我们判断频繁项集的标准。Apriori算法的目标是找到最大的K项频繁集。这里有两层意思,首先,我们要找到符合支持度标准的频繁集。但是这样的频繁集可能有很多。第二层意思就是我们要找到最大个数的频繁集。比如我们找到符合支持度的频繁集AB和ABE,那么我们会抛弃AB,只保留ABE,因为AB是2项频繁集,而ABE是3项频繁集。那么具体的,Apriori算法是如何做到挖掘K项频繁集的呢?
Apriori算法采用了迭代的方法,先搜索出候选1项集及对应的支持度,剪枝去掉低于支持度的1项集,得到频繁1项集。然后对剩下的频繁1项集进行连接,得到候选的频繁2项集,筛选去掉低于支持度的候选频繁2项集,得到真正的频繁二项集,以此类推,迭代下去,直到无法找到频繁k+1项集为止,对应的频繁k项集的集合即为算法的输出结果。
下面以一个例子的形式说明:
数据集D有4条记录,分别是134,235,1235和25。现在我们用Apriori算法来寻找频繁k项集,最小支持度设置为50%。首先我们生成候选频繁1项集,包括我们所有的5个数据并计算5个数据的支持度,计算完毕后我们进行剪枝,数据4由于支持度只有25%被剪掉。我们最终的频繁1项集为1235,现在我们链接生成候选频繁2项集,包括12,13,15,23,25,35共6组。此时我们的第一轮迭代结束。进入第二轮迭代,我们扫描数据集计算候选频繁2项集的支持度,接着进行剪枝,由于12和15的支持度只有25%而被筛除,得到真正的频繁2项集,包括13,23,25,35。现在我们链接生成候选频繁3项集,123, 125,135和235共4组,这部分图中没有画出。通过计算候选频繁3项集的支持度,我们发现123,125和135的支持度均为25%,因此接着被剪枝,最终得到的真正频繁3项集为235一组。由于此时我们无法再进行数据连接,进而得到候选频繁4项集,最终的结果即为频繁3三项集235。
三、总结
从算法的步骤可以看出,Aprior算法每轮迭代都要扫描数据集,因此在数据集很大,数据种类很多的时候,算法效率很低。
Aprior算法是一个非常经典的频繁项集的挖掘算法,很多算法都是基于Aprior算法而产生的,包括FP-Tree,GSP, CBA等。这些算法利用了Aprior算法的思想,但是对算法做了改进,数据挖掘效率更好一些,因此现在一般很少直接用Aprior算法来挖掘数据了,但是理解Aprior算法是理解其它Aprior类算法的前提,同时算法本身也不复杂,因此值得好好研究一番。