数据挖掘十大经典算法之apriori算法&源代码

数据挖掘十大经典算法之apriori算法&源代码

        Apriori算法是一种最有影响的挖掘布尔关联规则频繁项集的算法。其核心是基于两阶段频集思想的递推算法。该关联规则在分类上属于单维、单层、布尔关联规则在这里,所有支持度大于最小支持度的项集称为频繁项集,简称频集。
    由Agrawal等人提出的Apriori是经典的关联规则和频繁项集挖掘算法,围绕着它的改进和实现有大量的文献。该算法是挖掘产生布尔关联规则频繁项目集的经典算法,从其产生到现在对关联规则挖掘方面的研究有着很大的影响。   
    为了提高频繁项目的挖掘效率, Apriori 算法利用了两个重要的性质,用于压缩搜索的空间。
 1 】若 X 为频繁项目集,则 X 的所有子集都是频繁项目集。

 【2】若X为非频繁项目集,则X的所有超集均为非频繁项目集。

        Apriori 算法的处理流程为:宽度优先搜索整个项集空间,从 k =0 开始,迭代产生长度为 k+1 的候选项集的集合 Ck+1 。候选项集是其所有子集都是频繁项集的项集。 C1 I 0 中所有的项构成,在第 k 层产生所有长度为 k+1 的项集。这由两步完成:第一步, Fk 自连接。将 Fk 中具有相同 (k-1)- 前缀的项集连接成长度为 k 的候选项集。第二步是剪枝,如果项集的所有长度为 k 的子集都在 Fk 中,该项集才能作为候选项集被加入 Ck+1 中。为了计算所有长度为 k 的候选项集的支持度,在数据库水平表示方式下,需要扫描数据库一遍。在每次扫描中,对数据库中的每条交易记录,为其中所包含的所有候选 k - 项集的支持度计数加 1 。所有频繁的 k - 项集被加入 Fk 中。此过程直至 Ck+1 等于空集时结束。

算法  Apriori

Input:          Transaction DataBase DMinimum support threshold minsup

Output      Frequent pattern L

(1) L1=search_frequent_1-itemsets( D );

(2) for(k=2;Lk-1φ;k++do

(3) begin

(4)    Ck=apriori-gen(Lk-1);

(5)    for all transactions t D do

(6)    begin

(7)      Ct=subset(Ckt);

(8)      for all candidates c Ct do

(9)        c.count++;

(10)    end

(11)    Lk ={c Ck|c.countminsup}

(12) end

(13) Answer L=kLk;

Procedure Search_frequent_1-itemsets( D )

(1) begin

(2)  for all transactions t D do

(3)  begin

(4)    for each item ik t do

(5)      ik.count++;

(6)  end

(7)  L1 ={ i | i.countminsup}

(8)  return L1;

(9) end

Procedure apriori_gen(Lk)

(1) begin

(2)   for each itemset l1 Ldo

(3)     for each itemset l2 Ldo

(4)     begin

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

(6)       begin

(7)          c= l1 l2;

(8)          if Is_include_infrenquent_subset(c,Lkthen

(9)             delete c;

(10)         else add c to Ck+1 ;

(11)       end

(12)      end

(13)    return Ck+1 ;

(14) end

Procedure Is_include_infrenquent_subset(c,Lk)

(1)begin

(2)  for each k-subset s of c

(3)     if s Lk then

(4)       reture TURE;

(5)  return FALSE ;

(6)end

在主程序中,第一步首先扫描整个交易数据库D,统计每个项目(item)的支持数,计算其支持度,将支持度大于等于最小支持度minsup的项目构成的集合放入到L中;从第2步到第11步,用k-1频繁项目集构成的Lk-1生成候选集的集合Ck,以便从中生成Lk,其中apriori_gen函数(4)用来从Lk-1中生成Ck,然后对数据库进行扫描(5),对于数据库中的每一个交易,subset函数用来发现此交易包含的所有候选集(7),并为这些候选集的计数器加1(8-9)。最后满足minsup的候选集被放入到Lk中。

apriori_gen过程完成两种操作:并(join)和剪枝(prune)。在并运算步骤中,Lk-1 Lk-1 进行并运算生成潜在的候选集(2-7),条件l1[k-1]<l2[k-1]保证不会有重复的候选集生成(5)。在剪枝步骤中(8-10),利用性质2.1,删除那些存在子集不是频繁项目集的候选集,测试子集是否为频繁项目集由过程Is_include_infrenquent_subset完成。

为了清楚的阐述Apriori算法的挖掘过程,现举例如下:

【例1设事务数据库D如表2.1所示,D中包含4个事务,即|D|=4,最小支持数mincount=2,即最小支持度minsup=2/4=50%。挖掘频繁项目集的具体过程如下所述:C1={{A},{B},{C},{D},{F}},第一次循环产生L1={{A},{B},{C},{F}},由Apriori_gen(L1)生成C2,扫描数据库,计算C2中每个候选集得到L2。依此循环,得到L3。整个挖掘过程如图2.1所示。

事务数据库D

Tid

事务

100

200

300

400

B,C,F

A,C,D

B,F

A,B,C,F

   

 

1 Apriori算法的执行过程

在找到了事务数据库中的所有频繁项集后,利用这些频繁项集可以产生关联规则,产生关联规则的步骤如下:

(1) 对于每个频繁项目集l,产生l的所有非空子集。

(2) 对于l的每个非空子集m,如果support(l)/support(m)≥minconf,则输出规则m (l-m)”

例如,在上例中产生的频繁项目集l{B,C,F}l的非空子集有{B,C}{B,F}{C,F}{B}{C}{F},则运用上述产生关联规则的方法可以得到以下关联规则:

          B C    confidence=(2/4)/(4/4)=1

          B F    confidence=(2/4)/(3/4)=0.667

          C F    confidence=(2/4)/(2/4)=1

          F B    confidence=(2/4)/(3/4)= 0.667

          C B    confidence=(2/4)/(3/4)= 0.667

          B C    confidence=(2/4)/(3/4)= 0.667


参考来源:
1.http://blog.sina.com.cn/s/blog_4cdd083e01013juf.html
2.http://blog.sina.com.cn/s/blog_6fb7db430100vdcf.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值