关联规则挖掘与Apriori算法

386 阅读5分钟

关联规则挖掘是数据挖掘中常用的手段,一般指的是从交易数据库、关系数据库以及其他的数据集中发现项或对象的频繁的模式(frequent patterns)、关联(association)的过程。此方法一般用于在购物篮分析(market basket analysis)中。最早是用于发现超市销售数据库中不同商品之间的关联关系,最经典的莫过于啤酒与尿布的这个段子。

观察发现很多顾客在买尿布的时候同时也购买啤酒,这样超市把尿布和啤酒放在一起就可以提高销售额,如果把土豆片摆在它们中间,则会同时提高这三者的销售额。

那么这个现象就会带来一些思考,哪些商品客户是可能会在一次购物同时购买?

基础概念

在讲述算法过程前先介绍下几个基本概念,首先我们存在一个交易数据库Transacational database:

  • 被研究的对象被称为项(Item),购物篮分析应用背景下,顾客购每个商品称为一个项
  • 所有项的集合: I={i1i_1,i2i_2, ...imi_m}
  • 每个交易tit_i对应的项的集合是I的子集
  • I的任何一个子集被称为项集(Itemset): x = {ij1,ij2...ijpi_{j1}, i_{j2}...i_{jp}}
  • 交易数据库D则是交易的集合,D={t1t_1, t2t_2...,tmt_m}
  • 每个项集包含的项的个数,成为项集的长度,一个长度为k的项集被称为k项集
  • 一个项集X在数据库D中出现的次数称为频数, 记为count(X)

支持度support

一个项集X的支持度指的是在数据集中包含该项集的记录所占的比例。

support(X)=count(X)/Dsupport(X) = count(X)/|D|

若给定一个最小支持度minsup, support(X) >= minsup, 则X称为频繁项集,也可以说X是频繁的。

置信度/可信度confidence

置信度/可信度是针对一条比如X->Y的关联规则来定义的,指的是包含X的交易中包含Y的比例。

conf(XY)=XY/X=sup(XY)/sup(X)conf(X \rightarrow Y) = |XY|/|X| = sup(XY)/sup(X)

Apriori算法

Apriori算法是一个经典的挖掘规则算法,也是最常用的挖掘频繁项集的算法。主要步骤如下

  1. 发现所有的频繁集: 支持度>=minsupport的所有项集
    1. 统计每个k项候选集的支持度,找出频繁的k项集: LkL_k
    2. 利用频繁的k项集生成k+1项候选集: Ck+1C_{k+1}, k=k+1
  2. 将每个频繁集生成可能的关联规则

下面举个例子,最小支持度minsup=2

apriori算法举例

文字描述下算法流程就是:

  1. 扫描TDB, 对每个候选项计算支持度得到表C1
  2. 比较C中各个后选项支持度与最小支持度,得到1维的最大项集L1
  3. 由L1得到候选集C2
  4. 由C2比较支持度得到L2
  5. 由L2得到C3
  6. 由C3得到3维项集L3

根据上述流程我们也会发现,这个算法每一步产生候选集时循环产生的组合过多,我们可以通过挖掘关联规则的性质来做剪枝。

  • 任何频繁集的子集必须是频繁的
  • Apriori剪裁规则: 若存在某些项集是不频繁的,则和这些项集的任何超集都是不频繁的,因为无需生成和测试

剪枝

如图所示,AB是不频繁的,那么红色虚线圈出的所有超集也是不频繁的,因此可以剪掉。所以生成候选集的方法可以这样总结:

假设项集LkL_k中的项是有序的

  1. 两两组合LkL_k中项集生成Ck+1C_{k+1}
  2. 裁剪

生成关联规则

前面说完了如何生成频繁项集,接下来说说如何生成关联规则,现有频繁项集l,生成每个非空子集S,若S满足最小置信度:

confidence((ls)s)=sup(l)sup(ls)>=minconfconfidence((l-s) \rightarrow s) = \frac{sup(l)}{sup(l-s)} >= minconf

则输出关联规则(l-s)->s。

关联规则示例

如图所示,最小置信度minconf=80%,对于频繁项集BCE,得到如下几个关联规则,其中大于80%的为BC->E和CE-<B两条规则。

提升度

我们现在掌握了如何找出频繁项集以及关联规则的算法,那么怎么确定计算出来的支持度和置信度是有效的呢?现在有个例子如下:

提升度示例

从直觉上来说,打篮球和吃燕麦看不出有什么关联,但从上述计算的结果来看,打篮球->吃燕麦的规则的支持度和置信度还挺高。这说明了支持度和置信度有时候并不一定能准确的反映数据之间的相关性。那么就引入了一个新的概念,提升度(Lift)。

lift=P(AB)P(A)P(B)=conf(AB)sup(B)lift = \frac{P(A \cup B)}{P(A)P(B)} = \frac{conf(A \rightarrow B)}{sup(B)}

如果lift>1,则说明是A对B是有提升的,反之则是没有提升。

那么Apriori算法现在可以总结为四步:

  1. 设置minsup和minconf
  2. 找出频繁项集
  3. 根据频繁项集找到conf>minconf的规则
  4. 计算上一步找出的规则的提升度,选出提升度最高的几个

由于Apriori算法存在着可能会产生大量候选集的问题,因此又出现了新的算法,FP-growth算法。它是基于Apriori构建,但采用了高级的数据结构减少扫描次数,大大加快了算法速度。FP-growth算法只需要对数据库进行两次扫描,而Apriori算法对于每个潜在的频繁项集都会扫描数据集判定给定模式是否频繁,因此FP-growth算法的速度要比Apriori算法快。这个算法以后再深入讨论。以上就是关于Apriori算法的基础知识,后续会抽空写个Apriori算法的简单代码实现,这里先立个flag~