Apriori算法是挖掘布尔关联规则频繁项集的算法Apriori算法利用频繁项集性质的先验知识(priorknowledge),通过逐层搜索的迭代方法,即将k-项集用于探察(k+1)-项集,来穷尽数据集中的所有频繁项集。先找到频繁1-项集集合L1,然后用L1找到频繁2-项集集合L2,接着用L2找L3,直到找不到频繁k-项集,找每个Lk需要一次数据库扫描。APRIORI算法Apriori算法利用的是Apriori性质:频繁项集的所有非空子集也必须是频繁的。模式不可能比A更频繁的出现Apriori算法是反单调的,即一个集合如果不能通过测试,则该集合的所有超集也不能通过相同的测试。Apriori性质通过减少搜索空间,来提高频繁项集逐层产生的效率算法应用经典的关联规则数据挖掘算法Apriori算法广泛应用于各种领域,通过对数据的关联性进行了分析和挖掘,挖掘出的这些信息在决策制定过程中具有重要的参考价值。Apriori算法广泛应用于商业中,应用于消费市场价格分析中,它能够很快的求出各种产品之间的价格关系和它们之间的影响。通过数据挖掘,市场商人可以瞄准目标客户,采用个人股票行市、最新信息、特殊的市场推广活动或其他一些特殊的信息手段,从而极大地减少广告预算和增加收入。百货商场、超市和一些老字型大小的零售店也在进行数据挖掘,以便猜测这些年来顾客的消费习惯。Apriori算法应用于网络安全领域,比如时候入侵检测技术中。早期中大型的电脑系统中都收集审计信息来建立跟踪档,这些审计跟踪的目的多是为了性能测试或计费,因此对攻击检测提供的有用信息比较少。它通过模式的学习和训练可以发现网络用户的异常行为模式。采用作用度的Apriori算法削弱了Apriori算法的挖掘结果规则,是网络入侵检测系统可以快速的发现用户的行为模式,能够快速的锁定攻击者,提高了基于关联规则的入侵检测系统的检测性。Apriori算法应用于高校管理中。随着高校贫困生人数的不断增加,学校管理部门资助工作难度也越加增大。针对这一现象,提出一种基于数据挖掘算法的解决方法。将关联规则的Apriori算法应用到贫困助学体系中,并且针对经典Apriori挖掘算法存在的不足进行改进,先将事务数据库映射为一个布尔矩阵,用一种逐层递增的思想来动态的分配内存进行存储,再利用向量求与运算,寻找频繁项集。实验结果表明,改进后的Apriori算法在运行效率上有了很大的提升,挖掘出的规则也可以有效地辅助学校管理部门有针对性的开展贫困助学工作。算法思想该算法的基本思想是:首先找出所有的频集,这些项集出现的频繁性至少和预定义的最小支持度一样。然后由频集产生强关联规则,这些规则必须满足最小支持度和最小可信度。然后使用第1步找到的频集产生期望的规则,产生只包含集合的项的所有规则,其中每一条规则的右部只有一项,这里采用的是中规则的定义。一旦这些规则被生成,那么只有那些大于用户给定的最小可信度的规则才被留下来。为了生成所有频集,使用了递归的方法。算法实现Apriori算法利用频繁项集性质的先验知识(priorknowledge),通过逐层搜索的迭代方法,即将k-项集用于探察(k+1)-项集,来穷尽数据集中的所有频繁项集。先找到频繁1-项集集合L1,然后用L1找到频繁2-项集集合L2,接着用L2找L3,直到找不到频繁k-项集,找每个Lk需要一次数据库扫描。Apriori算法由连接和剪枝两个步骤组成。连接:为了找Lk,通过Lk-1与自己连接产生候选k-项集的集合,该候选k项集记为Ck。Lk-1中的两个元素L1和L2可以执行连接操作的条件是Ck是Lk的超集,即它的成员可能不是频繁的,但是所有频繁的k-项集都在Ck中(为什么?)。因此可以通过扫描数据库,通过计算每个k-项集的支持度来得到Lk。为了减少计算量,可以使用Apriori性质,即如果一个k-项集的(k-1)-子集不在Lk-1中,则该候选不可能是频繁的,可以直接从Ck删除。])1[]1[(])2[]2[(...])2[]2[(])1[]1[(21212121klklklklllll21ll算法:Apriori。使用逐层迭代方法基于候选产生找出频繁项集。输入:D:实物数据库;Min_sup:最小支持度计数阈值。输出:L:D中的频繁项集。方法:L1=find_frequent_1-itemsets(D);for(k=2;Lk-1!=¢;k++){Ck=apriori_gen(Lk-1);Foreach事务t∈D{//扫描D用于计数Ct=subset(Ck,t);//得到t的子集,它们是候选foreach候选c∈C;C.count++;}Lk={c∈C|c.count=min_stp}}returnL=UkLk;Apriori伪代码Procedureapriori_gen(Lk-1:frequent(k-1)-itemsets)foreach项集l1∈Lk-1foreach项集l2∈Lk-1If(l1[1]=l2[1])^(l1[2]=l2[2])^…(l1[k-2]=l2[k-2])^(l1[k-1]=l2[k-1])then{c=l1∞l2//连接步:产生候选ifhas_infrequent_subset(c,Lk-1)thendeletec;//剪枝部;删除非频繁的候选elseaddctoCk;}returnCk;procedurehas_infrequent_subset(c:candidatek-itemset;Lk-1:frequent(k-1)-itemset)//使用先验知识foreach(k-1)-subsetsofcIfs∉Lk-1thenreturnTRUE;returnFALSE;DatabaseTDB1stscanC1L1L2C2C22ndscanC3L33rdscanTidItems10A,C,D20B,C,E30A,B,C,E40B,EItemsetsup{A}2{B}3{C}3{D}1{E}3Itemsetsup{A}2{B}3{C}3{E}3Itemset{A,B}{A,C}{A,E}{B,C}{B,E}{C,E}Itemsetsup{A,B}1{A,C}2{A,E}1{B,C}2{B,E}3{C,E}2Itemsetsup{A,C}2{B,C}2{B,E}3{C,E}2Itemset{A,B,C}{B,C,E}Itemsetsup{B,C,E}21.连接:C3=L2L2={{A,C},{B,C},{B,E}{C,E}}{{A,C},{B,C},{B,E}{C,E}}={{A,B,C},{A,C,E},{B,C,E}}2.使用Apriori性质剪枝:频繁项集的所有子集必须是频繁的,对候选项C3,我们可以删除其子集为非频繁的选项:{A,B,C}的2项子集是{A,B},{A,C},{B,C},其中{A,B}不是L2的元素,所以删除这个选项;{A,C,E}的2项子集是{A,C},{A,E},{C,E},其中{A,E}不是L2的元素,所以删除这个选项;{B,C,E}的2项子集是{B,C},{B,E},{C,E},它的所有2-项子集都是L2的元素,因此保留这个选项。3.这样,剪枝后得到C3={{B,C,E}}从以上的算法执行过程可以看到Apriori算法的缺点:第一:在每一步产生侯选项目集时循环产生的组合过多,没有排除不应该参与组合的元素;第二:每次计算项集的支持度时,都对数据库D中的全部记录进行了一遍扫描比较,如果是一个大型的数据库的话,这种扫描比较会大大增加计算机系统的I/O开销。而这种代价是随着数据库的记录的增加呈现出几何级数的增加。因此人们开始寻求一种能减少这种系统1/O开销的更为快捷的算法。Apriori算法的缺点改进Apriori算法的方法方法1:基于hash表的项集计数将每个项集通过相应的hash函数映射到hash表中的不同的桶中,这样可以通过将桶中的项集技术跟最小支持计数相比较先淘汰一部分项集。方法2:事务压缩(压缩进一步迭代的事务数)不包含任何k-项集的事务不可能包含任何(k+1)-项集,这种事务在下一步的计算中可以加上标记或删除。方法3:划分挖掘频繁项集只需要两次数据扫描D中的任何频繁项集必须作为局部频繁项集至少出现在一个部分中。第一次扫描:将数据划分为多个部分并找到局部频繁项集第二次扫描:评估每个候选项集的实际支持度,以确定全局频繁项集。方法4:选样(在给定数据的一个子集挖掘)基本思想:选择原始数据的一个样本,在这个样本上用Apriori算法挖掘频繁模式通过牺牲精确度来减少算法开销,为了提高效率,样本大小应该以可以放在内存中为宜,可以适当降低最小支持度来减少遗漏的频繁模式可以通过一次全局扫描来验证从样本中发现的模式可以通过第二此全局扫描来找到遗漏的模式方法5:动态项集计数在扫描的不同点添加候选项集,这样,如果一个候选项集已经满足最少支持度,则在可以直接将它添加到频繁项集,而不必在这次扫描的以后对比中继续计算方法4:选样(在给定数据的一个子集挖掘)基本思想:选择原始数据的一个样本,在这个样本上用Apriori算法挖掘频繁模式通过牺牲精确度来减少算法开销,为了提高效率,样本大小应该以可以放在内存中为宜,可以适当降低最小支持度来减少遗漏的频繁模式可以通过一次全局扫描来验证从样本中发现的模式可以通过第二此全局扫描来找到遗漏的模式方法5:动态项集计数在扫描的不同点添加候选项集,这样,如果一个候选项集已经满足最少支持度,则在可以直接将它添加到频繁项集,而不必在这次扫描的以后对比中继续计算一种Apriori的改进算法实现在Apriori算法中,寻找最大项目集的基本思路是:第一步:简单统计所有含一个元素的项目出现的频率,并找出那些大于或等于最小支持度的项目集,产生一维频繁项目集Lt。第二步:循环处理直到未能再产生维数更高的频繁项目集。循环过程是:在第k步中,根据k-1步生成的k-1维频繁项目集来产生k维候选项目集,由于在产生k-1维频繁项目集时,我们可以实现对该集中出现元素的个数进行计数处理,因此对某元素而言,若它的计数个数不到k-1的话,可以事先删除该元素,从而排除由该元素将引起的大规格所有组合。第三步:按Apriori算法再检验新的K维频繁项目集的所有k-1维项目集是否已经包含在已经求出的K-1维频繁项目集。若其中有一个没有包含,则也可删去该组合,这样得到一个真正有用的K维频繁项目集选项目集。第四步:得到了这个候选项目集后,可以对数据库D的每一个事务tid进行扫描,若该事务中至少含有候选项目集CK中的一员,则保留该项事务,否则把该事物记录与数据库末端没有作删除标记的事务记录对换,并对移到数据库末端的事务记录作删除标一记,整个数据库扫描完毕后为新的事务数据库D’中。一种Apriori的改进算法实现算法的图例说明算法的评价:我们可以看到本算法的思路基本上与Apriori算法保持一致,但是又有不同之处。第一,改进的算法在考虑组合Ck前,对将参与组合的元素进行计数处理,根据计数结果决定排除一些不符合组合条件的元素,这就降低了组合的可能性,即降低循环判断的次数。第二,改进的算法对数据库进行了扫描后的重新生成,虽然会在记录重写中浪费时间和I/O的开销,但是随着循环次数的增加,本算法对以后在‘新生成的数据库’中的扫描比较次数很快减少将逐渐体现出来。