挖掘关联规则之频繁项集算法Apriori算法

1. Apriori算法简介

先验算法(Apriori Algorithm)是一种挖掘关联规则频繁项集算法,其核心思想是通过候选集生成和情节的向下封闭检测两个阶段来挖掘频繁项集。

先验算法的设计目的是为了处理包含交易信息内容的数据库(例如,顾客购买的商品清单,或者网页常访清单)
而其他的算法则是设计用来寻找无交易信息(如Winepi算法和Minepi算法)或无时间标记(如DNA测序)的数据之间的联系规则。

2. 算法步骤

先验算法采用广度优先搜索算法进行搜索并采用树结构来对候选项目集进行高效计数。它通过长度为k−1的候选项目集来产生长度为 k 的候选项目集,然后从中删除包含不常见子模式的候选项。根据向下封闭性引理,该候选项目集包含所有长度为 k 的频繁项目集。之后,就可以通过扫描交易数据库来决定候选项目集中的频繁项目集。

Apriori 算法是一种最有影响力的挖掘布尔关联规则的频繁项集算法,它是由Rakesh Agrawal 和RamakrishnanSkrikant 提出的。它使用一种称作逐层搜索的迭代方法,k- 项集用于探索(k+1)- 项集。首先,找出频繁 1- 项集的集合。该集合记作L1。L1 用于找频繁2- 项集的集合 L2,而L2 用于找L3,如此下去,直到不能找到 k- 项集。

每找一个 Lk 需要一次数据库扫描。为提高频繁项集逐层产生的效率,一种称作Apriori 性质用于压缩搜索空间。其约束条件:一是频繁项集的所有非空子集都必须也是频繁的,二是非频繁项集的所有父集都是非频繁的。

3. 基本概念

3.1 关联分析

关联分析是一种在大规模数据集中寻找相互关系的任务。 这些关系可以有两种形式:

  1. 频繁项集(frequent item sets): 经常出现在一块的物品的集合。
  2. 关联规则(associational rules): 暗示两种物品之间可能存在很强的关系。

3.2 例子

  • 频繁项集: {葡萄酒, 尿布, 豆奶} 就是一个频繁项集的例子。

  • 关联规则: 尿布 -> 葡萄酒 就是一个关联规则。这意味着如果顾客买了尿布,那么他很可能会买葡萄酒。

  • 支持度: P(A ∩ B),既有A又有B的概率。数据集中包含该项集的记录所占的比例。例如上图中,{豆奶} 的支持度为 4/5。{豆奶, 尿布} 的支持度为 3/5。

  • 可信度: 针对一条诸如 {尿布} -> {葡萄酒} 这样具体的关联规则来定义的。这条规则的可信度被定义为支持度({尿布, 葡萄酒})/支持度({尿布}),支持度({尿布, 葡萄酒}) = 3/5,支持度({尿布}) = 4/5,所以 {尿布} -> {葡萄酒} 的可信度 = 3/5 / 4/5 = 3/4 = 0.75。

    P(B|A),在A发生的事件中同时发生B的概率 p(AB)/P(A) 例如购物篮分析:牛奶 ⇒ 面包

    例子:[支持度:3%,置信度:40%]

    支持度3%:意味着3%顾客同时购买牛奶和面包

    置信度40%:意味着购买牛奶的顾客40%也购买面包

支持度 和 可信度 是用来量化 关联分析 是否成功的一个方法。 假设想找到支持度大于 0.8 的所有项集,应该如何去做呢? 一个办法是生成一个物品所有可能组合的清单,然后对每一种组合统计它出现的频繁程度,但是当物品成千上万时,上述做法就非常非常慢了。 我们需要详细分析下这种情况并讨论下 Apriori 原理,该原理会减少关联规则学习时所需的计算量。

  • k项集
    如果事件A中包含k个元素,那么称这个事件A为k项集,并且事件A满足最小支持度阈值的事件称为频繁k项集。

  • 由频繁项集产生强关联规则

    K维数据项集LK是频繁项集的必要条件是它所有K-1维子项集也为频繁项集,记为LK-1 

    如果K维数据项集LK的任意一个K-1维子集Lk-1,不是频繁项集,则K维数据项集LK本身也不是最大数据项集

    Lk是K维频繁项集,如果所有K-1维频繁项集合Lk-1中包含LK的K-1维子项集的个数小于K,则Lk不可能是K维最大频繁数据项集。

    同时满足最小支持度阀值和最小置信度阀值的规则称为强规则。

4. Apriori 原理

假设我们一共有 4 个商品: 商品0, 商品1, 商品2, 商品3。 所有可能的情况如下:

