Apriori算法研究报告

算法原理

背景知识

Apriori算法是Agrawal等于1994年提出的一个挖掘顾客交易数据库中项集间的关联规则的重要方法,是迄今最有影响挖掘布尔关联规则频繁项集的关联规则算法。该关联规则在分类上属于单维、单层、布尔关联规则。

算法原理

Apriori算法主要分成两步:首先找出数据中所有的频繁项集,这些项集出现的频繁性要大于或等于最小支持度。然后由频繁项集产生强关联规则,这些规则必须满足最小支持度和最小置信度。算法的总体性能由第一步决定,第二步相对容易实现。

第一步主要是基于Apriori性质:频繁项集的所有非空子集都必须也是频繁的。因此这一步主要由连接和剪枝两个过程组成。连接:频繁项集Lk-1与自己连接产生候选k-项集的集合Ck。假定事务和项集都按字典次序排序。连接Lk-1Lk-1,Lk-1中的l1和l2项是可连接的,如果(l1[1]=l2[1] )∧(l1[2]=l2[2] )∧…∧(l1[k-2]=l2[k-2] )∧(l1[k-1]<l2[k-1] ),连接的结果项集为l1[1] l1[2]…l1[k-1]l2[k-1]。剪枝:若一个候选k-项集的(k-1)-子集不在Lk-1中,则该候选集不可能是频繁的,可由Ck中删除。

Ck可存在hash-tree中。

发现频繁项集的Apriori算法的伪码如下:

输入:事务数据库D;最小支持度阈值min_sup。

输出:D中的频繁项集L。

(1)                  L1 = find_frequent_1-itemsets(D);   //找出频繁1-项集

(2)                  for (k = 2;  Lk-1 ¹ F;  k++)

(3)                  {

(4)                      Ck= apriori_gen(Lk-1, min_sup);   //产生新的候选集

(5)                      for all transactions tÎD

(6)                      {

(7)                           Ct=subset(Ck, t);    //事务t中包含的候选集

(8)                           for all candidates cÎ Ct

(9)                              c.count++;

(10)                   }

(11)                   Lk = {c Î Ck | c.count³min_sup}

(12)               }

(13)                return  L = ∪k Lk;

 

procedure apriori_gen(Lk-1,min_sup)

(1)            for all l1∈Lk-1

(2)            {

(3)              for all l2∈Lk-1

(4)              {

(5)                  if (l1[1]=l2[1] )∧(l1[2]=l2[2] )∧…∧(l1[k-2]=l2[k-2] )∧(l1[k-1]<l2[k-1])

(6)                  then

(7)                  {

(8)                       c = l1 ∞ l2;                      //连接

(9)                       if has_infrequent_subset(c, Lk-1) then

(10)                        delete c;           //剪枝

(11)                    else add c to Ck;

(12)                }

(13)            }

(14)         }

(15)         return  Ck;

 

procedure has_infrequent_subset(c,Lk-1)

(1)            for all (k -1)-subset s of c

(2)            {

(3)                if sLk-1 then

(4)                   return  TRUE;

(5)            }

(6)            return FALSE

 

第二步由频繁项集产生关联规则如下:

l  对每个频繁项集l,产生l的所有非空子集。

l  对l的每个非空子集s,如果,则产生规则“s(l-s)”。min_conf是最小置信度。

 

限制条件

算法只能处理单维、单层的种类字段。

这个方法要求多次扫描可能很大的交易数据库,这需要很大的I/O负载,因此处理的数据量不能太大。

输出结果

算法输出事务数据库中的关联规则,规则形如AB。

算法优点和缺点

优点:

l  提出了利用Apriori性质挖掘频繁项集产生关联规则的思想,对以后的关联规则算法有深远的影响。

l  提出的Apriori性质大幅压缩了候选项集的大小,提高了性能。

l  可用来提高冰山查询的效率。

缺点:

l  只能处理单维、单层的种类字段

l  可能产生大量的候选集,

l  可能需要重复扫描数据库,I/O负担大。

改进:

对Apriori算法的改进已有许多方法,如散列,事务压缩,划分和选样等,都是基于减少数据扫描次数的思想。但都不如FP-Tree的改进彻底,有效。

 

事务数据库 D

例子

 

处理:假定最小支持计数为2。

L1

根据最小支持度,产生频繁1-项集

第一步:产生频繁项集

 

 

C2

C3

 

 

 

 

 

 

 

 

 

得到频繁项集:{{1};{2};{3};{5};{1, 3};{2, 3};{2, 5};{3, 5};{2, 3, 5}}

 

第2步:由频繁项集产生关联规则,假定最小置信度为70%

1)        对频繁项集{1, 3},它的非空子集为{1},{3}。

对{1},;所以输出规则1→3;

对{3},;所以不输出规则;

2)        对频繁项集{2, 3},它的非空子集为{2},{3}。

对{2},;所以不输出规则;

对{3},;所以不输出规则;

3)        对频繁项集{2, 5},它的非空子集为{2},{5}。

对{2},;所以输出规则2→5;

对{5},;所以输出规则5→2;

4)        对频繁项集{3, 5},它的非空子集为{3},{5}。

对{3},;所以不输出规则;

对{5},;所以输出规则;

5)        对频繁项集{2,3, 5},它的非空子集为{2},{3},{5},{2, 3},{2, 5},{3, 5}。

对{2},;所以不输出规则;

对{3},;所以不输出规则;

对{5},;所以输出规则;

对{2,3},;所以输出规则2∧3→5;

对{2,5},;所以不输出规则;

对{3,5},;所以输出规则3∧5→2;

 

得到关联规则1→3;2→5;5→2;2∧3→5;3∧5→2。

C3

L1

Speak Your Mind

*