机器学习:关联规则:Apriori算法、FP - Growth算法的原理、应用场景及优缺点介绍

一、关联规则算法概述

关联规则挖掘是数据挖掘中的一个重要任务,用于发现数据集中不同项之间的关联关系。

二、Apriori算法

  1. 原理

    • 频繁项集生成:Apriori算法基于一个先验原理,即如果一个项集是频繁的,那么它的所有子集也是频繁的;反之,如果一个项集是非频繁的,那么它的所有超集也是非频繁的。首先,扫描数据集,统计每个单项(1 - 项集)的出现次数,找出满足最小支持度阈值的频繁1 - 项集。然后,通过频繁 k − 1 k - 1 k1 - 项集来生成候选 k k k - 项集,再扫描数据集计算候选 k k k - 项集的支持度,筛选出频繁 k k k - 项集。这个过程不断迭代,直到不能生成新的频繁项集为止。
    • 关联规则生成:对于每个频繁项集 L L L,生成所有可能的非空子集。对于每个非空子集 A A A,计算关联规则 A ⇒ B A\Rightarrow B AB(其中 B = L − A B = L - A B=LA)的置信度,置信度计算公式为:
      C o n f i d e n c e ( A ⇒ B ) = S u p p o r t ( A ∪ B ) S u p p o r t ( A ) Confidence(A\Rightarrow B)=\frac{Support(A\cup B)}{Support(A)} Confidence(AB)=Support(A)Support(AB)
      只保留满足最小置信度阈值的关联规则。
  2. 应用场景

    • 超市购物篮分析。例如,分析顾客购买商品的行为,发现“购买牛奶和面包的顾客也经常购买鸡蛋”这样的关联规则,用于商品陈列优化和促销策略制定。
  3. 优点

    • 简单易懂,是关联规则挖掘的经典算法。原理和实现相对直观,容易理解和应用。
    • 能够有效地减少候选项集的数量。通过先验原理,避免了对大量不可能是频繁项集的候选项集进行计算,提高了效率。
  4. 缺点

    • 在生成频繁项集时需要多次扫描数据集。当数据集很大时,频繁的I/O操作会导致性能下降。
    • 可能会生成大量的候选项集,尤其是当最小支持度阈值设置较低时,计算和存储这些候选项集会消耗大量的资源。

三、FP - Growth算法

  1. 原理

    • 构建FP - Tree:FP - Growth(频繁模式增长)算法首先构建一棵FP - Tree(频繁模式树)。扫描数据集一次,统计每个项的出现频率,按照频率降序排列所有项。然后再次扫描数据集,将每个事务中的项按照排好的顺序插入FP - Tree中。在插入过程中,如果树中已经存在当前项的路径,则更新路径上节点的计数;否则,创建新的分支。
    • 挖掘频繁项集:从FP - Tree的头表(存储每个项及其出现次数和指向树中第一个相同项的指针)开始,通过递归的方式挖掘频繁项集。对于每个项,找到它在FP - Tree中的所有路径,根据路径构建条件模式基,然后从条件模式基构建条件FP - Tree,在条件FP - Tree上继续挖掘频繁项集。这个过程类似于FP - Tree的构建和挖掘,直到不能挖掘出新的频繁项集为止。
  2. 应用场景

    • 同样适用于购物篮分析,能够更高效地处理大规模数据集,挖掘商品之间的关联关系。例如在大型连锁超市的销售数据挖掘中,发现不同商品类别之间的关联。
  3. 优点

    • 只需要扫描数据集两次,相比Apriori算法大大减少了I/O开销。一次用于构建FP - Tree,另一次用于挖掘频繁项集(在挖掘过程中通过条件FP - Tree避免了对原始数据集的多次扫描)。
    • 对于挖掘长频繁模式和密集数据集更有效。它能够利用FP - Tree的结构,快速地找到频繁项集,不会像Apriori算法那样生成大量的候选项集。
  4. 缺点

    • 构建FP - Tree需要占用大量的内存空间,尤其是当数据集很大或者数据项很多时,内存消耗可能会成为瓶颈。
    • 算法实现相对复杂,理解和实现FP - Tree的构建和挖掘过程需要一定的技术难度。

四、Eclat算法

  1. 原理

    • Eclat算法基于集合的交集运算来挖掘频繁项集。它使用垂直数据表示,即将每个项的事务标识符(TID)列表存储起来。对于两个项集 A A A B B B,它们的交集的事务标识符列表就是同时包含 A A A B B B的事务集合。
    • 频繁项集的支持度计算方式为:
      S u p p o r t ( A ) = ∣ T I D ( A ) ∣ ∣ D ∣ Support(A)=\frac{|TID(A)|}{|D|} Support(A)=DTID(A)
      其中 T I D ( A ) TID(A) TID(A)是项集 A A A的事务标识符列表, ∣ D ∣ |D| D是数据集 D D D的事务总数。通过递归地计算项集的交集来生成频繁项集。从单个项开始,计算它们之间的交集和支持度,找到频繁1 - 项集。然后通过频繁 k − 1 k - 1 k1 - 项集之间的交集来生成候选 k k k - 项集,计算支持度,筛选出频繁 k k k - 项集,直到不能生成新的频繁项集为止。
  2. 应用场景

    • 在市场调查数据挖掘中,用于分析消费者对不同产品属性的组合偏好。例如,分析消费者对手机品牌、颜色、存储容量等属性组合的偏好,找出频繁出现的属性组合关联。
  3. 优点

    • 采用垂直数据表示和集合交集运算,在某些情况下可以更高效地计算频繁项集。特别是当数据集的事务长度较短或者支持度阈值较高时,能够快速地计算出频繁项集。
    • 可以方便地并行化计算。由于基于集合的交集运算,不同的项集之间的计算相对独立,可以利用并行计算资源来加速挖掘过程。
  4. 缺点

    • 当数据集的事务长度较长或者支持度阈值较低时,计算项集的交集会导致大量的中间结果,需要大量的存储空间和计算时间。
    • 对于稀疏数据集,性能可能会受到影响,因为需要处理大量的事务标识符列表和交集运算。

