Apriori算法实验报告.docx
- 文档编号:5255043
- 上传时间:2022-12-14
- 格式:DOCX
- 页数:15
- 大小:41.55KB
Apriori算法实验报告.docx
《Apriori算法实验报告.docx》由会员分享,可在线阅读,更多相关《Apriori算法实验报告.docx(15页珍藏版)》请在冰豆网上搜索。
Apriori算法实验报告
Apriori算法实验报告
一、Apriori算法的说明
在Apriori算法中,寻找最大项目集的基本思想是:
算法需要对数据集进行多步处理.第一步,简单统计所有含一个元素项目集出现的频率,并找出那些不小于最小支持度的项目集,即一维最大项目集.从第二步开始循环处理直到再没有最大项目集生成.循环过程是:
第k步中,根据第k-1步生成的(k-1)维最大项目集产生k维侯选项目集,然后对数据库进行搜索,得到侯选项目集的项集支持度,与最小支持度比较,从而找到k维最大项目集.
二、Apriori算法思想
1、主要思想就是发现频繁项目集,和生成关联规则。
程序的主要过程函数:
A.由Tid生成C1(单独生成)。
B.由Ck生成Lk。
结束之前调用打印函数print,打印出Lk,并判断是否结束调用函数Lk-1生成Ck。
(结束条件是support.size()==1。
)
C.由Lk-1生成Ck。
结束之前调用打印函数print,打印出Ck,记录次数(times)加一,并调用CK生成LK函数。
2、源程序使用的数据结构
程序主要用的是C++的vector和list模版。
●vector
●list
3、数据集
有一数据库D,其中有四个事务记录,分别表示为
TID
Items
T1
I1,I3,I4
T2
I2,I3,I5
T3
I1,I2,I3,I5
T4
I2,I5
5.源程序
#include
#include
#include
usingnamespacestd;
voidprint(list
voidLk_Ck(list
vector
intmin_sup;
doublesupport,minconfidence;
inttimes=1;
vector
voidinit(list
{
a[0].push_back("I1");
a[0].push_back("I2");
a[0].push_back("I5");
a[1].push_back("I2");
a[1].push_back("I4");
a[2].push_back("I2");
a[2].push_back("I3");
a[3].push_back("I1");
a[3].push_back("I2");
a[3].push_back("I4");
a[4].push_back("I1");
a[4].push_back("I3");
a[5].push_back("I2");
a[5].push_back("I3");
a[6].push_back("I1");
a[6].push_back("I3");
a[7].push_back("I1");
a[7].push_back("I2");
a[7].push_back("I3");
a[7].push_back("I5");
a[8].push_back("I1");
a[8].push_back("I2");
a[8].push_back("I3");
}
voidfirst_c(list
{
list
:
iteratoriter,iter_tmp,iter_tmp_old,iter_old;
inti=0;
for(;i { for(iter=tid[i].begin();iter! =tid[i].end();iter++) { c1.push_back(*iter); } } i=0; for(iter=c1.begin();iter! =c1.end();i++) { iter_old=iter; first_sup.push_back (1); for(iter_tmp=++iter;iter_tmp! =c1.end();) { iter_tmp_old=iter_tmp++; if(strcmp(*iter_old,*iter_tmp_old)==0) { first_sup[i]++; c1.erase(iter_tmp_old); } } iter=++iter_old; } printf("C%d\tsup\n",times); print(c1); } //k-侯选集产生k-频集. voidCk_Lk(list { list : iteratoriter,iter_old; lk.clear(); for(iter=c.begin();iter! =c.end();iter++) { lk.push_back(*iter); } l.clear(); inti,j,k; for(iter=c.begin(),i=0;i<(int)sup.size();) { if(sup[i] { for(j=0;j { iter_old=iter++; c.erase(iter_old); } if(++i! =sup.size()) { for(k=i-1;k<(int)sup.size()-1;k++) sup[k]=sup[k+1]; } int*p=sup.end(); sup.erase(--p); i=i-1; } else { for(j=0;j { iter++; } i++; } } vector : iteratoriter_vect,iter_vect_old; for(iter=c.begin(),iter_vect=sup.begin();iter_vect! =sup.end();) { if(*iter_vect<2) { for(j=0;j { iter_old=iter++;// c.erase(iter_old); } iter_vect_old=iter_vect++;//容器和list删除元素有差异? ! 删除iter_vect_old后,iter_vect的值怎么还原为iter_vect_old? ! ! sup.erase(iter_vect_old); } else { for(j=0;j { iter++; } iter_vect++; } } for(iter=c.begin();iter! =c.end();iter++) { l.push_back(*iter); } if(sup.size()>1) { printf("L%d\n",times); print(l); Lk_Ck(c,l,tid,tid_num); } } //times-1次比较 intmy_compare(list : iteratoriter_pre,list : iteratoriter_cur) { inti=times-1; while(i--) { if(strcmp(*(iter_pre++),*(iter_cur++))! =0) return0; } return1; } boolmycompare(list : iteratoriter)//判断是否在事务中。 { inti=times,j=0; list : iteratoriter_tid; while(i--) { for(iter_tid=t.begin();iter_tid! =t.end();iter_tid++) { if(strcmp(*iter_tid,*iter)==0) { j++; break; } } iter++; } if(j==times) { returntrue; } else returnfalse; } //(k-1)-频集产生k-侯选集. voidLk_Ck(list { c.clear(); inti,j; list : iteratoriter_cur,iter_pre; for(iter_pre=l.begin();iter_pre! =l.end();) { i=times; iter_cur=iter_pre; while(i--) { if(iter_cur==l.end()) break; iter_cur++; } if(iter_cur==l.end()) break; for(iter_cur;iter_cur! =l.end();) { list : iteratortmp_iter_pre=iter_pre,tmp_iter_cur=iter_cur; if(my_compare(tmp_iter_pre,tmp_iter_cur)==1) { tmp_iter_pre=iter_pre,tmp_iter_cur=iter_cur; for(j=0;j<=times;j++) { if(j==times) { i=times-1; while(i--) { tmp_iter_cur++; } c.push_back(*tmp_iter_cur); } else { c.push_back(*(tmp_iter_pre++)); } } } i=times; while(i--) { iter_cur++; } } i=times; while(i--) { iter_pre++; } } times++; sup.clear(); list : iteratoriter; intlen=0; for(iter=c.begin();iter! =c.end();len++) { i=times; while(i--) { iter++; } } sup.assign(len,0);//len候选集生成个数。 for(i=0;i { j=0; for(iter=c.begin();iter! =c.end();j++) { if(mycompare(tid[i],iter)==true) { sup[j]++; } intk=times; while(k--) { iter++; } } } printf("C%d\n",times); print(c); Ck_Lk(c,l,tid,tid_num); } intApriori_compare_fenzi(list { intj=0,count=0; list : iteratoriter; for(iter=t.begin();iter! =t.end();iter++) { for(j=0;j<(int)lk.size();j++) { if(strcmp(lk[j],*iter)==0) { count++; break; } } } if(count==times) return1; else return0; } intApriori_compare(list { inti=0,j=0,count=0; list : iteratoriter; for(iter=t.begin();iter! =t.end();iter++) { j=len; i=begin_flag; do{ if(strcmp(*iter,l[i])==0) count++; i++; }while(--j); } if(count==len) return1; else return0; } voidprint_Apriori(vector { inti=0,j=1; char*buf[]={"是","否"}; if(((fenzi/fenmu)-minconfidence)>0.000001) j=0; for(;i { printf("%s",l[m+i]); } printf("\t%0.2f\t%0.2f\t%s",fenzi/fenmu,support,buf[j]); printf("\n"); } voidLK_Apriori(list { vector inti=0,j=0,z=0,k=2,m=0; doublecount_fenzi=0,count_fenmu=0; l.clear(); for(;i<(int)lk.size();i++)//1=>(times-1) { l.push_back(lk[i]); l.push_back("=>"); for(j=0;j<(int)lk.size();j++) { if(j! =i) l.push_back(lk[j]); } } j=(int)l.size();//(times-1)=>1 for(i=0;i { z=times; while(--z) { l.push_back(l[k]); k++; } k+=2; l.push_back("=>"); l.push_back(l[m]); m+=(times+1); } printf("关联规则\t可信度\t支持度\t强规则? ! \n"); m=0; for(z=0;z<2*times;z++) { if((z*(times+1)) { for(i=0;i { count_fenmu+=Apriori_compare(tid[i],l,m,1); count_fenzi+=Apriori_compare_fenzi(tid[i]); } print_Apriori(l,m,count_fenzi,count_fenmu); } else { for(i=0;i { count_fenmu+=Apriori_compare(tid[i],l,m,times-1); count_fenzi+=Apriori_compare_fenzi(tid[i]); } print_Apriori(l,m,count_fenzi,count_fenmu); } m+=(times+1); } } voidprint(list { list : iteratoriter; inti,j=0; for(iter=ItemSet.begin();iter! =ItemSet.end();j++) { i=times; while(i--) { printf("%s\t",*iter); iter++; } printf("%d\n",sup[j]); } printf("\n"); } intmain() { list init(tid); inttid_num=9; support=0.5; minconfidence=0.33; min_sup=tid_num*support; first_c(tid,c,sup,tid_num); Ck_Lk(c,l,tid,tid_num);//循环生成k-候选集。 LK_Apriori(tid,tid_num);//候选集生成关联规则 return0; } 6.运行结果:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Apriori 算法 实验 报告