Apriori算法及java实现.docx
- 文档编号:229571
- 上传时间:2022-10-07
- 格式:DOCX
- 页数:11
- 大小:59.05KB
Apriori算法及java实现.docx
《Apriori算法及java实现.docx》由会员分享,可在线阅读,更多相关《Apriori算法及java实现.docx(11页珍藏版)》请在冰豆网上搜索。
1Apriori介绍
Apriori算法使用频繁项集的先验知识,使用一种称作逐层搜索的迭代方法,k项集用于探索(k+1)项集。
首先,通过扫描事务(交易)记录,找出所有的频繁1项集,该集合记做L1,然后利用L1找频繁2项集的集合L2,L2找L3,如此下去,直到不能再找到任何频繁k项集。
最后再在所有的频繁集中找出强规则,即产生用户感兴趣的关联规则。
其中,Apriori算法具有这样一条性质:
任一频繁项集的所有非空子集也必须是频繁的。
因为假如P(I)< 最小支持度阈值,当有元素A添加到I中时,结果项集(A∩I)不可能比I出现次数更多。
因此A∩I也不是频繁的。
2 连接步和剪枝步
在上述的关联规则挖掘过程的两个步骤中,第一步往往是总体性能的瓶颈。
Apriori算法采用连接步和剪枝步两种方式来找出所有的频繁项集。
1) 连接步
为找出Lk(所有的频繁k项集的集合),通过将Lk-1(所有的频繁k-1项集的集合)与自身连接产生候选k项集的集合。
候选集合记作Ck。
设l1和l2是Lk-1中的成员。
记li[j]表示li中的第j项。
假设Apriori算法对事务或项集中的项按字典次序排序,即对于(k-1)项集li,li[1]
将Lk-1与自身连接,如果(l1[1]=l2[1])&&(l1[2]=l2[2])&&……..&&(l1[k-2]=l2[k-2])&&(l1[k-1] 连接l1和l2 产生的结果是{l1[1],l1[2],……,l1[k-1],l2[k-1]}。 2) 剪枝步 CK是LK的超集,也就是说,CK的成员可能是也可能不是频繁的。 通过扫描所有的事务(交易),确定CK中每个候选的计数,判断是否小于最小支持度计数,如果不是,则认为该候选是频繁的。 为了压缩Ck,可以利用Apriori性质: 任一频繁项集的所有非空子集也必须是频繁的,反之,如果某个候选的非空子集不是频繁的,那么该候选肯定不是频繁的,从而可以将其从CK中删除。 (Tip: 为什么要压缩CK呢? 因为实际情况下事务记录往往是保存在外存储上,比如数据库或者其他格式的文件上,在每次计算候选计数时都需要将候选与所有事务进行比对,众所周知,访问外存的效率往往都比较低,因此Apriori加入了所谓的剪枝步,事先对候选集进行过滤,以减少访问外存的次数。 ) 3 Apriori算法实例 交易ID 商品ID列表 T100 I1,I2,I5 T200 I2,I4 T300 I2,I3 T400 I1,I2,I4 T500 I1,I3 T600 I2,I3 T700 I1,I3 T800 I1,I2,I3,I5 T900 I1,I2,I3 上图为某商场的交易记录,共有9个事务,利用Apriori算法寻找所有的频繁项集的过程如下: 详细介绍下候选3项集的集合C3的产生过程: 从连接步,首先C3={{I1,I2,I3},{I1,I2,I5},{I1,I3,I5},{I2,I3,I4},{I2,I3,I5},{I2,I4,I5}}(C3是由L2与自身连接产生)。 根据Apriori性质,频繁项集的所有子集也必须频繁的,可以确定有4个候选集{I1,I3,I5},{I2,I3,I4},{I2,I3,I5},{I2,I4,I5}}不可能时频繁的,因为它们存在子集不属于频繁集,因此将它们从C3中删除。 注意,由于Apriori算法使用逐层搜索技术,给定候选k项集后,只需检查它们的(k-1)个子集是否频繁。 3. Apriori伪代码 算法: Apriori 输入: D- 事务数据库;min_sup- 最小支持度计数阈值 输出: L-D中的频繁项集 方法: L1=find_frequent_1-itemsets(D);// 找出所有频繁1项集 For(k=2;Lk-1! =null;k++){ Ck=apriori_gen(Lk-1);// 产生候选,并剪枝 Foreach 事务tinD{// 扫描D进行候选计数 Ct =subset(Ck,t);// 得到t的子集 Foreach 候选c 属于 Ct c.count++; } Lk={c属于Ck |c.count>=min_sup} } ReturnL=所有的频繁集; Procedureapriori_gen(Lk-1: frequent(k-1)-itemsets) Foreach项集l1属于Lk-1 Foreach项集 l2属于Lk-1 If((l1[1]=l2[1])&&(l1[2]=l2[2])&&…….. &&(l1[k-2]=l2[k-2])&&(l1[k-1] c=l1连接l2 //连接步: 产生候选 ifhas_infrequent_subset(c,Lk-1)then deletec;//剪枝步: 删除非频繁候选 elseaddctoCk; } ReturnCk; Procedurehas_infrequent_sub(c: candidatek-itemset;Lk-1: frequent(k-1)-itemsets) Foreach(k-1)-subsetsofc Ifs不属于Lk-1 then Returntrue; Returnfalse; 4. 由频繁项集产生关联规则 Confidence(A->B)=P(B|A)=support_count(AB)/support_count(A) 关联规则产生步骤如下: 1) 对于每个频繁项集l,产生其所有非空真子集; 2) 对于每个非空真子集s,如果support_count(l)/support_count(s)>=min_conf,则输出 s->(l-s),其中,min_conf是最小置信度阈值。 例如,在上述例子中,针对频繁集{I1,I2,I5}。 可以产生哪些关联规则? 该频繁集的非空真子集有{I1,I2},{I1,I5},{I2,I5},{I1},{I2}和{I5},对应置信度如下: I1&&I2->I5 confidence=2/4=50% I1&&I5->I2 confidence=2/2=100% I2&&I5->I1 confidence=2/2=100% I1->I2&&I5 confidence=2/6=33% I2->I1&&I5 confidence=2/7=29% I5->I1&&I2 confidence=2/2=100% 如果min_conf=70%,则强规则有I1&&I5->I2,I2&&I5->I1,I5->I1&&I2。 5. AprioriJava代码 packagecom.apriori; importjava.util.ArrayList; importjava.util.Collections; importjava.util.HashMap; importjava.util.List; importjava.util.Map; importjava.util.Set; publicclassApriori{ privatefinalstaticintSUPPORT=2;// 支持度阈值 privatefinalstaticdoubleCONFIDENCE=0.7;// 置信度阈值 privatefinalstaticStringITEM_SPLIT=";";// 项之间的分隔符 privatefinalstaticStringCON="->";// 项之间的分隔符 privatefinalstaticList static{//初始化交易记录 transList.add("1;2;5;"); transList.add("2;4;"); transList.add("2;3;"); transList.add("1;2;4;"); transList.add("1;3;"); transList.add("2;3;"); transList.add("1;3;"); transList.add("1;2;3;5;"); transList.add("1;2;3;"); } publicMap Map frequentCollectionMap.putAll(getItem1FC()); Map itemkFcMap.putAll(getItem1FC()); while(itemkFcMap! =null&&itemkFcMap.size()! =0){ Map Set //对候选集项进行累加计数 for(Stringtrans: transList){ for(Stringcandidate: ccKeySet){ booleanflag=true;// 用来判断交易中是否出现该候选项,如果出现,计数加1 String[]candidateIte
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Apriori 算法 java 实现