关联规则——Apriori算法
基本概念
例:某杂货铺简单交易清单
单号 1 2 3 4 5 6 7
商品 ABCD ABCE BDEF BCDE ACDF ABC ABE
A B C D 等代表不同的商品
-
事务集:{ABCD, ABCF, BDEF…},所有流水组成的集合
-
记录(事务):ABCD叫做一条记录(事务)
-
项目(项):A, B, C, D…叫做一个项目(项)
-
项目集(项集):项目组成的集合,{A,B,E,F},{A,B,C}就是一个项集
-
K项集:项集中元素的个数为k,{A,B,E,F}就是4项集
-
支持度:
Sup(X) = 某个项集X在事务集中出现的次数 / 事务集中记录的种个数
简单理解就是概率(频率)
如X = {A,C},则Sup(X) = 4/7 = 0.57
- 置信度:
Con(X=>Y) = Sup(XY) / Sup(X), 简单理解就是条件概率。
条件概率:P(Y|X) = P(XY) / P(X)
如X = {A},Y = {C}, 则Con(X=>Y) = Sup(XY) / Sup(X) = (4/7) / (5/7) = 4/5 = 0.8
-
最小支持度:人为规定的一个支持度
-
最小置信度:人为规定的一个置信度
-
提升度:
Lift(A->B) = Con(A->B) / Sup(B),理解为B在A发生的基础上再发生的概率与B单独发生概率的比值
-
频繁K项(目)集:满足最小支持度的K项集
-
候选K项(目)集:用来生成频繁K项集的K项集(不等价于所有K项集)
最小支持度为 0.5 X = {A,C},则Sup(X) = 4/7 = 0.57 >=0.5,则称{A,C}是一个频繁2项集
两个定理
-
如果X是一个频繁K项集,则它的所有子集一定也是频繁的。
-
如果X不是K-1项频繁,则它一定不是频繁K项集。
算法流程
-
步骤1:令K = 1,计算单个商品(项目)的支持度,并筛选出频繁1项集(最小支持度为:0.3 = 2.1 / 7)
-
步骤2:(从K = 2开始)根据K-1项的频繁项目集生成候选K项目集,并进行预剪枝
-
步骤3:由候选K项目集生成频繁K项集(筛选出满足最小支持度的K项集)
-
重复步骤2和3,直到无法筛选出满足最小支持度的集合(第一阶段结束)
-
步骤4:将获得的最终的频繁K项集,依次取出。同时计算该次取出的这个K项集的所有真子集,然后以排列组合的方式形成关联规则,并计算规则的置信度以及提升度,将符合要求的关联规则生成提出。(算法结束)
例题:
- 步骤1:令K = 1,计算单个商品(项目)的支持度,并筛选出频繁1项集(最小支持度为:0.3 = 2.1 / 7)
支持度分别为:
{A} 0.71; {B} 0.86; {C} 0.71 {D} 0.57; {E} 0.57; {F} 0.29
所以得到的频繁1项集为:{A}{B}{C}{D}{E}
- 步骤2:(从K = 2开始)根据K-1项的频繁项目集生成候选K项目集,并进行预剪枝
频繁1项集为:{A}{B}{C}{D}{E}
如何根据K-1项的频繁项目集生成候选K项目集?(最小支持度为:0.3 = 2.1 / 7)
用K-1项集排列组合:
{A,B} 4/7
{A,C} 4/7
{A,D} 2/7 否
{A,E} 2/7 否
{B,C} 4/7
{B,D} 3/7
{B,E} 4/7
{C,D} 3/7
{C,E} 2/7 否
{D,E} 2/7 否
(这里暂时没有用到预剪枝)
- 步骤3:由候选K项目集生成频繁K项集(筛选出满足最小支持度的K项集)
{A,B} {A,C} {B,C} {B,D} {B,E} {C,D} 得到频繁2项集
再次执行步骤二和步骤三
- 步骤2:(从K = 2开始)根据K-1项的频繁项目集生成候选K项目集,并进行预剪枝
{A,B} {A,C} {B,C} {B,D} {B,E} {C,D} 最小支持度为:0.3 = 2.1 / 7)
此时生成的为候选3项目集,即项目个数为3,故去掉4项目集
用K-1项集排列组合:
{A,B,C}
{A,B,D}
{A,B,E}
{A,B,C,D} 否
{A,B,C,E} 否
{A,C,D}
{B,C,D}
{B,C,E}
{B,D,E}
{B,E,C,D} 否
组合K项候选集的时候注意,两个子集要有K-2项相同
预剪枝:因为{A,D} {A,E} {C,E} {D,E}都不是频繁2项集,所以在候选3项集中,含有这些2项集的3项集,一定不是频繁3项集。因此经过剪枝的候选3项集为:
{A,B,C}
{A,B,D} 否
{A,B,E} 否
{A,B,C,D} 否
{A,B,C,E} 否
{A,C,D} 否
{B,C,D}
{B,C,E} 否
{B,D,E} 否
{B,E,C,D} 否
即:{A,B,C} {B,C,D}是最终的候选3项目集
- 步骤3:由候选K项目集生成频繁K项集(筛选出满足最小支持度的K项集)
Sup(ABC) = 3/7 Sup(ABC) = 2/7
频繁3项集为{A,B,C}。另外由于无法再生成候选4项目集。算法第一阶段结束。
- 步骤4:将获得的最终的频繁K项集,依次取出。同时计算该次取出的这个K项集的所有真子集,然后以排列组合的方式形成关联规则,并计算规则的置信度以及提升度,将符合要求的关联规则生成提出。(算法结束)
获得的最终的频繁K项集:{A,B,C}…(这里只有一个,实际上可能有很多)
依次取出:第一个是{A,B,C},获取其所有真子集{A},{B},{C},{A,B},{A,C},{B,C}
以排列组合的方式形成关联规则:
{A}->{B} {A}->{C} {B}->{C} {B}->{A} {C}->{A} {C}->{B} {A}->{B,C} {B}->{A,C} {C}->{A,B} {A,B}->{C} {A,C}->{B} {B,C}->{A}
思考:{A,C}和{A,B}为什么不组合?
都有A,其实就是C和B的关系,所以不再组合
计算置信度及提升度,以{A}->{B,C}为例
Con({A}->{B,C}) = Sup({B,C}) / Sup({A}) = 3/5 = 0.6
Lift({A}->{B,C}) = Con({A}->{B,C}) / Sup({B,C}) = 0.6/ (4/7) = 1.05
因此 {A}->{B,C}就是一条比较令人信服的关联规则
计算置信度及提升度,以{B,C}->{A}为例
Con({B,C}->{A}) = Sup({A}) / Sup({B,C}) = 3/4 = 0.75
Lift({B,C}->{A}) = Con({B,C}->{A}) / Sup({A}) = 0.75 / (5/7) = 1.05
注意到{A}->{B,C}的置信度是0.6,所以两条关联规则还是有区别的
同理,计算其他关联规则额置信度和提升度即可。最后输出满足条件的规则
算法分析
优点
Apriori算法采用逐层搜索的迭代方法,算法简单明了。没有复杂的理论推导,也易于实现。
缺点
-
时间复杂度大,注意到,每次计算某个K项集的支持度时,总是要扫描一遍事务集才可以,而现实中,事务集中记录的个数往往很大,因此算法运行效率不高。
-
算法可能产生大量的候选项集。(排列组合)
-
在频繁项目集长度变大的情况下,运算时间显著增加
-
采用唯一支持度,没有考虑各个属性重要程度的不同等
改进算法
FP-growth
参考来源于:
https://www.bilibili.com/video/BV13f4y1k7x6?from=search&seid=3608598818850965190