2021年Apriori算法实验报告及程序_第1页
2021年Apriori算法实验报告及程序_第2页
2021年Apriori算法实验报告及程序_第3页
2021年Apriori算法实验报告及程序_第4页
2021年Apriori算法实验报告及程序_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

*欧阳光明*创编 2021.03.07Apriori算法实验报告欧阳光明(2021.03.07)学号:姓名:专业:计算机应用技术教师:计算机学院目录Apriori实验1.1实验背景现在,数据挖掘作为从数据中获取信息的有效方法,越来越受到人们的重视。关联规则挖掘首先是用来发现购物篮数据事务中各项之间的有趣联系。从那以后,关联规则就成为数据挖掘的重要研究方向,它是要找出隐藏在数据间的相互关系。目前关联规则挖掘的研究工作主要包括:Apriori算法的扩展、数量关联规则挖掘、关联规则增量式更新、无须生成候选项目集的关联规则挖掘、最大频繁项目集挖掘、约束性关联规则挖掘以及并行及分布关联规则挖掘算法等。关联规则的挖掘问题就是在事务数据库D中找出具有用户给定的满足一定条件的最小支持度Minsup和最小置信度Minconf的关联规则。1.1.1国内外研究概况1993年,Agrawal等人首先提出关联规则概念,关联规则挖掘便迅速受到数据挖掘领域专家的广泛关注.迄今关联规则挖掘技术得到了较为深入的发展。Apriori算法是关联规则挖掘经典算法。针对该算法的缺点,许多学者提出了改进算法,主要有基于哈希优化和基于事务压缩等。1.1.2发展趋势关联规则挖掘作为数据挖掘的重要研究内容之一,主要研究事务数据库、关系数据库和其他信息存储中的大量数据项之间隐藏的、有趣的规律。关联规则挖掘最初仅限于事务数据库的布尔型关联规则,近年来广泛应用于关系数据库,因此,积极开展在关系数据库中挖掘关联规则的相关研究具有重要的意义。近年来,已经有很多基于Apriori算法的改进和优化。研究者还对数据挖掘的理论进行了有益的探索,将概念格和粗糙集应用于关联规则挖掘中,获得了显著的效果。到目前为止,关联规则的挖掘已经取得了令人瞩目的成绩,包括:单机环境下的关联规则挖掘算法;多值属性关联规则挖掘;关联规则更新算法;基于约束条件的关联规则挖掘;关联规则并行及分布挖掘算法等。1.2实验内容与要求实验内容编程实现Apriori算法:要求使用‘a',‘b',‘c',‘d',‘e',‘F,‘g',‘h',‘i',‘j'10个项目随机产生数据记录并存入数据库。从数据库读取记录进行Apriori实验,获得频繁集以及关联规则,实现可视化。并用课堂上PPT的实例测试其正确性。实验要求1、 程序结构:包括前台工具和数据库;2、 设定项目种类为10个,随机产生事务,生成数据库;3、 正确性验证(可用课堂上的例子);4、 算法效率的研究:在支持度固定数据量不同的时候测量运行时间;在数据量固定,支持度不同的时候测量运行时间;5、 注意界面的设计,输入最小支持度和最小可信度,能够输出并显示频繁项目集以及关联规则。实验目的1、 加强对Apriori算法的理解;2、 锻炼分析问题、解决问题并动手实践的能力。Apriori算法分析与实验环境Apriori算法的描述Apriori算法是一种找频繁项目集的基本算法。其基本原理是逐层搜索的迭代:频繁K项Lk集用于搜索频繁(K+1)项集Lk+1,如此下去,直到不能找到维度更高的频繁项集为止。这种方法依赖连接和剪枝这两步来实现。算法的第一次遍历仅仅计算每个项目的具体值的数量,以确定大型l项集。随后的遍历,第k次遍历,包括两个阶段。首先,使用在第(k-1)次遍历中找到的大项集Lk-1和产生候选项集Ck。接着扫描数据库,计算Ck中候选的支持度。用Hash树可以有效地确定Ck中包含在一个给定的事务t中的候选。如果某项集满足最小支持度,则称它为频繁项集。Apriori算法的步骤步骤如下:1、 设定最小支持度S和最小置信度C;2、 Apriori算法使用候选项集。首先产生出候选的项的集合,即候选项集,若候选项集的支持度大于或等于最小支持度,则该候选项集为频繁项集;3、 在Apriori算法的过程中,首先从数据库读入所有的事务,每个项都被看作候选1-项集,得出各项的支持度,再使用频繁1-项集集合来产生候选2-项集集合,因为先验原理保证所有非频繁的1-项集的超集都是非频繁的;4、 再扫描数据库,得出候选2-项集集合,再找出频繁2-项集,并利用这些频繁2-项集集合来产生候选3-项集;5、 重复扫描数据库,与最小支持度比较,产生更高层次的频繁项集,再从该集合里产生下一级候选项集,直到不再产生新的候选项集为止。2.3开发环境2.3.1软件环境编程软件:Jdk开发包+eclipse集成开发环境Eclipse是一个开放源代码的、基于Java的可扩展开发平台。就其本身而||言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,||Eclipse附带了一个标准的插件集,包括Java开发工具(JavaDevelopmentjKit,JDK)O数据库软件:SQLServer2008在Microsoft的数据平台上发布,可以组织管理任何数据。可以将结构化、半结构化和非结构化文档的数据直接存储到数据库中。可以对数据进行查询、搜索、同步、报告和分析之类的操作。数据可以存储在各种设备上,从数据中心最大的服务器一直到桌面计算机和移动设备,它都可以控制数据而不用管数据存储在哪里。办公软件:Excel2010Excel是一款办公软件。它是微软办公套装软件office的重要的组成部分,它是集统计分析、数据处理和辅助决策等功能于一身,现在金融、统计财经、管理等众多领域广泛应用。本实验主要用来为固定数据量改变最小支持数以及固定最小支持数改变数据量两种情况进行时间分析提供可视化图表。2.3.2硬件环境装有Windows7旗舰版电脑。2.4本章小结本章的内容主要是为了引出本实验的主要算法以及对算法的实现环境做了介绍。*欧阳光明*创编算法的设计3.1Apriori算法整体框架Apriori开始是Apriori结束图3.1Apriori实验流程图主要的数据结构与函数3.2.1数据结构classTransaction{publicintpid;publicStringitemset;}该类表示表中的一条记录。classDao{publicArrayList<Transaction>Query(Stringsql)}该类用于访问数据库操作。classKfp{publiccharkfpstr[]=newchar[Apriori.ITEMSIZE];publicintindex=-1;publicintsupport=0;publicbooleanisfp=true;}该类代表一个频繁项目。3.2.2主要的程序Java中最常用的集合类是List和Map。List的具体实现包括ArrayList和Vector,它们是可变大小的列表,比较适合构建、存储和操作任何类型对象的元素列表。List适用于按数值索引访问元素的情形。HashMap:Map接口的常用实现类,系统vkey,value>当成一个整体进行处理,系统总是根据Hash算法来计算vkey,value>的存储位置,这样可以保证能快速存、取Map的vkey,value>对。ArrayListvTransaction>alTransactions:保存表中的所有记录ArrayListvKfp>alKfpsl:临时存储频繁项目的集合,存储连接后的结果ArrayListvKfp〉SureFpset:保存频繁k项集ArrayListvKfp>SureFpsetPrio:保存频繁k-1项集ArrayListvString>notFpList:保存一定不是频繁项目的集合,用于剪枝HashMapvString,Integer〉KfpSuppor:频繁项目集及其对应的支持数HashMapvString,Double>guanlianguize:关联规则及其置信度3.2.3连接与剪枝操作对于连接操作的两个字符串(长度为k),它们必须有k-1个相同的字符才能做连接操作。例如:abc和abd可以连接成abcd,abd和bcd可以连接成abcd,而abc和ade就不可以做连接操作。整个连接过程类似归并排序中的归并操作对于任一频繁项目集的所有非空子集也必须是频繁的,反之,如果某个候选的非空子集不是频繁的,那么该候选集肯定不是频繁的,将其剪枝。本章小结本章主要介绍了算法设计的整体流程并且也对主要程序和操作作了简要的说明。数据库的设计与数据的来源本实验的数据均存储于数据库中。数据库yuzm中共产生6张表。表test为测试用表,用于程序的正确性验证。还有5张表存储随机产生的实验数据。其中数据库的结构如下图所示。yu^niiE口站库奘案囹日□表®口貳统表国Hdbo.datal®3dbc.dataS®3dbo.data5(±)口dbo.te5.t0口视圍田口同交词图4.1数据库结构4.1正确性验证数据表test为PPT上的实例,用于正确性验证。数据的item个数为5,其中的九行数据均由SQL语句产生,表的每一行都是一个“0”“1”的字符串,字符串长度等于商品种类,其中“0”表示该商品不存在,“1”表示该商品存在。表的全部数据如图4.2。4.2实验数据5张表是通过算法随机产生的具有不同数据量的数据集,假设商品种类为10种,表的每一行都是一个“0”“1”的字符串,字符串长度等于商品种类,其中“0”表示该商品不存在,“1”表示该商品存在。其中表data1共随机产生1万行数据,表data2产生5万行数据,表data3产生25万行数据,表data4产生50万行数据,表data5产生75万行数据。部分数据如图4.3。iditem13900111100111401011110000MlOOILIOQQOO1420101001111143000010110014411011100111451010000000W10011101111471100011000图4疏.3实验用表0000111111(部分)本章小结本章主要对数据库的设计与数据来源做出了说明。实验结果与性能分析5.1Apriori实验界面其中可信度可自由设置,默认为0.7。而支持度记为最小支持度与数据量的比例。实验数据可以下拉选择6张表中的任意一张。如下图所示:

