2021-07-02

关联规则——Apriori算法

基本概念

例:某杂货铺简单交易清单

单号  1     2     3     4     5     6    7
商品 ABCD  ABCE  BDEF  BCDE  ACDF  ABC  ABE

A B C D 等代表不同的商品
  1. 事务集:{ABCD, ABCF, BDEF…},所有流水组成的集合

  2. 记录(事务):ABCD叫做一条记录(事务)

  3. 项目(项):A, B, C, D…叫做一个项目(项)

  4. 项目集(项集):项目组成的集合,{A,B,E,F},{A,B,C}就是一个项集

  5. K项集:项集中元素的个数为k,{A,B,E,F}就是4项集

  6. 支持度:

Sup(X) = 某个项集X在事务集中出现的次数 / 事务集中记录的种个数

简单理解就是概率(频率)

如X = {A,C},则Sup(X) = 4/7 = 0.57

  1. 置信度:

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

  1. 最小支持度:人为规定的一个支持度

  2. 最小置信度:人为规定的一个置信度

  3. 提升度:

Lift(A->B) = Con(A->B) / Sup(B),理解为B在A发生的基础上再发生的概率与B单独发生概率的比值

  1. 频繁K项(目)集:满足最小支持度的K项集

  2. 候选K项(目)集:用来生成频繁K项集的K项集(不等价于所有K项集)

最小支持度为 0.5 X = {A,C},则Sup(X) = 4/7 = 0.57 >=0.5,则称{A,C}是一个频繁2项集

两个定理

  1. 如果X是一个频繁K项集,则它的所有子集一定也是频繁的。

  2. 如果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算法采用逐层搜索的迭代方法,算法简单明了。没有复杂的理论推导,也易于实现。

缺点

  1. 时间复杂度大,注意到,每次计算某个K项集的支持度时,总是要扫描一遍事务集才可以,而现实中,事务集中记录的个数往往很大,因此算法运行效率不高。

  2. 算法可能产生大量的候选项集。(排列组合)

  3. 在频繁项目集长度变大的情况下,运算时间显著增加

  4. 采用唯一支持度,没有考虑各个属性重要程度的不同等

改进算法

FP-growth

参考来源于:
https://www.bilibili.com/video/BV13f4y1k7x6?from=search&seid=3608598818850965190

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值