ImageVerifierCode 换一换
格式:DOCX , 页数:18 ,大小:100.05KB ,
资源ID:5738093      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5738093.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Apriori算法实验报告.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Apriori算法实验报告.docx

1、Apriori算法实验报告题 目Apriori算法实现学生XX学生学号专业班级指导教师2014-12-27实验一Apriori算法实现一、 实验目的1.加强对Apriori算法的理解;2.锻炼分析问题、解决问题并动手实践的能力。二、 实验要求使用一种你熟悉的程序设计语言,如C+或Java,实现Apriori算法,至少在两种不同的数据集上比较算法的性能。三、 实验环境Win7 旗舰版 + Visual Studio 2010语言:C+四、 算法描述1、 Apriori算法说明在Apriori算法中,寻找频繁项集的基本思想是:A.简单统计所有含一个元素项目集出现的频率,找出不小于最小支持度的项目集

2、, 即频繁项集;B.从第二步开始,循环处理直到再没有最大项目集生成。循环过程是: 第k步中, 根据第k-1步生成的频繁(k-1)项集产生侯选k项集。根据候选k项集,算出候选k项集支持度,并与最小支持度比较, 找到频繁k项集。下文中遇到的以下符号,分别代表相应的内容k-itemsetk项集Lk频繁k项集Ck侯选k项集2、 Apriori算法描述数据结构说明double minsup; /设置最小支持度map items_count; /统计各个项集的数目vectorvector datavec; /原始数据项集vectorvector candidatevec; /候选项集vectorvecto

3、r frequentvec; /频繁项集ofstreamoutFile;int round=1; /生成项集轮次long trancount=0; /原始事务总数/判断某个项目在某一个事务中是否存在,存在则值为1,反之为0vectormap bitmap;Apriori算法的第一步是简单统计所有含一个元素的项集出现的频率,来决定频繁1项集。在第k步,分两个阶段:1,用函数genCanItemsetK,通过第(k-1)步中生成的频繁(k-1)项集来生成侯选k项集;2.计算侯选k项集的支持度,并找出频繁k项集。Apriori算法描述如下getOriData(); /获取原始数据集,并统计事务个数g

