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

embedded/2024/10/11 0:44:13/

一、关联规则算法概述

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

二、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 - 项集并计算支持度,以此类推,挖掘出所有频繁项集。

http://www.ppmy.cn/embedded/125629.html

相关文章

springboot 模版集成方案(第二章)

springboot 模版集成方案 jsp 模版集成 ​ 在SpringBoot框架中默认模板推荐使用Thymeleaf模板,但是也不能排除有些公司还是使用jsp 模版解析&#xff1b; 1. 引入jsp 集成的 jar 包 <!--c标签库--> <dependency><groupId>jstl</groupId><artifact…

力扣10.9

3171. 找到按位或最接近 K 的子数组 给你一个数组 nums 和一个整数 k 。你需要找到 nums 的一个 子数组 &#xff0c;满足子数组中所有元素按位或运算 OR 的值与 k 的 绝对差 尽可能 小 。换言之&#xff0c;你需要选择一个子数组 nums[l..r] 满足 |k - (nums[l] OR nums[l 1…

PclSharp1.12.0库文件下载地址

C#Winfrom实现3D点云目标识别 使用PclSharp1.12.0库及PlcSharp可视化库&#xff0c;利用Winform框架开发点云算法处理应用程序&#xff0c;可适配激光雷达点云数据或者是3D相机拍摄扫描的点云数据&#xff0c;定位识别目标物体&#xff0c;得出抓取中心&#xff0c;通过数据通信…

jmeter学习(4)提取器

同线程组https://blog.csdn.net/vikeyyyy/article/details/80437530 不同线程组 在JMeter中&#xff0c;正则表达式提取的参数可以跨线程组使用。 通过使用Beanshell后置处理器和属性设置函数&#xff0c;可以将提取的参数设置为全局变量&#xff0c;从而在多个线程组之间共享…

ai智能电话机器人的核心技术有哪些?

ai智能电话机器人是一种高智能语音系统&#xff0c;它能够非常智能化的和用户进行畅通的交流&#xff0c;而不会存在任何的障碍问题&#xff0c;这个主要是由于它使用了很多的核心技术&#xff0c;我们一起来看看有哪些核心技术。 1.VAD 准确定位语音的开始点和结束点&#x…

模拟实现字符函数和字符串函数(一)

目录 一、模拟实现strlen 二、模拟实现strcpy 三、模拟实现strcmp 四、模拟实现strcat 五、模拟实现strstr 模拟实现strlen模拟实现strcpy模拟实现strcmp模拟实现strcat模拟实现strstr 一、模拟实现strlen strlen函数是用来求字符串长度的函数 #include <stdio.h>…

输出平方矩阵

题目&#xff1a; 输入一个正整数n&#xff0c;输出一个n阶的平方矩阵。 例如&#xff1a; 输入&#xff1a;5 输出&#xff1a; 1 4 9 16 25 4 9 16 25 1 9 16 25 1 4 16 25 1 4 9 25 1 4 9 16 解题思路&#xff1a; 本题我分别采用一维数组和二维数组来实现。 一…

抖店API接口系列(商品详情数据),Json数据格式参考

抖店API接口系列中的商品详情数据接口允许第三方应用通过编程方式访问抖音小店的商品数据。这些数据通常包括商品的基本信息、价格、库存、用户评价等&#xff0c;并且会以JSON数据格式返回。以下是一个抖店商品详情数据JSON格式的参考示例&#xff1a; { "status":…