如果我们计算所有组合的支持度,也需要计算 15 次。即 2N−1=24−1=15。随着物品的增加,计算的次数呈指数的形式增长。

为了降低计算次数和时间,研究人员发现了一种所谓的 Apriori 原理,即某个项集是频繁的,那么它的所有子集也是频繁的。 例如,如果 {0, 1} 是频繁的,那么 {0}, {1} 也是频繁的。 该原理直观上没有什么帮助,但是如果反过来看就有用了,也就是说如果一个项集是 非频繁项集,那么它的所有超集也是非频繁项集,如下图所示:

在图中我们可以看到,已知灰色部分{2,3}是非频繁项集,那么利用上面的知识,我们就可以知道 {0,2,3} {1,2,3} {0,1,2,3} 都是非频繁的。也就是说,计算出{2,3} 的支持度,知道它是非频繁的之后,就不需要再计算{0,2,3} {1,2,3} {0,1,2,3} 的支持度,因为我们知道这些集合不会满足我们的要求。使用该原理就可以避免项集数目的指数增长,从而在合理的时间内计算出频繁项集。

5. Apriori 算法优缺点

  • 优点:易编码实现
  • 缺点
    • 问题一:多次扫描数据库
    • 问题二:产生大量候选项集

6. 提高Apriori的效率的策略

6.1 事务压缩

6.2 数据划分

6.3 数据选样

  • 在给定数据的一个子集挖掘,牺牲了一些精度换取有效性,样本集S选取多少,看是否能够放入内存。
  • 由于此策略是搜索S中,而不是D中的频繁项集,有可能丢失一些全局频繁项集。为减少这种可能性,使用比最小支持度低的支持阈值来找出S的频繁项集。

6.4 动态项集计数

7. 应用场景

Apriori 算法广泛应用于各种领域,通过对数据的关联性进行了分析和挖掘,挖掘出的这些信息在决策制定过程中具有重要的参考价值。

Apriori算法广泛应用于消费市场价格分析中

它能够很快的求出各种产品之间的价格关系和它们之间的影响。通过数据挖掘,市场商人可以瞄准目标客户,采用个人股票行市、最新信息、特殊的市场推广活动或其他一些特殊的信息手段,从而极大地减少广告预算和增加收入。百货商场、超市和一些老字型大小的零售店也在进行数据挖掘,以便猜测这些年来顾客的消费习惯。

8. Apriori Tid 算法

  • AprioriTid算法由Apriori算法改进

    优点:只和数据库做一次交互,无须频繁访问数据库
    将Apirori中的Ck 扩展,内容由{c}变为{TID,c},TID用于唯一标识事务
    引入Bk ,使得Bk 对于事务的项目组织集合,而不是被动的等待Ck 来匹配
    




  • 上面图中分别为Bk,Ck和Lk
  • 可以看到Bk 由Bk-1 得到,无须由数据库取数据。
  • 缺点:内存要求很大,事务过多的时候资源难以满足。

9.FP Growth算法

  • 一种不产生候选项集的FP-Growth算法,只需扫描两次数据库。

  • Apriori算法的一个有问题的方面是其候选项集的生成,是指数级增长的来源,另一种方法是使用分而治之的策略(divide and conquer)

  • 思想: 将数据库的信息压缩成一个描述频繁项相关信息的频繁模式树

  • 算法步骤

    Step1:遍历一次数据库,导出繁1-项集和支持数(频率),并且以降序排序。
    Step2:构造FP-tree
    Step3:根据第二步得到的FP-Tree,为1-项频繁项集中的每一项构造条件FP-Tree。
    Step4:得到频繁模式(频繁项集)。
    

10. Apriori 实例

10.1 实例1

10.2 实例2

假设有一个数据库D,其中有4个事务记录,分别表示为:

2、比较候选项支持度计数与最小支持度minSupport(假设为2),产生1维最大项目集L1:

3、由L1产生候选项集C2:


11. Apriori 算法实现

关联分析的目标包括两项:发现频繁项集和发现关联规则

Apriori算法是发现频繁项集的一种方法。 Apriori 算法的两个输入参数分别是最小支持度和数据集

该算法首先会生成所有单个物品的项集列表。接着扫描交易记录来查看哪些项集满足最小支持度要求,那些不满足最小支持度要求的集合会被去掉。然后对剩下来的集合进行组合以生成包含两个元素的项集。接下来再重新扫描交易记录,去掉不满足最小支持度的项集。该过程重复进行直到所有项集被去掉。

友链:
一步步教你轻松学关联规则Apriori算法

posted @ 2024-11-05 11:59  awei040519  阅读(1118)  评论(0)    收藏  举报