Apriori 算法

R.Agrawal 等人于 1993 年提出了数据挖掘顾客交易数据中项集间的关联规则问题,并且设计了一个算法:「Apriori 算法」。此算法通过多次扫描数据集,找出所有频繁集,然后用这些频繁集产生强关联规则。

1.1 定理 1

如果一个项集 是频繁的,则它的所有非空子集一定也是频繁的。

证明:设 是一个项集,事务数据集 中支持 的元组数为 。对 的任意非空子集为 ,设 中支持 的元组数为

根据项集支持数的定义,易知,支持 的元组一定支持 ,所以 ,即

按照假设,项集 是频繁项集。

例如,假设

1.2 定理 2

如果一个项集 是非频繁的,那么它的所有超集一定也是非频繁的。证明略。

1.3 算法

Apriori 算法通过迭代来穷举出数据集中的所有频繁集。

  1. 首先,产生 1-频繁集
  2. 其次,在 上通过连接和修建产生 2-频繁集
  3. 以此类推,可在 上通过连接和修建产生 -频繁集
  4. 最后,直到无法产生新的频繁集为止。

1.3.1 连接

自连接得到候选 k-项集 。只相差一个项目的两个项集才能进行连接,即并集操作。例如 只相差一个项目,因此它们可以连接生成 中的 无法进行连接。

1.3.2 修剪

修剪的过程是去掉子集不是频繁集的项集。Apriori 算法的性质为:一个 k-项集,如果它的一个 项集不是频繁的,那么它本身也不可能是频繁的。例如虽然 可以连接生成 ,但是由于 的子集 不是频繁集,因此需要从 中删除

1.3.3 规则生成

由频繁集产生关联规则的步骤

  1. 首先,设置最小支持度 ,利用 Apriori 算法产生所有的频繁集。

  2. 其次,设置最小可信度 ,并根据不同需要在各频繁集中确定强关联规则(通常是在最高的频繁集上确定强关联规则

  3. 最后获得强关联规则用于决策。

在得到所有频繁项集后,可以按照下面的步骤生成关联规则

  1. 对于每个频繁项集 ,生成所有非空子集
  2. 对于 的每一个非空子集 ,计算 。如果 ,那么规则 成立

1.4 例题

数据库

TID Items
10 A,C,D
20 B,C,E
30 A,B,C,E
40 B,E

取阈值

执行 Apriori 算法,经过第一次扫描得到

Itemset sup
{A} 2
{B} 3
{C} 3
{D} 1
{E} 3

其中 属于非频繁集,通过剪枝删除

Itemset sup
{A} 2
{B} 3
{C} 3
{E} 3

在 1-项集中进行拼接,并且回到原数据集进行扫描

Itemset sup
{A, B} 1
{A,C} 2
{A,E} 1
{B,C} 2
{B,E} 3
{C,E} 2

其中 {A, B} 和 {A,E} 是非频繁集,通过剪枝删除

Itemset sup
{A,C} 2
{B,C} 2
{B,E} 3
{C,E} 2

在 2-项集中进行拼接,并且回到原数据集进行扫描

Itemset sup
{A,B,C} 1
{A,B,E} 1
{B,C,E} 2

最终只有 {B,C,E} 是频繁 3-项集。综上得到频繁集为

对于频繁集 来说,它的非空子集包括

  • 关联规则 的置信度为
  • 关联规则 的置信度为
    当最小置信度设置为 时,关联规则 是强关联规则,而 不是。但如果最小置信度设置为 时,两条都是强关联规则。

1.5 改进

是项集 的一个子集,若规则 不是一条强规则,那么 也一定不是强规则。

证明:由于 ,故

又因为 不是强规则,即

所以

不是强规则。此定理可以利用已知结果排除一些肯定不是强规则的测试。如,若 不是强规则,则可断定 一定不是强规则。

是项集 的一个子集,若规则 是一条强规则,那么, 也一定是强规则。

证明:由支持度的定义

又因为 是强规则,即

由此,可以利用已知结果避免一些肯定是强规则的测试。

1.6 瓶颈

Apriori 算法的核心在于

  • 用频繁的 项集生成候选的频繁 -项集
  • 用数据库扫描和模式匹配计算候选集的支持度

Apriori 的瓶颈:候选集生成

  • 巨大的候选集:
    • 个频繁的 1-项集要生成 个候选 2-项集
    • 要找尺寸为 的频繁模式,如 ,你必须先产生 的候选集
  • 多次扫描数据库
    • 如果最长的模式是 的话,则需要 次数据库扫描

1.7 提高效率

有几种常见的提到 Apriori 效率的方法

  • 基于 Hash 的项集计数:在一个 Hash 桶内支持度小雨最小支持度的 -项集不可能是全局频繁的
  • 减少交易记录:不包含任何频繁 -项集的交易也不可能包含任何大于 的频繁集,下一步计算时删除这些记录
  • 划分:一个项集想要在整个数据集中是频繁的,那么它至少在数据库的一个分割上是频繁的。
  • 抽样:使用小的支持度+完整性验证方法,再小的抽样集上找到局部频繁项集,然后再全部数据集找频繁项集
  • 动态项集计数:再添加一个新的候选集之前。先检查一下是不是他的所有自己都是频繁的。

1.7.1 划分

把数据库从逻辑上逻辑划分为若干个互不相交的块,对每个块应用挖掘算法生成局部的频繁项集,再把这些局部的频繁项集作为候选的全局频繁项集,通过测试他们的支持度来得到最终的全局频繁项集。

优势:

  • 合理利用内存空间:数据分割将大数据集分割成小的块,为块内数据一次性导入主存提供机会
  • 支持并行挖掘算法:每个分块的局部频繁项目集是独立生成的,因此提供了开发并行数据挖掘算法的良好机制。

定理:设数据集 被划分成分块 ,全局最小支持度为 ,最小支持计数为 。如果一个数据分块 的局部最小支持计数为 ,那么,若局部支持计数 按如下方法生成

则可以保证所有的局部频繁项目集是全局频繁项目集的候选,亦即所有的局部频繁项目集涵盖全局频繁项目集。

证明:仅需证明,如果一个项谬家 在所有的数据分块内都不局部频繁,那么,项目集 在整个数据集中亦不全局频繁。

在所有的数据分块内都不局部频繁,即

其中 是项目集 在分块 的局部支持计数,则

因此, 在整个数据集中亦不全局频繁。

1.7.2 Hash

把扫描的项集根据 Hash 函数生成的桶地址放入相应的 Hash 桶中,然后对每个桶内的项集进行计数,减少候选集生成的代价。

1.7.3 抽样

抽样可显著降低扫描数据库的代价。但面临两个问题:

  1. 如何选出抽样数据?
  2. 如何防止数据扭曲,即数据偏差过大?

从本质上来说,抽样可以减少存储量和计算量,提高效率。但如何抽样才能建立能够反映整个数据分布的模型?

若大小为 的总体样本方差为 ,那么,从这个总体样本抽取的大小为 的简单随机样本的方差

一般来说 ,故

关键是找到 的估计方法