Apriori算法实验报告及程序
- 格式:doc
- 大小:220.50 KB
- 文档页数:18
Apriori算法的设计与实现1,实验要求(1)频繁项目集的计算根据题目给定的原始事务记录和最小支持度,通过迭代的方法求出各项频繁项目集。
(2)关联规则的产生根据(1)中求得频繁项目集和给定的最小可信度,求出相关的关联规则。
2.1Apriori算法的原理Apriori算法是一种最有影响的挖掘布尔关联规则频繁项集的算法。
很多的的挖掘算法是在Apriori算法的基础上进行改进的,比如基于散列(Hash)的方法,基于数据分割(Partition)的方法以及不产生候选项集的FP-GROWTH方法等。
因此要了解关联规则算法不得不先要了解Apriori算法。
Apriori算法使用一种称作逐层迭代的候选产生测试(candidate generation and test)的方法,k-项目集用于探索(k+1)-项目集。
首先,找出频繁1-项目集的集合,该集合记作L 。
L 用于找频繁2-向募集到集合L ,而L 用于找L ,如此下去,直到不能找到频繁k-项目集。
找每一个L 均需要一次数据库的扫描。
Apriori性质:频繁项集的所有非空子集必须也是频繁的。
Apriori性质基于如下观察:根据定义,如果项集I不满足最小支持度阈值,则I不是频繁的,即support(I)<min-sup。
如果项A添加到I,则结果项集(即IUA)不可能比I更频繁出现。
因此,IUA也不是频繁的,即support(IUA)<min-sup。
算法应用Apriori性质以LK-1来找LK,这一过程由连接和剪枝组成。
C :Candidate itemset of size k,即k-候选项目集。
L :frequent itemset of size k,即k-频繁项目集。
1、连接步:为找L ,通过L 与自己连接产生候选k-项集的集合。
该候选项集记作C 。
设和是L 中的项集。
记[j]表示的第j项(例如,[k-2]表示的倒数第3项)。
为方便计,假定事务或项集中的项按字典次序排列。
apriori算法实验报告Apriori 算法实验报告一、实验背景随着信息技术的快速发展,数据量呈现爆炸式增长。
如何从海量数据中挖掘出有价值的信息成为了一个重要的研究课题。
关联规则挖掘作为数据挖掘中的一个重要分支,能够发现数据中项集之间的关联关系。
Apriori 算法是关联规则挖掘中最经典、最具影响力的算法之一,它在商业、医疗、金融等领域有着广泛的应用。
二、实验目的本次实验的主要目的是深入理解和掌握 Apriori 算法的原理和实现过程,并通过实际数据进行实验,验证算法的有效性和性能,同时分析算法的优缺点,为实际应用提供参考。
三、实验原理Apriori 算法基于频繁项集的先验知识,通过逐层搜索的方式找出数据集中的频繁项集,进而生成关联规则。
其核心思想包括两个方面:一是如果一个项集是频繁的,那么它的所有子集也一定是频繁的;二是如果一个项集是非频繁的,那么它的所有超集也一定是非频繁的。
算法的实现过程主要包括以下步骤:1、首先,扫描数据集,统计每个项的出现次数,得到候选 1 项集的支持度。
根据设定的最小支持度阈值,筛选出频繁 1 项集。
2、然后,基于频繁 1 项集,通过自连接生成候选 2 项集,再次扫描数据集计算候选 2 项集的支持度,筛选出频繁 2 项集。
3、依此类推,不断通过自连接和剪枝操作生成更高阶的候选项集,并计算其支持度,筛选出频繁项集,直到没有新的频繁项集产生为止。
四、实验环境本次实验使用的编程语言为 Python,主要使用了`pandas`和`mlxtend`库来进行数据处理和算法实现。
开发环境:Jupyter Notebook操作系统:Windows 10五、实验数据实验数据采用了一个超市购物数据集,其中包含了顾客的购物记录,每条记录表示一位顾客购买的商品列表。
六、实验步骤1、数据预处理读取数据文件,将数据转换为适合算法处理的格式。
对数据进行清洗和整理,去除噪声和异常值。
2、算法实现定义计算支持度和置信度的函数。
数据挖掘Apriori算法报告一.关联算法简介关联规则地目地在于在一个数据集中找出项之间地关系,也称之为购物蓝分析(marketbasketa nalysis).例如,购买鞋地顾客,有10%地可能也会买袜子,60%地买面包地顾客,也会买牛奶.这其中最有名地例子就是”尿布和啤酒"地故事了.关联规则地应用场合.在商业销售上,关联规则可用于交叉销售,以得到更大地收入;在保险业务方面,如果出现了不常见地索赔要求组合,则可能为欺诈,需要作进一步地调查.在医疗方面,可找出可能地治疗组合;在银行方面,对顾客进行分析,可以推荐感兴趣地服务等等.Apriori algorithm 是关联规则里一项基本算法.由Rakesh Agrawal在1994年提出地,详细地介绍请猛击这里《Fast Algorithms for Mining Association Rules 》.b5E2RGbCAP一二•关联算法地基本原理该算法地基本思想是:首先找出所有地频集,这些项集出现地频繁性至少和预定义地最小支持度一样.然后由频集产生强关联规则,这些规则必须满足最小支持度和最小可信度.然后使用第1步找到地频集产生期望地规则,产生只包含集合地项地所有规则,其中每一条规则地右部只有一项,这里采用地是中规则地定义.一旦这些规则被生成,那么只有那些大于用户给定地最小可信度地规则才被留下来.为了生成所有频集,使用了递推地方法p1EanqFDPw (1)L1 = find_frequent_1-itemsets(D); // 挖掘频繁1-项集,比较容易(2)for(k=2;Lk- 1 工①;k++) { (3) Ck = apriori_gen(Lk-1 ,min_sup); // 调用apriori_gen方法生成候选频繁k-项集(4) for each transaction t € D { //扫描事务数据库D( 5) Ct = subset(Ck,t); (6) for each can didate c € Ct (7) c.cou nt++; // 统计候选频繁k-项集地计数(8) } (9) Lk ={c € Ck|c.count > min_sup} // 满足最小支持度地k-项集即为频繁k-项集(10) } (11) return L= U k Lk; //合并频繁k-项集(k>0) DXDiTa9E3d三.关联算法地C++简单实现(1)算法数据:对给定数据集用Apriori算法进行挖掘,找出其中地频繁集并生成关联规则.对下面数据集进行挖掘:对于数据集,取最小支持度 minsup=2,最小置信度 minconf=0.8.(2)算法步骤: ①首先单趟扫描数据集, 计算各个一项集地支持度, 根据给定地最小支持度闵值, 得到一项频繁集L1.② 然后通过连接运算, 得到二项候选集,对每个候选集再次扫描数据集, 得出每个候选集地支持度,再与最小支持度比较.得到二项频繁集L2. RTCrpUDGiT③ 如此进行下去,直到不能连接产生新地候选集为止④ 对于找到地所有频繁集,用规则提取算法进行关联规则地提取(3)C++算法地简单实现①首先要在工程名文件夹里自己定义date.txt文档存放数据, fp=fopen("date.txt",T');将数据导入算法.5PCzVD7HxA ②定义int countL1[1O];找到各一维频繁子集出现地次数实现出现地一维子集.4个数,所以同样地我们要定义到各二维频繁子集出现地次数出现地二维子集char cur[50][4];③定义 int SizeStr(char* m) intSizeStr(char* m) {int i=0; while(*(m+i)!=0) {i++;} return i;}④比较两个字符串,如果相等返回bool OpD(char* x,char* y)int i=0; if(SizeStr(x)==SizeStr(y)) {int cou ntL3[10]; // char curL3[20][4]; // 各三维频繁子集出现地次数 出现地三维子集然后在main 函数中用FILE*4维来放数据定义 char curL1[20][2];由于给出地数据最多有int cou ntL2[10];//char curL2[20][3]; //得到字符串地长度.实现代码如下:true,否则返回falsewhile(*(x+i)==*(y+i)){i++; if(*(x+i)==0 && *(y+i)==0)return true;}}return false;}⑤通过void LoadltemL1(char **p) 得到所有1元地字串和各自出现地次数void LoadItemL1(char **p){int i,j, n=0,k=0;char ch;char* s;int f;memset(cur,0,sizeof(cur));for(i=0;i<20;i++){curL1[i][0]=0;curL1[i][1]=0;}for(j=0;j<10;j++)cou ntL1[j]=0;for(i=0;i<10;i++)for(j=0;j<4;j++){ch=*(*(p+i)+j);if(ch==0)break;cur[n ][0]=ch;n++;}curL1[0][0]=cur[0][0];curL1[0][1]=cur[0][1];k=0;for(i=0;i<50;i++){if(cur[i]==O)break;s=cur[i];f=1;for(j=0;j<=k;j++){if(0pD(s,curL1[j])){f=0;break;}}if(f==1){++k;curL1[k][0]=cur[i][0];curL1[k][1]=cur[i][1];}}for(i=0;i<20;i++)for(j=0;j<50;j++){char* m;m=curL1[i];if(*m==0)break;if(OpD(m,cur[j]))cou ntL1[i]++;}prin tf("L1: \n ");printf(" 项集支持度计数\n");for(i=0;i<10;i++){if(curL1[i]==0)break;if(cou ntL1[i]>=2)prin tf("{l%s}: %d\n",curL1[i],co un tL1[i]);}}⑥通过void Subltem2(char **p) 得到所有地2元子串void SubItem2(char **p){int i,j,k, n=0;char* s;memset(cur,0,sizeof(cur));for(i=0;i<20;i++)curL2[i][0]=0;curL2[i][1]=0;curL2[i][2]=0;}for(i=0;i<10;i++)cou ntL2[i]=0;for(k=0;k<10;k++){s=*(p+k);if(SizeStr(s)<2)con ti nue;for(i=0;i<SizeStr(s);i++) for(j=i+1;j<SizeStr(s);j++){if(*(s+j)==0)break;*(cur[ n]+0)=*(s+i);*(cur[ n]+1)=*(s+j);*(cur[ n]+2)=0;*(cur[ n]+3)=0;n++;}}}⑦通过void LoadltemL2(char **p) 得到各个2元频繁子串出现地次数void LoadItemL2(char **p){int k,i,j;char* s;int f;SubItem2(p);curL2[0][0]=cur[0][0];curL2[0][1]=cur[0][1];curL2[0][2]=cur[0][2];k=0;for(i=0;i<50;i++){if(cur[i]==0)break;s=cur[i];f=1;for(j=0;j<=k;j++){if(OpD(s,curL2[j])){f=0;break;}}if(f==1){++k;curL2[k][0]=cur[i][0];curL2[k][1]=cur[i][1];curL2[k][2]=cur[i][2];}}for(i=0;i<20;i++)for(j=0;j<50;j++){s=curL2[i];if(*s==O)break;if(OpD(s,cur[j]))coun tL2[i]++;}prin tf("L2: \n ”);printf(" 项集支持度计数\n");for(i=0;i<10;i++){if(curL2[i]==0)break;if(cou ntL2[i]>=2)prin tf("{l%c,l%c}: %d\n" ,curL2[i][0],curL2[i][1],cou ntL2[i]);jLBHrnAILg }}⑧通过定义void Subltem3(char **p) 得到所有3元地子串void SubItem3(char **p){char *s;int i,j,h,m;int n=0;memset(cur,0,sizeof(cur));for(j=0;j<20;j++)curL3[j][0]=0;curL3[j][1]=0;curL3[j][2]=0;curL3[j][3]=0;for(i=0;i<10;i++)cou ntL3[i]=0;for(m=0;m<10;m++){s=*(p+m);if(SizeStr(s)<3)con ti nue;for(i=0;i<SizeStr(s);i++) for(j=i+1;j<SizeStr(s);j++) {for(h=j+1;h<SizeStr(s);h++){if(*(s+h)==0)break;*(cur[ n]+0)=*(s+i);*(cur[ n]+1)=*(s+j);*(cur[ n]+2)=*(s+h);*(cur[ n]+3)=0;n++;}}}}⑨同样我们要得到得到各个3元频繁子串出现地次数void LoadltemL3(char** p){int k,i,j;char* s;int f;SubItem3(p);curL3[0][0]=cur[0][0];curL3[0][1]=cur[0][1];curL3[0][2]=cur[0][2];curL3[0][3]=cur[0][3];k=0;for(i=0;i<50;i++)if(cur[i]==0)break;s=cur[i];f=1;for(j=0;j<=k;j++)if(pD(s,curL3[j])){f=0; break;}}if(f==1){++k;curL3[k][0]=cur[i][0];curL3[k][1]=cur[i][1];curL3[k][2]=cur[i][2];curL3[k][3]=cur[i][3];}}for(i=0;i<20;i++)for(j=0;j<50;j++){ s=curL3[i]; if(*s==0) break;if(OpD(s,cur[j]))coun tL3[i]++;}prin tf("L3: \n ”);printf(" 项集支持度计数\n"); for(i=0;i<10;i++){if(curL3[i]==0)break;if(cou ntL3[i]>=2)prin tf("{l%c,l%c,l%c}: %d\n",curL3[i][0],curL3[i][1],curL3[i][2],coun tL3[i]); xHAQX74J0X}}⑩定义void LoadltemL4(char** p) 得到各个3元子串出现地次数s=*(p+i);}。
Apriori算法实验陈述之五兆芳芳创作学号:姓名:专业:计较机应用技巧教师:计较机学院目录1 Apriori实验1.1 实验布景现在, 数据挖掘作为从数据中获得信息的有效办法, 越来越受到人们的重视.联系关系法则挖掘首先是用来发明购物篮数据事务中各项之间的有趣联系.从那以后, 联系关系法则就成为数据挖掘的重要研究标的目的,它是要找出隐藏在数据间的相互关系.目前联系关系法则挖掘的研究任务主要包含:Apriori算法的扩展、数量联系关系法则挖掘、联系关系法则增量式更新、无须生成候选项目集的联系关系法则挖掘、最大频繁项目集挖掘、约束性联系关系法则挖掘以及并行及散布联系关系法则挖掘算法等.联系关系法则的挖掘问题就是在事务数据库D中找出具有用户给定的满足一定条件的最小支持度Minsup和最小置信度Minconf的联系关系法则.1.1.1 国际外研究概略1993年,Agrawal等人首先提出联系关系法则概念,联系关系法则挖掘便迅速受到数据挖掘领域专家的普遍存眷.迄今联系关系法则挖掘技巧得到了较为深入的成长.Apriori算法是联系关系法则挖掘经典算法.针对该算法的缺点,许多学者提出了改良算法,主要有基于哈希优化和基于事务压缩等.1.1.2 成长趋势联系关系法则挖掘作为数据挖掘的重要研究内容之一, 主要研究事务数据库、关系数据库和其他信息存储中的大量数据项之间隐藏的、有趣的纪律.联系关系法则挖掘最初仅限于事务数据库的布尔型联系关系法则, 近年来普遍应用于关系数据库, 因此, 积极开展在关系数据库中挖掘联系关系法则的相关研究具有重要的意义.近年来,已经有良多基于Apriori算法的改良和优化.研究者还对数据挖掘的理论进行了有益的探索,将概念格和粗糙集应用于联系关系法则挖掘中,取得了显著的效果.到目前为止,联系关系法则的挖掘已经取得了令人瞩目的成绩,包含:单机情况下的联系关系法则挖掘算法;多值属性联系关系法则挖掘;联系关系法则更新算法;基于约束条件的联系关系法则挖掘;联系关系法则并行及散布挖掘算法等.1.2 实验内容与要求1.2.1 实验内容编程实现Apriori算法:要求使用‘a’,‘b’,‘c’,‘d’,‘e’,‘f’,‘g’,‘h’,‘i’,‘j’10个项目随机产生数据记实并存入数据库.从数据库读取记实进行Apriori实验,取得频繁集以及联系关系法则,实现可视化.并用课堂上PPT的实例测试其正确性.1.2.2 实验要求1、程序结构:包含前台东西和数据库;2、设定项目种类为10个,随机产生事务,生成数据库;3、正确性验证(可用课堂上的例子);4、算法效率的研究:在支持度固定数据量不合的时候丈量运行时间;在数据量固定,支持度不合的时候丈量运行时间;5、注意界面的设计,输入最小支持度和最小可信度,能够输出并显示频繁项目集以及联系关系法则.1.2.3 实验目的1、增强对Apriori算法的理解;2、锻炼阐发问题、解决问题并动手实践的能力.2 Apriori算法阐发与实验情况2.1 Apriori算法的描述Apriori算法是一种找频繁项目集的根本算法.其基来源根底理是逐层搜索的迭代:频繁K项Lk 集用于搜索频繁(K+1)项集Lk+1,如此下去,直到不克不及找到维度更高的频繁项集为止.这种办法依赖连接和剪枝这两步来实现.算法的第一次遍历仅仅计较每个项目的具体值的数量,以确定大型l项集.随后的遍历,第k次遍历,包含两个阶段.首先,使用在第(k-1)次遍历中找到的大项集Lk-1和产生候选项集Ck.接着扫描数据库,计较Ck中候选的支持度.用Hash树可以有效地确定Ck中包含在一个给定的事务t中的候选.如果某项集满足最小支持度, 则称它为频繁项集.2.2 Apriori算法的步调步调如下:1、设定最小支持度s和最小置信度c;2、Apriori算法使用候选项集.首先产生出候选的项的荟萃,即候选项集,若候选项集的支持度大于或等于最小支持度,则该候选项集为频繁项集;3、在Apriori算法的进程中,首先从数据库读入所有的事务,每个项都被看作候选1-项集,得出各项的支持度,再使用频繁1-项集荟萃来产生候选2-项集荟萃,因为先验原理包管所有非频繁的1-项集的超集都是非频繁的;4、再扫描数据库,得出候选2-项集荟萃,再找出频繁2-项集,并利用这些频繁2-项集荟萃来产生候选3-项集;5、重复扫描数据库,与最小支持度比较,产生更高条理的频繁项集,再从该荟萃里产生下一级候选项集,直到不再产生新的候选项集为止.2.3 开发情况2.3.1 软件情况(1)编程软件:Jdk开发包+eclipse集成开发情况Eclipse 是一个开放源代码的、基于Java的可扩展开发平台.就其自己而言,它只是一个框架和一组办事,用于通过插件组件构建开发情况.幸运的是,Eclipse 附带了一个尺度的插件集,包含Java开发东西(Java Development Kit,JDK).(2)数据库软件:SQL Server 2008SQL Server 2008 在Microsoft的数据平台上宣布,可以组织办理任何数据.可以将结构化、半结构化和非结构化文档的数据直接存储到数据库中.可以对数据进行查询、搜索、同步、陈述和阐发之类的操纵.数据可以存储在各类设备上,从数据中心最大的办事器一直到桌面计较机和移动设备,它都可以控制数据而不必管数据存储在哪里.(3)办公软件:Excel 2010Excel是一款办公软件.它是微软办公套装软件office的重要的组成部分,它是集统计阐发、数据处理和帮助决策等功效于一身,现在金融、统计财经、办理等众多领域普遍应用.本实验主要用来为固定数据量改动最小支持数以及固定最小支持数改动数据量两种情况进行时间阐发提供可视化图表.2.3.2 硬件情况装有Windows 7 旗舰版电脑.2.4 本章小结本章的内容主要是为了引出本实验的主要算法以及对算法的实现情况做了介绍.3 算法的设计3.1 Apriori图3.1 Apriori实验流程图3.2 主要的数据结构与函数3.2.1 数据结构class Transaction{public int pid;public String itemset;}该类暗示表中的一条记实.class Dao{public ArrayList<Transaction> Query(String sql)}该类用于拜访数据库操纵.class Kfp{public char kfpstr[]=new char[Apriori.ITEMSIZE];public int index=-1;public int support=0;public boolean isfp=true;}该类代表一个频繁项目.3.2.2 主要的程序Java 中最经常使用的荟萃类是List 和Map. List 的具体实现包含ArrayList 和Vector,它们是可变大小的列表,比较适合构建、存储和操纵任何类型对象的元素列表. List 适用于按数值索引拜访元素的情形.HashMap:Map接口的经常使用实现类,系统<key,value>当成一个整体进行处理,系统总是按照Hash算法来计较<key,value>的存储位置,这样可以包管能快速存、取 Map的<key,value>对.ArrayList<Transaction> alTransactions:保管表中的所有记实ArrayList<Kfp> alKfpsl:临时存储频繁项目的荟萃,存储连接后的结果ArrayList<Kfp> SureFpset:保管频繁k项集ArrayList<Kfp> SureFpsetPrio:保管频繁k-1项集ArrayList<String> notFpList:保管一定不是频繁项目的荟萃,用于剪枝HashMap<String, Integer> KfpSuppor:频繁项目集及其对应的支持数HashMap<String,Double> guanlianguize:联系关系法则及其置信度3.2.3 连接与剪枝操纵对于连接操纵的两个字符串(长度为k),它们必须有k-1个相同的字符才干做连接操纵.例如:abc和abd可以连接成abcd,abd和bcd可以连接成abcd,而abc和ade就不成以做连接操纵.整个连接进程类似合并排序中的合并操纵对于任一频繁项目集的所有非空子集也必须是频繁的,反之,如果某个候选的非空子集不是频繁的,那么该候选集肯定不是频繁的,将其剪枝.3.3 本章小结本章主要介绍了算法设计的整体流程并且也对主要程序和操纵作了扼要的说明.4 数据库的设计与数据的来源本实验的数据均存储于数据库中.数据库yuzm中共产生6张表.表test为测试用表,用于程序的正确性验证.还有5张表存储随机产生的实验数据.其中数据库的结构如下图所示.图4.1 数据库结构表test为PPT上的实例,用于正确性验证.数据的item个数为5,其中的九行数据均由SQL语句产生,表的每一行都是一个“0”“1”的字符串,字符串长度等于商品种类,其中“0”暗示该商品不存在,“1”暗示该商品存在.表的全部数据如图4.2.图4.2 表test4.2 实验数据5张表是通过算法随机产生的具有不合数据量的数据集,假定商品种类为10种,表的每一行都是一个“0”“1”的字符串,字符串长度等于商品种类,其中“0”暗示该商品不存在,“1”暗示该商品存在.其中表data1共随机产生1万行数据,表data2产生5万行数据,表data3产生25万行数据,表data4产生50万行数据,表data5产生75万行数据.部分数据如图4.3.图4.3 实验用表(部分)4.3 本章小结本章主要对数据库的设计与数据来源做出了说明.5 实验结果与性能阐发5.1 Apriori实验界面其中可信度可自由设置,默认为0.7.而支持度记为最小支持度与数据量的比例.实验数据可以下拉选择6张表中的任意一张.如下图所示:5.2 实验的正确性验证运行程序,我们选择表test,便可进行正确性验证,实验结果如下图:最终实验结果与ppt的结果相吻合,标明程序编写正确.5.3 实验性能阐发为了对本程序的实验进行性能阐发,我们辨别采取固定数据量改动最小支持数以及固定最小支持数改动数据量两种情况进行时间阐发,其中最小置信度设为0.7不变.设支持度为0.2,最小可信度为0.7.具体实验数据量与执行时间如下:数据量(万行) 1 5 25 50 75时间(秒)图5.3 数据量对性能的影响设实验数据量固定改动最小支持度,具体如下所示:最小支持度49时间(秒/ 1万)时间(秒/ 5万)时间(秒/ 25万)图5.4 最小支持度对性能的影响由以上实验我们可以看出,实验时间会随着数据量的增大而增大,并且随着最小支持度的增大而减小.并且他们之间的变更类似于某种指数函数的变更趋势.Apriori的时间主要消耗在4个方面:1、利用K频繁集连接产生K+1候选集时,判断连接的条件时比较的次数太多.假定项集个数为m的频繁荟萃Lk,判断连接条件时比较的时间庞杂度为O(K*m2).并且本实验的m都很大;2、对Ck中任意的一个c的k个(k-1)子集是否都在Lk-1中.在平均情况下,对所有候选k项集需要扫描次数为|Ck|*|Lk-1|*k/2;3、为了得到所有的候选频集的支持度,需要扫描N次;4、扫描一次数据库需时间O(k|T|).|T|为买卖数量,k买卖长度5.4 本章小结Apriori算法因自身需要多次扫描数据库,并且经过庞杂的连接剪枝操纵而产生大量候选集以及进行大量的模式匹配计较的缺陷,使得其在I/O上的破费时间良多,从而导致算法的效率不是太高.6 总结与体会通过本次实验,让我明白了什么是Apriori算法和数据之间的联系关系性,Apriori 算法是一种最有影响的挖掘布尔联系关系法则频繁项集的算法,为以落后步学习数据挖掘知识打下了良好的根本.同时我也加倍深刻理解了Apriori算法的原理及其实现的内部细节,同时通过实现这一经典的数据挖掘算法,也让我更深刻的体会到数据挖掘对于知识发明的重要性,尽管实现了算法,但其中可能还有可以改良的地方,尤其是程序的运行效率方面.Apriori算法实验不但使得我对该算法的理解加倍上升了一个条理,同时也使得我加倍了解了java编程语言,使用加倍得心应手.import java.awt.BorderLayout;import java.awt.Font;import java.awt.GridLayout;import java.awt.Panel;import java.awt.TextArea;import java.awt.TextField;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.util.ArrayList;import java.util.HashMap;import java.util.Iterator;import java.util.Set;import javax.swing.JButton;import javax.swing.JComboBox;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.JTextField;import org.omg.CORBA.PUBLIC_MEMBER;public class Apriori extends JFrame implements ActionListener{//////////////////////////////////////////////////////public static int ITEMSIZE=10;public final int FRAMEWIDTH=800;public final int FRAMEHEIGHT=600;///////////////////////////////////////////////////////JPanel up=null;JPanel up_up=null;TextField textFieldName[]=null;JPanel up_down=null;JPanel up_down_left=null;JLabel conflabel=null;JLabel c1=null;JLabel c2=null;JLabel c3=null;JLabel c4=null;JLabel c5=null;JLabel c6=null;JLabel c7=null;JLabel c8=null;JTextField conf=null;JLabel supportlabel=null;JTextField support=null;JPanel up_down_right=null;JComboBox jComboBoxDateSize=null;//下拉框JButton jButtonMine=null;JPanel down=null;TextArea textArea=null;int fpstep=1;int fpindex=0;Dao dao=null;double MinSupport=0.20;double MinConfi=0.70;double DateSize=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;public static void main(String[] args){Apriori A=new Apriori();}public Apriori(){JPanel up=new JPanel(new GridLayout(2, 1));JPanel up_up=new JPanel(new GridLayout(1, ITEMSIZE)); //TextField textFieldName[]=new TextField[ITEMSIZE]; //for(int i=0;i<ITEMSIZE;i++)//{//textFieldName[i]=new TextField();//up_up.add(textFieldName[i]);//}c1=new JLabel(" 数");up_up.add(c1);c2=new JLabel(" 据");up_up.add(c2);c3=new JLabel(" 挖");up_up.add(c3);c4=new JLabel(" 掘");up_up.add(c4);c5=new JLabel(" 实");up_up.add(c5);c6=new JLabel(" 验");up_up.add(c6);c7=new JLabel(" --------");up_up.add(c7);c8=new JLabel(" Apriori");up_up.add(c8);up_down=new JPanel(new GridLayout(1, 2));up_down_left=new JPanel(new GridLayout(1, 4));conflabel=new JLabel("可信度:");conf=new JTextField();conf.setText("0.7");supportlabel=new JLabel("支持度:");support=new JTextField();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=new JPanel(new GridLayout(1, 2)); jComboBoxDateSize=new JComboBox();//下拉框jComboBoxDateSize.addItem("test"); jComboBoxDateSize.addItem("data1"); jComboBoxDateSize.addItem("data2"); jComboBoxDateSize.addItem("data3"); jComboBoxDateSize.addItem("data4"); jComboBoxDateSize.addItem("data5"); jComboBoxDateSize.addActionListener(this);jButtonMine=new JButton("开始挖掘");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=new JPanel(new BorderLayout()) ;textArea=new TextArea();//textArea.setFont(new Font(Font.DIALOG,Font.ITALIC , 20)); textArea.setFont(new Font(Font.DIALOG,Font.PLAIN , 20));down.add(textArea);this.setLayout(new BorderLayout());this.setSize(FRAMEWIDTH, FRAMEHEIGHT);this.setLocation(100, 100);this.setSize(this.FRAMEWIDTH, this.FRAMEHEIGHT);this.setDefaultClo搜索引擎优化peration(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);}public void InitDate(String table){fpstep=1;AuxArr=new int[ITEMSIZE+1][ITEMSIZE+1];alKfps=new ArrayList<Kfp>();notFpList=new ArrayList<String>();SureFpset=new ArrayList<Kfp>();SureFpsetPrio=new ArrayList<Kfp>();dao=new Dao();KfpSupport=new HashMap<String, Integer>();alsurekfpstr=new ArrayList<String>();guanlianguize=new HashMap<String,Double>();isaddarrStrings=new ArrayList<String>();alTransactions=dao.Query("select * from "+table);this.DateSize=alTransactions.size();}public void ShowkFp(ArrayList<Kfp> SureFpset){int steptemp=fpstep;textArea.append("频繁"+(steptemp)+"项集\r\n");//System.out.println();for(int i=0;i<SureFpset.size();i++){Kfp k=SureFpset.get(i);int tempindex=k.index;String string=String.copyValueOf(k.kfpstr, 0, ++tempindex);int support=KfpSupport.get(string);textArea.append(string+"-----"+support+"-----"+support/DateSize+"\r\n"); //System.out.println(string+"\r\n");}}public void ShowkFp2(HashMap<String,Double> SureFpset){textArea.append("联系关系法则\r\n");Set<String> keys=(Set<String>) SureFpset.keySet();for(String keyString:keys){textArea.append(keyString+"-----------"+SureFpset.get(keyString)+"\r\n");; }}public void DataMine(){int fpsteptemp=0;if(fpstep == 1){for(int i=0;i<Apriori.ITEMSIZE;i++){Kfp kfp=new Kfp();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 (int i = 0; i < SureFpset.size(); i++){Kfp k1 = SureFpset.get(i);for (int j = i + 1; j < SureFpset.size(); j++){Kfp k2 = SureFpset.get(j);Kfp resultKfp = Joint(k1, k2);int tempindex=resultKfp.index;String string=String.copyValueOf(resultKfp.kfpstr, 0, ++tempindex);if(string.charAt(0) == 0)continue;SubSet subSet= new SubSet();ArrayList<String> alStrings=subSet.displaySubSet1(string.toCharArray()); int p=0;for(;p<alStrings.size();p++){String string2=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(int i=0;i<SureFpset.size();i++)SureFpsetPrio.add(SureFpset.get(i));Guanlianguize();SureFpset.clear();DealSupport();SaveNotFpBySupport();// Cut();if (!alKfps.isEmpty()){SaveSureFp();ShowkFp(SureFpset);}fpstep++;}}public void Guanlianguize(){for(int i=0;i<SureFpsetPrio.size();i++){Kfp k=SureFpsetPrio.get(i);int len = k.index;String string=String.copyValueOf(k.kfpstr, 0, len+1);if(!alsurekfpstr.contains(string))alsurekfpstr.add(string);}SubSet s=new SubSet();for(int i=0;i<alsurekfpstr.size();i++){String kfpstr=alsurekfpstr.get(i);char []kfpchararr=kfpstr.toCharArray();ArrayList<String> aList=s.SubSet3(kfpchararr,kfpstr.length());for(int j=0;j<aList.size();j++){String guizetemp="";String kfpstr1=aList.get(j);char []kfpchararr1=kfpstr1.toCharArray();int indexinkfp=0;int indexinchararr1=0;while(indexinkfp < kfpchararr.length && indexinchararr1 < kfpchararr1.length) {if(kfpchararr1[indexinchararr1] != kfpchararr[indexinkfp]){guizetemp=guizetemp+kfpchararr[indexinkfp];indexinkfp++;}{indexinchararr1++;indexinkfp++;}}while(indexinkfp < kfpchararr.length)guizetemp=guizetemp+kfpchararr[indexinkfp++];double support1=(double)KfpSupport.get(kfpstr);double support2=(double)KfpSupport.get(kfpstr1);if(support1/support2 > MinConfi){String temp=kfpstr1+"-------->"+guizetemp;guanlianguize.put(temp,support1/support2);}}}ShowkFp2(guanlianguize);alsurekfpstr.clear();guanlianguize.clear();}public Kfp Joint(Kfp k1,Kfp k2){Kfp resultKfp=new Kfp();int temp_len=k1.index+1;char temp1[]=new char[temp_len];char temp2[]=new char[temp_len];for(int i=0;i<=k1.index;i++){temp1[i]=k1.kfpstr[i];temp2[i]=k2.kfpstr[i];}SubSet s=new SubSet();ArrayList<String> alStrings1=s.SubSet2(temp1,fpstep);ArrayList<String> alStrings2=s.SubSet2(temp2,fpstep);char result[]=new char[temp_len+1];boolean flag=false;for(int i=0;i<alStrings1.size();i++){String tempstr=alStrings1.get(i);if(alStrings2.contains(tempstr)){int p=0;int q=0;int j=0;while(p != temp1.length && q != temp2.length){if( p != temp1.length && q != temp2.length && temp1[p] > temp2[q]) {result[j++]=temp2[q];}if(p != temp1.length && q != temp2.length && temp1[p] == temp2[q]){result[j++]=temp2[q];q++;p++;}if(p != temp1.length && q != temp2.length && temp1[p] < temp2[q]){result[j++]=temp1[p];p++;}}if(p < temp1.length){while(p!=temp1.length)result[j++]=temp1[p++];}if(q < temp2.length){//System.out.println("fpstep="+fpstep+","+"j="+j+","+"q="+q+","+"temp_len="+temp_l en);while(q!=temp2.length)result[j++]=temp2[q++];}flag=true;}if(flag == true)break;}for(int i=0;i<temp_len+1;i++){resultKfp.kfpstr[++resultKfp.index]=result[i];}return resultKfp;}public void DealSupport(){int len=alTransactions.size();for(int i=0;i<len;i++){Transaction t=alTransactions.get(i);String itemset=t.itemset;int num=0;char []tempchar=new char[ITEMSIZE];for(int i1=0;i1<itemset.length();i1++){。
第1篇一、实验概述本次数据挖掘实验以Apriori算法为核心,通过对GutenBerg和DBLP两个数据集进行关联规则挖掘,旨在探讨数据挖掘技术在知识发现中的应用。
实验过程中,我们遵循数据挖掘的一般流程,包括数据预处理、关联规则挖掘、结果分析和可视化等步骤。
二、实验结果分析1. 数据预处理在实验开始之前,我们对GutenBerg和DBLP数据集进行了预处理,包括数据清洗、数据集成和数据变换等。
通过对数据集的分析,我们发现了以下问题:(1)数据缺失:部分数据集存在缺失值,需要通过插补或删除缺失数据的方法进行处理。
(2)数据不一致:数据集中存在不同格式的数据,需要进行统一处理。
(3)数据噪声:数据集中存在一些异常值,需要通过滤波或聚类等方法进行处理。
2. 关联规则挖掘在数据预处理完成后,我们使用Apriori算法对数据集进行关联规则挖掘。
实验中,我们设置了不同的最小支持度和最小置信度阈值,以挖掘出不同粒度的关联规则。
以下是实验结果分析:(1)GutenBerg数据集在GutenBerg数据集中,我们以句子为篮子粒度,挖掘了林肯演讲集的关联规则。
通过分析挖掘结果,我们发现:- 单词“the”和“of”在句子中频繁出现,表明这两个词在林肯演讲中具有较高的出现频率。
- “and”和“to”等连接词也具有较高的出现频率,说明林肯演讲中句子结构较为复杂。
- 部分单词组合具有较高的置信度,如“war”和“soldier”,表明在林肯演讲中提到“war”时,很可能同时提到“soldier”。
(2)DBLP数据集在DBLP数据集中,我们以作者为单位,挖掘了作者之间的合作关系。
实验结果表明:- 部分作者之间存在较强的合作关系,如同一研究领域内的作者。
- 部分作者在多个研究领域均有合作关系,表明他们在不同领域具有一定的学术影响力。
3. 结果分析和可视化为了更好地展示实验结果,我们对挖掘出的关联规则进行了可视化处理。
通过可视化,我们可以直观地看出以下信息:(1)频繁项集的分布情况:通过柱状图展示频繁项集的分布情况,便于分析不同项集的出现频率。
一、前言Weka是一款流行的数据挖掘工具,其内置了多种经典的数据挖掘算法。
其中,Apriori算法是一种用于发现数据集中频繁项集的经典算法。
在本次实验中,我们将对Weka中的Apriori算法进行实验,并总结经验体会。
二、实验准备1. 数据集准备:选择一个符合Apriori算法输入要求的数据集,本次实验选取了一个包含购物篮信息的数据集,用于分析不同商品之间的关联规则。
2. Weka环境准备:确保Weka软件已经安装并能够正常运行。
三、实验步骤1. 数据集加载:我们将选取的数据集导入Weka软件中,确保数据集能够正确显示。
2. 参数设置:在Weka中,Apriori算法有一些参数需要设置,如最小支持度、最小置信度等。
根据实际需求,设置适当的参数。
3. 算法执行:执行Apriori算法,观察结果。
可以得到频繁项集、关联规则等信息。
4. 结果分析:根据算法输出的结果,分析不同项集之间的关联规则,并进行对比和总结。
四、实验结果1. 频繁项集分析:通过Apriori算法的执行,得到了数据集中的频繁项集信息。
可以发现一些商品之间的频繁组合,为进一步的关联规则分析提供了基础。
2. 关联规则分析:根据频繁项集,进一步推导出了一些关联规则。
如果购买了商品A,那么购买商品B的概率较大。
这对于商家进行商品搭配和促销活动有一定的指导作用。
3. 算法性能评估:除了得到具体的关联规则外,还可以对算法的性能进行评估。
包括算法执行时间、内存占用、参数敏感性等方面的评估。
五、实验体会1. 算法优缺点:经过实验,我们发现Apriori算法在处理大规模数据集时存在一定的计算复杂度,需要进行优化才能适应大规模数据挖掘的需求。
但在小规模数据集上,其表现仍然较为理想。
2. 参数选择经验:在实验中,我们也总结出了一些参数选择的经验,如支持度和置信度的合理选择范围,以及对于不同数据集的适应性。
3. 应用前景展望:关联规则挖掘在电商、市场营销等领域有着广泛的应用前景,我们相信在未来的实际工作中,能够将所学到的知识应用到真实的业务场景中。
Apriori算法实验报告1实验目的学会用Apriori算法对数据进行频繁项集和关联规则的挖掘,同时适当的改进Apriori算法2 实验环境程序语言:Java 实验数据:数据堂下载的模拟数据8万多条3 算法描述1 .Apriori介绍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+<li*2+<……….<li*k-1]。
将Lk-1与自身连接,如果(l1[1]=l2[1])&&( l1[2]=l2*2+)&&……..&& (l1[k-2]=l2[k-2])&&(l1[k-1]<l2[k-1]),那认为l1和l2是可连接。
连接l1和l2 产生的结果是,l1*1+,l1*2+,……,l1*k-1],l2[k-1]}。
河北大学
数学与计算机学院
实验报告
课程名称数据挖掘
实验项目编程实现Apriori算法实验仪器VC++6.0
专业____计算机软件与理论__ 学号 ******** 学生姓名乔红光
实验日期 2011年4月9日
实验地点实验室
成绩
指导教师袁方
m_List_FreqItem.SetItemText(nLargeCount,0,LargeItem[k][nLargeItemCount-1]);
m_List_FreqItem.SetItemText(nLargeCount,1,strIntToString);
UpdateWindow();
}
//复制频繁项目个数
LargeItemCount[k]=nLargeItemCount;
}
运行结果图如下:
六、实验总结:
通过本次实验,加深对Apriori算法的理解,并提高了自己的动手实践能力。
说明:
1.实验名称、实验目的、实验内容、实验要求由教师确定,实验前由教师事先填好,然后作为实验报告模版供学生使用;
2.实验准备由学生在实验或上机之前填写,教师应该在实验前检查;
3.实验过程由学生记录实验的过程,包括操作过程、遇到哪些问题以及如何解决等;
4.实验总结由学生在实验后填写,总结本次实验的收获、未解决的问题以及体会和建议等;
5.源程序、代码、具体语句等,若表格空间不足时可作为附录另外附页。
Apriori算法实验报告一、引言在数据挖掘领域,频繁项集挖掘是一项重要任务。
频繁项集指的是在一组交易记录中经常一起出现的物品集合。
Apriori算法是一种常用的频繁项集挖掘算法,其基本思想是通过迭代的方式逐渐生成和验证候选集合,从而找到频繁项集。
二、实验设计本实验旨在通过实际运用Apriori算法来挖掘某个购物网站的交易数据,从中发现频繁项集和关联规则。
实验数据集包含了一定数量的交易记录,每条记录包含了购买的商品列表。
我们将使用Python语言实现Apriori算法,并采用适当的数据结构和算法优化来提高运行效率。
三、数据预处理在进行频繁项集挖掘之前,我们首先需要对原始数据进行处理。
具体而言,需要将购买的商品列表进行编码,将商品名称映射为整数。
此外,还需要去除交易记录中的重复项,以减少数据的冗余性。
经过数据预处理后,我们得到了处理后的数据集。
四、Apriori算法实现首先,我们需要初始化候选集合。
将每个商品作为项集的初始候选项,并遍历整个数据集得到每个初始候选项的支持度。
根据设定的最小支持度阈值,过滤掉低频项,得到频繁1项集。
接下来,我们使用频繁1项集生成候选2项集。
具体而言,我们对于每个频繁1项集,两两组合,得到候选2项集,并计算其支持度。
同样根据最小支持度阈值,过滤掉低频项,得到频繁2项集。
然后,我们采用逐层迭代的方式生成更高阶的候选项集。
具体而言,我们使用频繁k-1项集生成候选k项集,然后计算其支持度,并过滤掉低频项,得到频繁k项集。
重复迭代,直到无法生成更高阶的候选项集为止。
最后,我们根据频繁项集生成关联规则。
具体而言,对于每个频繁项集,我们生成其所有非空子集,并计算其置信度。
根据设定的最小置信度阈值,过滤掉低置信度的关联规则,得到满足要求的关联规则。
五、实验结果分析经过实验运行,我们得到了购物网站交易数据的频繁项集和关联规则。
我们对实验结果进行分析如下:1. 频繁项集通过观察频繁项集,我们可以发现一些有趣的规律。
Apriori算法实验报告题目Apriori算法实现学生姓名学生学号专业班级指导教师2014-12-27实验一Apriori算法实现一、实验目的1.加强对Apriori算法的理解;2.锻炼分析问题、解决问题并动手实践的能力。
二、实验要求使用一种你熟悉的程序设计语言,如C++或Java,实现Apriori算法,至少在两种不同的数据集上比较算法的性能。
三、实验环境Win7 旗舰版+ Visual Studio 2010语言:C++四、算法描述1、Apriori算法说明在Apriori算法中,寻找频繁项集的基本思想是:A.简单统计所有含一个元素项目集出现的频率,找出不小于最小支持度的项目集, 即频繁项集;B.从第二步开始,循环处理直到再没有最大项目集生成。
循环过程是: 第k步中, 根据第k-1步生成的频繁(k-1)项集产生侯选k项集。
根据候选k项集,算出候选k项集支持度,并与最小支持度比较, 找到频繁k项集。
下文中遇到的以下符号,分别代表相应的内容k-itemset k项集Lk频繁k项集Ck侯选k项集2、Apriori算法描述数据结构说明double minsup; //设置最小支持度map<string,int> items_count; //统计各个项集的数目vector<vector<string>> datavec; //原始数据项集vector<vector<string>> candidatevec; //候选项集vector<vector<string>> frequentvec; //频繁项集ofstream outFile;int round=1; //生成项集轮次long trancount=0; //原始事务总数//判断某个项目在某一个事务中是否存在,存在则值为1,反之为0vector<map<string,bool> > bitmap;Apriori算法的第一步是简单统计所有含一个元素的项集出现的频率,来决定频繁1项集。
Apriori算法实验报告学号:姓名:专业:计算机应用技术教师:计算机学院目录1 Apriori实验错误!未定义书签。
实验背景错误!未定义书签。
国内外研究概况错误!未定义书签。
发展趋势错误!未定义书签。
实验内容与要求错误!未定义书签。
实验内容错误!未定义书签。
实验要求错误!未定义书签。
实验目的错误!未定义书签。
2 Apriori算法分析与实验环境错误!未定义书签。
Apriori算法的描述错误!未定义书签。
Apriori算法的步骤错误!未定义书签。
开发环境错误!未定义书签。
软件环境错误!未定义书签。
硬件环境错误!未定义书签。
本章小结错误!未定义书签。
3 算法的设计错误!未定义书签。
Apriori算法整体框架错误!未定义书签。
主要的数据结构与函数错误!未定义书签。
数据结构错误!未定义书签。
主要的程序错误!未定义书签。
连接与剪枝操作错误!未定义书签。
本章小结错误!未定义书签。
4 数据库的设计与数据的来源错误!未定义书签。
正确性验证数据错误!未定义书签。
实验数据错误!未定义书签。
本章小结错误!未定义书签。
5 实验结果与性能分析错误!未定义书签。
Apriori实验界面错误!未定义书签。
实验的正确性验证错误!未定义书签。
实验性能分析错误!未定义书签。
固定最小支持度改变数据量错误!未定义书签。
固定数据量改变最小支持度错误!未定义书签。
实验结果分析错误!未定义书签。
本章小结错误!未定义书签。
6 总结与体会错误!未定义书签。
1 Apriori实验实验背景现在, 数据挖掘作为从数据中获取信息的有效方法, 越来越受到人们的重视。
关联规则挖掘首先是用来发现购物篮数据事务中各项之间的有趣联系。
从那以后, 关联规则就成为数据挖掘的重要研究方向,它是要找出隐藏在数据间的相互关系。
目前关联规则挖掘的研究工作主要包括:Apriori算法的扩展、数量关联规则挖掘、关联规则增量式更新、无须生成候选项目集的关联规则挖掘、最大频繁项目集挖掘、约束性关联规则挖掘以及并行及分布关联规则挖掘算法等。
关联规则的挖掘问题就是在事务数据库D中找出具有用户给定的满足一定条件的最小支持度Minsup和最小置信度Minconf的关联规则。
1.1.1 国内外研究概况1993年,Agrawal等人首先提出关联规则概念,关联规则挖掘便迅速受到数据挖掘领域专家的广泛关注.迄今关联规则挖掘技术得到了较为深入的发展。
Apriori算法是关联规则挖掘经典算法。
针对该算法的缺点,许多学者提出了改进算法,主要有基于哈希优化和基于事务压缩等。
1.1.2 发展趋势关联规则挖掘作为数据挖掘的重要研究内容之一, 主要研究事务数据库、关系数据库和其他信息存储中的大量数据项之间隐藏的、有趣的规律。
关联规则挖掘最初仅限于事务数据库的布尔型关联规则, 近年来广泛应用于关系数据库, 因此, 积极开展在关系数据库中挖掘关联规则的相关研究具有重要的意义。
近年来,已经有很多基于Apriori算法的改进和优化。
研究者还对数据挖掘的理论进行了有益的探索,将概念格和粗糙集应用于关联规则挖掘中,获得了显著的效果。
到目前为止,关联规则的挖掘已经取得了令人瞩目的成绩,包括:单机环境下的关联规则挖掘算法;多值属性关联规则挖掘;关联规则更新算法;基于约束条件的关联规则挖掘;关联规则并行及分布挖掘算法等。
实验内容与要求实验内容编程实现Apriori算法:要求使用‘a’,‘b’,‘c’,‘d’,‘e’,‘f’,‘g’,‘h’,‘i’,‘j’10个项目随机产生数据记录并存入数据库。
从数据库读取记录进行Apriori实验,获得频繁集以及关联规则,实现可视化。
并用课堂上PPT的实例测试其正确性。
实验要求1、程序结构:包括前台工具和数据库;2、设定项目种类为10个,随机产生事务,生成数据库;3、正确性验证(可用课堂上的例子);4、算法效率的研究:在支持度固定数据量不同的时候测量运行时间;在数据量固定,支持度不同的时候测量运行时间;5、注意界面的设计,输入最小支持度和最小可信度,能够输出并显示频繁项目集以及关联规则。
实验目的1、加强对Apriori算法的理解;2、锻炼分析问题、解决问题并动手实践的能力。
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.1 软件环境(1)编程软件:Jdk开发包+eclipse集成开发环境Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。
就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。
幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。
(2)数据库软件:SQL Server 2008SQL Server 2008 在Microsoft的数据平台上发布,可以组织管理任何数据。
可以将结构化、半结构化和非结构化文档的数据直接存储到数据库中。
可以对数据进行查询、搜索、同步、报告和分析之类的操作。
数据可以存储在各种设备上,从数据中心最大的服务器一直到桌面计算机和移动设备,它都可以控制数据而不用管数据存储在哪里。
(3)办公软件:Excel 2010Excel是一款试算表办公软件。
它是微软办公套装软件office的重要的组成部分,它是集统计分析、数据处理和辅助决策等功能于一身,现在金融、统计财经、管理等众多领域广泛应用。
本实验主要用来为固定数据量改变最小支持数以及固定最小支持数改变数据量两种情况进行时间分析提供可视化图表。
2.3.2 硬件环境装有Windows 7 旗舰版电脑。
本章小结本章的内容主要是为了引出本实验的主要算法以及对算法的实现环境做了介绍。
3 算法的设计Apriori算法整体框架图Apriori实验流程图主要的数据结构与函数数据结构class Transaction{public int pid;public String itemset;}该类表示表中的一条记录。
class Dao{public ArrayList<Transaction> Query(String sql) }该类用于访问数据库操作。
class Kfp{public char kfpstr[]=new char[];public int index=-1;public int support=0;public boolean isfp=true;}该类代表一个频繁项目。
主要的程序Java 中最常用的集合类是List 和Map。
List 的具体实现包括ArrayList 和Vector,它们是可变大小的列表,比较适合构建、存储和操作任何类型对象的元素列表。
List 适用于按数值索引访问元素的情形。
HashMap:Map接口的常用实现类,系统<key,value>当成一个整体进行处理,系统总是根据Hash算法来计算<key,value>的存储位置,这样可以保证能快速存、取Map的<key,value>对。
ArrayList<Transaction> alTransactions:保存表中的所有记录ArrayList<Kfp> alKfpsl:临时存储频繁项目的集合,存储连接后的结果ArrayList<Kfp> SureFpset:保存频繁k项集ArrayList<Kfp> SureFpsetPrio:保存频繁k-1项集ArrayList<String> notFpList:保存一定不是频繁项目的集合,用于剪枝HashMap<String, Integer> KfpSuppor:频繁项目集及其对应的支持数HashMap<String,Double> guanlianguize:关联规则及其置信度连接与剪枝操作对于连接操作的两个字符串(长度为k),它们必须有k-1个相同的字符才能做连接操作。
例如:abc和abd可以连接成abcd,abd和bcd可以连接成abcd,而abc和ade就不可以做连接操作。
整个连接过程类似归并排序中的归并操作对于任一频繁项目集的所有非空子集也必须是频繁的,反之,如果某个候选的非空子集不是频繁的,那么该候选集肯定不是频繁的,将其剪枝。
本章小结本章主要介绍了算法设计的整体流程并且也对主要程序和操作作了简要的说明。
4 数据库的设计与数据的来源本实验的数据均存储于数据库中。
数据库yuzm中共产生6张表。
表test为测试用表,用于程序的正确性验证。
还有5张表存储随机产生的实验数据。
其中数据库的结构如下图所示。
图数据库结构正确性验证数据表test为PPT上的实例,用于正确性验证。
数据的item个数为5,其中的九行数据均由SQL语句产生,表的每一行都是一个“0”“1”的字符串,字符串长度等于商品种类,其中“0”表示该商品不存在,“1”表示该商品存在。
表的全部数据如图。
图表test实验数据5张表是通过算法随机产生的具有不同数据量的数据集,假设商品种类为10种,表的每一行都是一个“0”“1”的字符串,字符串长度等于商品种类,其中“0”表示该商品不存在,“1”表示该商品存在。
其中表data1共随机产生1万行数据,表data2产生5万行数据,表data3产生25万行数据,表data4产生50万行数据,表data5产生75万行数据。