五、举例说明

假设我们有一个小型超市的购物篮数据集如下:

购物篮编号购买商品
1牛奶、面包、鸡蛋
2牛奶、面包
3面包、鸡蛋、果汁
4牛奶、鸡蛋
5牛奶、面包、果汁
  1. Apriori算法示例
    • 频繁项集生成
      • 首先计算1 - 项集的支持度,假设最小支持度阈值为 0.4 0.4 0.4。“牛奶”出现了4次,支持度为 4 5 = 0.8 \frac{4}{5}=0.8 54=0.8;“面包”出现了4次,支持度为 0.8 0.8 0.8;“鸡蛋”出现了3次,支持度为 0.6 0.6 0.6;“果汁”出现了2次,支持度为 0.4 0.4 0.4。所以频繁1 - 项集为{牛奶、面包、鸡蛋、果汁}。
      • 然后生成候选2 - 项集:{牛奶、面包},{牛奶、鸡蛋},{牛奶、果汁},{面包、鸡蛋},{面包、果汁},{鸡蛋、果汁}。计算它们的支持度,例如{牛奶、面包}出现了3次,支持度为 3 5 = 0.6 \frac{3}{5}=0.6 53=0.6。经过筛选,频繁2 - 项集为{牛奶、面包},{牛奶、鸡蛋},{面包、鸡蛋},{牛奶、果汁}。
      • 接着生成候选3 - 项集:{牛奶、面包、鸡蛋},{牛奶、面包、果汁},{牛奶、鸡蛋、果汁},{面包、鸡蛋、果汁}。计算支持度后,发现只有{牛奶、面包、鸡蛋}的支持度为 2 5 = 0.4 \frac{2}{5}=0.4 52=0.4满足阈值,是频繁3 - 项集。
    • 关联规则生成
      • 对于频繁3 - 项集{牛奶、面包、鸡蛋},生成非空子集:{牛奶},{面包},{鸡蛋},{牛奶、面包},{牛奶、鸡蛋},{面包、鸡蛋}。计算关联规则的置信度,例如对于规则{牛奶、面包} ⇒ \Rightarrow {鸡蛋},置信度为 S u p p o r t ( { 牛奶、面包、鸡蛋 } ) S u p p o r t ( { 牛奶、面包 } ) = 0.4 0.6 = 2 3 \frac{Support(\{牛奶、面包、鸡蛋\})}{Support(\{牛奶、面包\})}=\frac{0.4}{0.6}=\frac{2}{3} Support({牛奶、面包})Support({牛奶、面包、鸡蛋})=0.60.4=32。根据最小置信度阈值(假设为 0.6 0.6 0.6),保留满足条件的关联规则。
  2. FP - Growth算法示例
    • 构建FP - Tree
      • 首先统计每个项的出现次数,按照出现次数降序排列为:牛奶(4次)、面包(4次)、鸡蛋(3次)、果汁(2次)。
      • 构建FP - Tree,对于购物篮1(牛奶、面包、鸡蛋),先插入牛奶,然后在牛奶节点下插入面包,在面包节点下插入鸡蛋。以此类推,构建完整的FP - Tree。
    • 挖掘频繁项集
      • 从FP - Tree的头表开始,对于“果汁”,找到它在树中的路径,构建条件模式基,然后从条件模式基构建条件FP - Tree,挖掘包含“果汁”的频繁项集。同样地,对其他项进行挖掘,最终得到所有的频繁项集。
  3. Eclat算法示例
    • 垂直数据表示
      • 牛奶的TID列表为{1,2,4,5},面包的TID列表为{1,2,3,5},鸡蛋的TID列表为{1,3,4},果汁的TID列表为{3,5}。
    • 频繁项集生成
      • 计算1 - 项集的支持度,方法同Apriori算法。频繁1 - 项集为{牛奶、面包、鸡蛋、果汁}。
      • 计算2 - 项集的交集和支持度,例如牛奶和面包的交集TID列表为{1,2,5},支持度为 3 5 = 0.6 \frac{3}{5}=0.6 53=0.6。经过筛选得到频繁2 - 项集,然后继续生成3 - 项集并计算支持度,以此类推,挖掘出所有频繁项集。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

rubyw

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值