Apriori算法

Posted 悟空很开心

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Apriori算法相关的知识,希望对你有一定的参考价值。

一、Apriori算法简介: Apriori算法是一种挖掘关联规则的频繁项集算法,其核心思想是通过候选集生成和情节的向下封闭检测两个阶段来挖掘频繁项集。 Apriori(先验的,推测的)算法应用广泛,可用于消费市场价格分析,猜测顾客的消费习惯;网络安全领域中的入侵检测技术;可用在用于高校管理中,根据挖掘规则可以有效地辅助学校管理部门有针对性的开展贫困助学工作;也可用在移动通信领域中,指导运营商的业务运营和辅助业务提供商的决策制定。

二、挖掘步骤:

1.依据支持度找出所有频繁项集(频度)

2.依据置信度产生关联规则(强度)

三、基本概念

对于A->B

①支持度:P(A ∩ B),既有A又有B的概率

②置信度:

P(B|A),在A发生的事件中同时发生B的概率 p(AB)/P(A) 例如购物篮分析:牛奶 ⇒ 面包

例子:[支持度:3%,置信度:40%]

支持度3%:意味着3%顾客同时购买牛奶和面包

置信度40%:意味着购买牛奶的顾客40%也购买面包

③如果事件A中包含k个元素,那么称这个事件A为k项集事件A满足最小支持度阈值的事件称为频繁k项集。

④同时满足最小支持度阈值和最小置信度阈值的规则称为强规则

四、实现步骤

Apriori算法是一种最有影响的挖掘布尔关联规则频繁项集的算法Apriori使用一种称作逐层搜索的迭代方法,“K-1项集”用于搜索“K项集”。

首先,找出频繁“1项集”的集合,该集合记作L1。L1用于找频繁“2项集”的集合L2,而L2用于找L3。如此下去,直到不能找到“K项集”。找每个Lk都需要一次数据库扫描。

核心思想是:连接步和剪枝步。连接步是自连接,原则是保证前k-2项相同,并按照字典顺序连接。剪枝步,是使任一频繁项集的所有非空子集也必须是频繁的。反之,如果某

个候选的非空子集不是频繁的,那么该候选肯定不是频繁的,从而可以将其从CK中删除。
简单的讲,1、发现频繁项集,过程为(1)扫描(2)计数(3)比较(4)产生频繁项集(5)连接、剪枝,产生候选项集 重复步骤(1)~(5)直到不能发现更大的频集

2、产生关联规则,过程为:根据前面提到的置信度的定义,关联规则的产生如下:

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

(2)对于L的每个非空子集S,如果

            P(L)/P(S)≧min_conf

则输出规则“SàL-S”

注:L-S表示在项集L中除去S子集的项集

五 Apriori算法伪代码实现:

伪代码描述:  
 // 找出频繁 1 项集  
     L1 =find_frequent_1-itemsets(D);   
     For(k=2;Lk-1 !=null;k++)  
// 产生候选,并剪枝  
        Ck =apriori_gen(Lk-1 );   
// 扫描 D 进行候选计数  
        For each 事务t  in D   
            Ct =subset(Ck,t); // 得到 t 的子集  
            For each 候选 c 属于 Ct  
                c.count++;  
          
        //返回候选项集中不小于最小支持度的项集  
        Lk =c 属于 Ck | c.count>=min_sup  
  
Return L= 所有的频繁集;  
第一步:连接(joinProcedure apriori_gen (Lk-1 :frequent(k-1)-itemsets)  
      For each 项集 l1 属于 Lk-1  
         For each 项集 l2 属于 Lk-1  
            If( (l1 [1]=l2 [1])&&( l1 [2]=l2 [2])&& ……&& (l1 [k-2]=l2 [k-2])&&(l1 [k-1]<l2 [k-1]) )   
then  
                    c = l1 连接 l2    // 连接步:产生候选  
                  //若k-1项集中已经存在子集c则进行剪枝  
                   if has_infrequent_subset(c, Lk-1 ) then  
                       delete c; // 剪枝步:删除非频繁候选  
                   else add c to Ck;  
                     
          Return Ck;  
第二步:剪枝(prune)   
 Procedure has_infrequent_sub (c:candidate k-itemset; Lk-1 :frequent(k-1)-itemsets)  
         For each (k-1)-subset s of c  
            If s 不属于 Lk-1 then  
               Return true;  
        Return false;  

六 Apriori算法例子:

七、总结:

①Apriori算法的缺点:(1)由频繁k-1项集进行自连接生成的候选频繁k项集数量巨大。(2)在验证候选频繁k项集的时候需要对整个数据库进行扫描,非常耗时。

②网上提到的频集算法的几种优化方法:1. 基于划分的方法。2. 基于hash的方法。3. 基于采样的方法。4. 减少交易的个数。

我重点看了“基于划分的方法”改进算法,现在简单介绍一下实现思想:

基于划分(partition)的算法,这个算法先把数据库从逻辑上分成几个互不相交的块,每次单独考虑一个分块并 对它生成所有的频集,然后把产生的频集合并,用来生成所有可能的频集,最后计算这些项集的支持度。

其中,partition算法要注意的是分片的大小选取,要保证每个分片可以被放入到内存。当每个分片产生频集后,再合并产生产生全局的候选k-项集。若在多个处理器分片,可以通过处理器之间共享一个杂凑树来产生频集。

看这个图基本再对照伪代码,基本就可以看懂了~简单明了。

以上是关于Apriori算法的主要内容,如果未能解决你的问题,请参考以下文章

Apriori算法

Apriori 算法 - 选择交易列表

数据挖掘中的模式发现Apriori算法

多维关联规则挖掘算法r语言能实现吗

Apriori 实现关联分析

Apriori 实现关联分析