图5.1实验界面5.2实验的正确性验证运行程序,我们选择表test,即可进行正确性验证,实验结果如下图:图5.2正确性验证最终实验结果与ppt的结果相吻合,表明程序编写正确。5.3实验性能分析为了对本程序的实验进行性能分析,我们分别采用固定数据量改变最小支持数以及固定最小支持数改变数据量两种情况进行时间分析,其中最小置信度设为0.7不变。5.3.1固定最小支持度改变数据量设支持度为0.2,最小可信度为0.7。具体实验数据量与执行时间如下:表5.1数据量对性能的影响数据量(万彳丁)15255075时间(秒)48.2128.2366.9623.41032.3

5.3.2固定数据量改变最小支持度设实验数据量固定改变最小支持度,具体如下所示:(秒门万)(秒/5(秒门万)(秒/5万;1(秒/廿万)图5.4最小支持度对性能的影响•时间■■一时间表5.2最小支持度对性能的影响最小支持度50.300.35时间(秒/1万)175.649时间(秒/5万)294.1128.258.841.525.7时间(秒/25万)531.3366.9246.5185.6154.05.3.3实验结果分析由以上实验我们可以看出,实验时间会随着数据量的增大而增大,并且随着最小支持度的增大而减小。并且他们之间的变化类似于某种指数函数的变化趋势。Apriori的时间主要消耗在4个方面:1、利用K频繁集连接产生K+1候选集时,判断连接的条件时比较的次数太多。假设项集个数为m的频繁集合Lk,判断连接条件时比较的时间复杂度为0(K*m2)。而且本实验的m都很大;2、 对Ck中任意的一个c的k个(k-1)子集是否都在Lk-1中。在平均情况下,对所有候选k项集需要扫描次数为ICkl*ILk-1l*k/2;3、 为了得到所有的候选频集的支持度,需要扫描N次;4、 扫描一次数据库需时间O(kITI)。ITI为交易数量,k交易长度本章小结Apriori算法因自身需要多次扫描数据库,并且经过复杂的连接剪枝操作而产生大量候选集以及进行大量的模式匹配计算的缺陷,使得其在I/O上的花费时间很多,从而导致算法的效率不是太高。6总结与体会通过本次实验,让我明白了什么是Apriori算法和数据之间的关联性,Apriori算法是一种最有影响的挖掘布尔关联规则频繁项集的算法,为以后进步学习数据挖掘知识打下了良好的基础。同时我也更加深刻理解了Apriori算法的原理及其实现的内部细节,同时通过实现这一经典的数据挖掘算法,也让我更深刻的体会到数据挖掘对于知识发现的重要性,尽管实现了算法,但其中可能还有可以改进的地方,尤其是程序的运行效率方面。Apriori算法实验不仅使得我对该算法的理解更加上升了一个层次,同时也使得我更加了解了java编程语言,使用更加得心应手。importjava.awt.BorderLayout;importjava.awt.Font;importjava.awt.GridLayout;importjava.awt.Panel;importjava.awt.TextArea;importjava.awt.TextField;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.Iterator;importjava.util.Set;importjavax.swing.JButton;importjavax.swing.JComboBox;importjavax.swing.JFrame;importjavax.swing.JLabel;importjavax.swing.JPanel;importjavax.swing.JTextField;importorg.omg.CORBA.PUBLIC_MEMBER;publicclassAprioriextendsJFrameimplementsActionListener{//////////////////////////////////////////////////////publicstaticintITEMSIZE=10;publicfinalintFRAMEWIDTH=800;publicfinalintFRAMEHEIGHT=600;///////////////////////////////////////////////////////JPanelup=null;JPanelup_up=null;TextFieldtextFieldName[]=null;JPanelup_down=null;JPanelup_down_left=null;JLabelconflabel=null;JLabelc1=null;JLabelc2=null;JLabelc3=null;JLabelc4=null;JLabelc5=null;JLabelc6=null;JLabelc7=null;JLabelc8=null;JTextFieldconf=null;JLabelsupportlabel=null;JTextFieldsupport=null;JPanelup_down_right=null;JComboBoxjComboBoxDateSize=null;〃下拉框JButtonjButtonMine=null;JPaneldown=null;TextAreatextArea=null;intfpstep=1;intfpindex=0;Daodao=null;doubleMinSupport=0.20;doubleMinConfi=0.70;doubleDateSize=9.0;ArrayList<Transaction>alTransactions=null;ArrayList<Kfp>alKfps=null;ArrayList<String>notFpList=null;ArrayList<Kfp>SureFpset=null;ArrayList<Kfp>SureFpsetPrio=null;HashMap<String,Integer>KfpSupport=null;ArrayList<String>alsurekfpstr=null;HashMap<String,Double>guanlianguize=null;ArrayList<String>isaddarrStrings=null;int[][]AuxArr=null;publicstaticvoidmain(String[]args){AprioriA=newApriori();}publicApriori(){JPanelup=newJPanel(newGridLayout(2,1));JPanelup_up=newJPanel(newGridLayout(1,ITEMSIZE));//TextFieldtextFieldName[]=newTextField[ITEMSIZE];//for(inti=0;i<ITEMSIZE;i++)//{//textFieldName[i]=newTextField();//up_up.add(textFieldName[i]);//}c1=newJLabel("数");up_up.add(c1);c2=newJLabel("据");up_up.add(c2);c3=newJLabel("挖");up_up.add(c3);c4=newJLabel("掘");up_up.add(c4);c5=newJLabel("实");up_up.add(c5);c6=newJLabel("验");up_up.add(c6);c7=newJLabel(" ");up_up.add(c7);c8=newJLabel("Apriori");up_up.add(c8);up_down=newJPanel(newGridLayout(1,2));up_down_left=newJPanel(newGridLayout(1,4));conflabel=newJLabel("可信度:”);conf=newJTextField();conf.setText("0.7");supportlabel=newJLabel("支持度:");support=newJTextField();support.setText("0.2");up_down_left.add(conflabel);up_down_left.add(conf);up_down_left.add(supportlabel);up_down_left.add(support);up_down_right=newJPanel(newGridLayout(1,2));jComboBoxDateSize=newJComboBox();〃下拉框jComboBoxDateSize.addItem("test");jComboBoxDateSize.addItem("data1");jComboBoxDateSize.addItem("data2");jComboBoxDateSize.addItem("data3");jComboBoxDateSize.addItem("data4");jComboBoxDateSize.addItem("data5");jComboBoxDateSize.addActionListener(this);jButtonMine=newJButton("开始挖掘");jButtonMine.addActionListener(this);up_down_right.add(jComboBoxDateSize);up_down_right.add(jButtonMine);up_down.add(up_down_left);up_down.add(up_down_right);up.add(up_up);up.add(up_down);down=newJPanel(newBorderLayout());textArea=newTextArea();//textArea.setFont(newFont(Font.DIALOG,Font.ITALIC,20));textArea.setFont(newFont(Font.DIALOG,Font.PLAIN,20));down.add(textArea);this.setLayout(newBorderLayout());this.setSize(FRAMEWIDTH,FRAMEHEIGHT);this.setLocation(100,100);this.setSize(this.FRAMEWIDTH,this.FRAMEHEIGHT);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setTitle("Apriori");//up.setSize(this.FRAMEWIDTH,100);this.add(up,BorderLayout.NORTH);//down.setLocation(0,100);//down.setSize(this.FRAMEWIDTH,this.FRAMEHEIGHT-100);this.add(down);this.setVisible(true);}publicvoidInitDate(Stringtable){fpstep=1;AuxArr=newint[ITEMSIZE+1][ITEMSIZE+1];alKfps=newArrayList<Kfp>();notFpList=newArrayList<String>();SureFpset=newArrayList<Kfp>();SureFpsetPrio=newArrayList<Kfp>();dao=newDao();KfpSupport=newHashMap<String,Integer>();alsurekfpstr=newArrayList<String>();guanlianguize=newHashMap<String,Double>();isaddarrStrings=newArrayList<String>();alTransactions=dao.Query("select*from"+table);this.DateSize=alTransactions.size();}publicvoidShowkFp(ArrayList<Kfp>SureFpset){intsteptemp=fpstep;textArea.append("频繁"+(steptemp)+"项集\r\n");//System.out.println();for(inti=0;i<SureFpset.size();i++){Kfpk=SureFpset.get(i);inttempindex=k.index;Stringstring=String.copyValueOf(k.kfpstr,0,++tempindex);intsupport=KfpSupport.get(string);textArea.append(string+" "+support+" "+support/DateSize+"\r\n");//System.out.println(string+"\r\n");}}publicvoidShowkFp2(HashMap<String,Double>SureFpset){textArea.append(”关联规则\r\n");Set<String>keys=(Set<String>)SureFpset.keySet();for(StringkeyString:keys){textArea.append(keyString+" "+SureFpset.get(keyString)+"\r\n");;}}publicvoidDataMine(){intfpsteptemp=0;if(fpstep==1){for(inti=0;i<Apriori.ITEMSIZE;i++){Kfpkfp=newKfp();kfp.kfpstr[++kfp.index]=(char)('a'+i);kfp.support=0;kfp.isfp=false;alKfps.add(kfp);}DealSupport();SaveNotFpBySupport();SaveSureFp();ShowkFp(alKfps);fpstep++;}while(!alKfps.isEmpty()){alKfps.clear();for(inti=0;i<SureFpset.size();i++){Kfpk1=SureFpset.get(i);for(intj=i+1;j<SureFpset.size();j++){Kfpk2=SureFpset.get(j);KfpresultKfp=Joint(k1,k2);inttempindex=resultKfp.index;Stringstring=String.copyValueOf(resultKfp.kfpstr,0,++tempindex);if(string.charAt(0)==0)continue;SubSetsubSet=newSubSet();ArrayList<String>alStrings=subSet.displaySubSet1(string.toCharArray());intp=0;for(;p<alStrings.size();p++){Stringstring2=alStrings.get(p);if(notFpList.contains(string2))break;}if(p!=alStrings.size())continue;if(!isaddarrStrings.contains(string)){isaddarrStrings.add(string);alKfps.add(resultKfp);}}}SureFpsetPrio.clear();for(inti=0;i<SureFpset.size();i++)SureFpsetPrio.add(SureFpset.get(i));Guanlianguize();SureFpset.clear();DealSupport();SaveNotFpBySupport();//Cut();if(!alKfps.isEmpty()){SaveSureFp();ShowkFp(SureFpset);}fpstep++;}}publicvoidGuanlianguize(){for(inti=0;i<SureFpsetPrio.size();i++){Kfpk=SureFpsetPrio.get(i);intlen=k.index;Stringstring=String.copyValueOf(k.kfpstr,0,len+1);if(!alsurekfpstr.contains(string))alsurekfpstr.add(string);}SubSets=newSubSet();for(inti=0;i<alsurekfpstr.size();i++){Stringkfpstr=alsurekfpstr.get(i);char[]kfpchararr=kfpstr.toCharArray();ArrayList<String>aList=s.SubSet3(kfpchararr,kfpstr.length());for(intj=0;j<aList.size();j++){Stringguizetemp="";Stringkfpstr1=aList.get(j);char[]kfpchararr1=kfpstr1.toCharArray();intindexinkfp=0;intindexinchararr1=0;while(indexinkfp<kfpchararr.length&&indexinchararr1<kfpchararr1.length){if(kfpchararr1[indexinchararr1]!=kfpchararr[indexinkfp]){guizetemp=guizetemp+kfpchararr[indexinkfp];indexinkfp++;}else{indexinchararr1++;indexinkfp++;}}while(indexinkfp<kfpchararr.length)guizetemp=guizetemp+kfpchararr[indexinkfp++];doublesupport1=(double)KfpSupport.get(kfpstr);doublesupport2=(double)KfpSupport.get(kfpstr1);if(support1/support2>MinConfi){Stringtemp=kfpstr1+" >"+guizetemp;guanlianguize.put(temp,support1/support2);}}}ShowkFp2(guanlianguize);alsurekfpstr.clear();guanliangui

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论