R.Agrawal 等人于 1993 年提出了数据挖掘顾客交易数据中项集间的关联规则问题,并且设计了一个算法:「Apriori 算法」。此算法通过多次扫描数据集,找出所有频繁集,然后用这些频繁集产生强关联规则。
如果一个项集
证明:设
根据项集支持数的定义,易知,支持
按照假设,项集
例如,假设
如果一个项集
Apriori 算法通过迭代来穷举出数据集中的所有频繁集。
用
修剪的过程是去掉子集不是频繁集的项集。Apriori 算法的性质为:一个 k-项集,如果它的一个
由频繁集产生关联规则的步骤
首先,设置最小支持度
其次,设置最小可信度
最后获得强关联规则用于决策。
在得到所有频繁项集后,可以按照下面的步骤生成关联规则
数据库
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-项集。综上得到频繁集为
对于频繁集
设
证明:由于
又因为
即
设
证明:由支持度的定义
故
又因为
由此,可以利用已知结果避免一些肯定是强规则的测试。
Apriori 算法的核心在于
Apriori 的瓶颈:候选集生成
有几种常见的提到 Apriori 效率的方法
把数据库从逻辑上逻辑划分为若干个互不相交的块,对每个块应用挖掘算法生成局部的频繁项集,再把这些局部的频繁项集作为候选的全局频繁项集,通过测试他们的支持度来得到最终的全局频繁项集。
优势:
定理:设数据集
则可以保证所有的局部频繁项目集是全局频繁项目集的候选,亦即所有的局部频繁项目集涵盖全局频繁项目集。
证明:仅需证明,如果一个项谬家
若
其中
因此,
把扫描的项集根据 Hash 函数生成的桶地址放入相应的 Hash 桶中,然后对每个桶内的项集进行计数,减少候选集生成的代价。
抽样可显著降低扫描数据库的代价。但面临两个问题:
从本质上来说,抽样可以减少存储量和计算量,提高效率。但如何抽样才能建立能够反映整个数据分布的模型?
若大小为
一般来说
关键是找到