4、enCanItemset1(); /产生输出候选1项集genFreItemset1(); /产生频繁项集if(!frequentvec.empty() /根据频繁1项集,执行程序 do genCanItemsetK(); /生成并输出候选k项集genFreItemsetK(); /计算并输出频繁k项集while(!frequentvec.empty(); /频繁项集不为空,则循环继续 其中,产生候选k项集函数genCanItemsetK中涉与两个重要函数,项集合并函数mergeItem和剪枝函数cutNotCanItemsetK。3、 函数方法说明/获取原始数据集,并统计事务个数voidget

5、OriData();/合并生成新的候选项集vector mergeItem(vector vect1,vector vect2,int round);/判断项集item是否已经存在候选项集集合items中,存在则返回1intisExist(vector item,vectorvector items);/产生并输出候选1项集void genCanItemset1();/产生并输出频繁1项集void genFreItemset1();/产生并输出候选k-项集(k=2)voidgenCanItemsetK();/产生并输出频繁k-项集(k=2)voidgenFreItemsetK();/剪枝:剪去

6、合并后项集中含有非频繁项集中的项voidcutNotCanItemsetK(vector & item);五、 实验截图1.程序运行界面2.输出文件截图13.输出文件截图1六、 实验总结做完这个实验,有如下收获:1.同一数据集,最小支持度越小,那么产生的频繁项集维数越高,程序运行时间越长;2.更加深刻理解了:频繁子集的任何子集一定是频繁的,子集频繁父亲一定频繁;3.Apriori也存在缺点:第一在每一步产生侯选项目集时循环产生的组合过多,没有排除不应该参与组合的元素;第二,每次计算项集的支持度时,开销会随着数据的增多而成几何级增长。七、 附1.程序源码 main.cpp#include #in

7、clude #include #include #include #include #include using namespace std;double minsup; /设置最小支持度map items_count; /统计各个项集的数目vectorvector datavec; /原始数据项集vectorvector candidatevec; /候选项集vectorvector frequentvec; /频繁项集ofstreamoutFile;int round=1; /生成项集轮次long trancount=0; /原始事务总数/判断某个项目在某一个事务中是否存在,存在则值为1,

8、反之为0vectormap bitmap;/获取原始数据集,并统计事务个数voidgetOriData();/合并生成新的候选项集vector mergeItem(vector vect1,vector vect2,int round);/判断项集item是否已经存在候选项集集合items中,存在则返回1intisExist(vector item,vectorvector items);/产生并输出候选1项集void genCanItemset1();/产生并输出频繁1项集void genFreItemset1();/产生并输出候选k-项集(k=2)voidgenCanItemsetK();

9、/产生并输出频繁k-项集(k=2)voidgenFreItemsetK();/剪枝:剪去合并后项集中含有非频繁项集中的项voidcutNotCanItemsetK(vector & item);int main()getOriData(); /获取原始数据集,并统计事务个数cout fName;cout minsup;outFile.open(fName,ios:trunc);outFile 最小支持度为minsup = minsup endl;genCanItemset1();genFreItemset1();if(!frequentvec.empty() /判断频繁1项集是否为空,为空则退

10、出 do genCanItemsetK();genFreItemsetK();while(!frequentvec.empty(); /频繁项集不为空,则循环继续 outFile.close();cout n结果已保存到 fName 文件!n;system(pause);return 0;/获取原始数据集,并统计事务个数voidgetOriData()int flag;cout flag;string filename;if(flag = 1) filename = dataA.txt; /打开数据文件elsefilename = dataB.txt;ifstream file(filenam

11、e);if(!file) /检查文件是否打开成功 coutFail to open data file!endl;system(pause);exit(0); else string temp; vector item; /项集的临时vector cout原始数据集:endl;intbegin,end; while(getline(file,temp) /一行一行读入数据 trancount+;begin=0;temp.erase(0,temp.find_first_not_of(rtn ); /去除字符串首部的空格temp.erase(temp.find_last_not_of(rtn)+1

12、); /去除字符串尾部的空格while(end=temp.find( ,begin)!=string:npos) /每一个事务中的项是以空格为分隔符的 item.push_back(temp.substr(begin,end-begin); /将每一个项插入item中begin=end+1; item.push_back(temp.substr(begin); /一个事务中的最后一项datavec.push_back(item); /将一个事务中的所有项当成一个整体插入另一个大的vector中item.clear(); /清空itemcout tempendl; file.close();/产

13、生并输出候选1项集void genCanItemset1()map item_map;for(int ix=0;ix!=datavec.size();+ix) for(intiy=0;iy!=datavecix.size();+iy) items_countdatavecix.at(iy)+; /该项集的计数加1item_mapdatavecix.at(iy)=true; /表示该项目在该事务中存在,值为1,否则默认为0 bitmap.push_back(item_map);item_map.clear(); /这里一定要清空一下 map:const_iteratormap_it=items_

14、count.begin();outFile 候选1项集: endl;while(map_it!=items_count.end() /输出候选1项集 outFile firstendl;map_it+; /产生并输出频繁1项集void genFreItemset1()map:const_iteratormap_it=items_count.begin();outFile频繁1项集:endl; vector item; /项集的临时vectorwhile(map_it!=items_count.end() /频繁1项集 if(float)map_it-second/(float)trancoun

15、t)minsup|fabs(float)map_it-second/(float)trancount)-minsup)1.0e-7) /支持度大于0.2 outFile.setf(ios:fixed);outFile first 支持度:setprecision(2)second/(float)trancountfirst);frequentvec.push_back(item); /插入频繁1项集的vector中item.clear(); map_it+; /产生并输出候选k-项集(k=2)voidgenCanItemsetK() /生成下一轮的候选项集 vector item; /项集的临

16、时vectorintst=frequentvec.size();candidatevec.clear(); /清除上一轮的候选项集for(int st1=0;st1st;st1+) for(int st2=st1+1;st2st;st2+) item=mergeItem(frequentvecst1,frequentvecst2,round); /调用函数合并生成下一轮的候选项集if(!item.empty()&!isExist(item,candidatevec) /若经过判断处理后返回的vector不为空且还不存在该项集,则作为候选项集加入候选vector中 cutNotCanItemse

17、tK(item); round+;outFile候选round项集:endl;for(int ix=0;ix!=candidatevec.size();+ix) /输出候选项集 outFile;for(intiy=0;iy!=candidatevecix.size();+iy) outFilecandidatevecix.at(iy); outFileendl; if(candidatevec.empty() /候选项集为空 outFile候选round项集为空!=2)voidgenFreItemsetK()int flag; /标记某个项集在某条事务中是否出现,出现为1,不出现为0,如:I1

18、I2int count; /统计某个想集在整个交易的事务集中出现的次数 string tempstr; /临时string,用于串接各个项成一个字符串:如: I1 I2 I3 串接为I1I2I3int mark; /为避免执行多余的字符串串接工作frequentvec.clear(); /清除上一轮的频繁项集for(intsx=0;sx!=candidatevec.size();+sx) /构造下一轮的频繁项集 mark=1;count=0;for(intsy=0;sy!=bitmap.size();+sy) flag=1; /初始化为1,表出现for(intsz=0;sz!=candidat

19、evecsx.size();+sz) if(bitmapsycandidatevecsx.at(sz)=false) /存在某一个子项不存在,则没出现项集 flag=0; if(mark=1) /只串接一次,如I1I2 否则为10个I1I2的串接 tempstr+=candidatevecsx.at(sz); /串接字符串 if(flag) /flag仍然为1,表示该项集在该条事务中出现了,计数加1 count+; mark+; if(float)count/(float)trancount)minsup|fabs(float)count/(float)trancount)-minsup)1.

20、0e-7) /支持度大于0.2 frequentvec.push_back(candidatevecsx); /插入频繁项集 items_counttempstr=count; /对应该项集的计数值 /假设此时生成的tempstr为I1I2I3,为便于后面的求置信度的计算,这里需要产生I2I1I3,I1I3I2等组合,并 /在items_count中给它们赋予和I1I2I3相同的值 sort(candidatevecsx.begin(),candidatevecsx.end(); /排序string tempstr2; while(next_permutation(candidatevecsx

21、.begin(),candidatevecsx.end() /取下一排列组合 for(inttempst=0;tempst!=candidatevecsx.size();tempst+) /拼接出该字符串组合 tempstr2+=candidatevecsxtempst; items_counttempstr2=count; /对应该项集的计数值tempstr2.erase(); tempstr.erase(); if(!frequentvec.empty() /频繁项集不为空 outFile频繁round项集:endl;for(intsx=0;sx!=frequentvec.size();+

22、sx) /输出频繁项集 outFile.setf(ios:fixed);outFile; for(intsz=0;sz!=frequentvecsx.size();+sz) outFilefrequentvecsx.at(sz);tempstr+=frequentvecsx.at(sz); /串接字符串 outFile;outFile 支持度:setprecision(2)(float)items_counttempstr/(float)trancount endl;tempstr.erase(); else outFile没有round-频繁项集,Apriori算法结束!endl; /两个项

23、集合并(要求只有一项不同)成一个新的项集(做为候选集)vector mergeItem(vector vect1,vector vect2,int round)int count=0; /统计两个vector中相同的项的数目vector vect; map tempMap; /辅助判断两个vector中重复的项for(unsigned intst=0;stvect1.size();st+) tempMapvect1st+;vect.push_back(vect1st); for(unsigned intst=0;stvect2.size();st+) tempMapvect2st+; if(t

24、empMapvect2st=2) /表示这两项相同 count+; else vect.push_back(vect2st); if(count+1)!=round) /要求两个项目集只有一个项目不相同,其他都相同,如:I1 I2 I4 和I1 I2 I3 vect.clear(); returnvect;/剪枝:剪去合并后项集中含有非频繁项集中的项voidcutNotCanItemsetK(vector & item) /实现剪枝/stringtempstr;vector tempvec;bool found = false; /是否包含有非频繁的子集,为1表示含有,有的话进行剪枝,如假设I

25、1I4为非频繁项集,则I1I2I4要剪枝掉stringteststr;inttestint;tempvec=item;sort(tempvec.begin(),tempvec.end(); while(next_permutation(tempvec.begin(),tempvec.end() /遍历所有的组合I1I2I4,要变成I1I4I2或其他如I2I1I4才能判断它包含I1I4这个非频繁项集 for(inttempst=0;tempst!=tempvec.size();tempst+) /拼接出该字符串组合 tempstr+=tempvectempst; for(map:const_it

26、eratortempit=items_count.begin();tempit!=items_count.end();tempit+) if(float)(tempit-second)/(float)trancount)first)!=string:npos) /表示包含有非频繁子项集 found=true;teststr=tempit-first;testint=tempit-second;break; tempstr.erase(); if(found) /包含非频繁子项集 break; if(!found) /只有不包含有非频繁子项集才加入候选项集中,否则剪枝掉candidatevec.push_back(item);else outFile剪去项集:;for(int st2=0;st2!=item.size();st2+)

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1