数据挖掘课后作业5.4(实现项目)使用你熟悉的程序设计语言(如C++或Java),实现本章介绍的三种频繁项集挖掘算法:(1)Apriori[AS94B],(2)FP增长[HPY00]和(3)ECLAT[Zak00](使用垂直数据格式挖掘)。在各种类型的大型数据集上比较每种算法的性能。写一个报告,分析在哪些情况下(如数据大小、数据分布、最小支持阀度值设置和模式的稠密度),某种算法比其他算法好,并陈述理由。三种算法的比较1、对与项集较大,频繁项集较分散,是一个稀疏型的数据集,性能为Apriori>FP-growth>Eclat2、对与数据集的项集较小,数据非常稠密的数据集,性能为:FP-growth>Apriori>Eclat各算法采用的数据表示模式及挖掘策略不同。采用优化措施后的Apriori算法,对于非稠密数据己经具有较高的效率,其性能甚至优于FP-growth算法;但由于其采用的是广度优先的挖掘策略,对稠密数据效率仍较差。而Eclat算法采用的纵向表示法,对数据集较小的稠密数据,效率相对较高;但对于数据集较大的稀疏数据,效率较低,FP一树浓缩了数据库的主要信息,分而治之的挖掘策略也使挖掘问题的复杂程度有所降低。答:(1)Apriori算法的实现:使用Java语言实现Apriori算法,AprioriAlgorithm类包含了频繁项集的挖掘过程和频繁关联规则的挖掘过程;ProperSubsetCombination辅助类用于计算一个频繁项集的真子集,采用组合原理,基于数值编码原理实现的组合求解集合的真子集。Apriori算法的核心实现类为AprioriAlgorithm,实现的Java代码如下所示:(一)核心类packageorg.shirdrn.datamining.association;importjava.util.HashMap;importjava.util.HashSet;importjava.util.Iterator;importjava.util.Map;importjava.util.Set;importjava.util.TreeMap;/**1*
关联规则挖掘:Apriori算法**
该算法基本上按照Apriori算法的基本思想来实现的。*/publicclassAprioriAlgorithm{privateMap>txDatabase;//事务数据库privateFloatminSup;//最小支持度privateFloatminConf;//最小置信度privateIntegertxDatabaseCount;//事务数据库中的事务数privateMap>>freqItemSet;//频繁项集集合privateMap,Set>>assiciationRules;//频繁关联规则集合publicAprioriAlgorithm(Map>txDatabase,FloatminSup,FloatminConf){this.txDatabase=txDatabase;this.minSup=minSup;this.minConf=minConf;this.txDatabaseCount=this.txDatabase.size();freqItemSet=newTreeMap>>();assiciationRules=newHashMap,Set>>();}/***扫描事务数据库,计算频繁1-项集*@return*/publicMap,Float>getFreq1ItemSet(){Map,Float>freq1ItemSetMap=newHashMap,Float>();Map,Integer>candFreq1ItemSet=this.getCandFreq1ItemSet();Iterator,Integer>>it=candFreq1ItemSet.entrySet().iterator();2while(it.hasNext()){Map.Entry,Integer>entry=it.next();//计算支持度Floatsupported=newFloat(entry.getValue().toString())/newFloat(txDatabaseCount);if(supported>=minSup){freq1ItemSetMap.put(entry.getKey(),supported);}}returnfreq1ItemSetMap;}/***计算候选频繁1-项集*@return*/publicMap,Integer>getCandFreq1ItemSet(){Map,Integer>candFreq1ItemSetMap=newHashMap,Integer>();Iterator>>it=txDatabase.entrySet().iterator();//统计支持数,生成候选频繁1-项集while(it.hasNext()){Map.Entry>entry=it.next();SetitemSet=entry.getValue();for(Stringitem:itemSet){Setkey=newHashSet();key.add(item.trim());if(!candFreq1ItemSetMap.containsKey(key)){Integervalue=1;candFreq1ItemSetMap.put(key,value);}else{Integervalue=1+candFreq1ItemSetMap.get(key);candFreq1ItemSetMap.put(key,value);}...