Apriori算法.docx
- 文档编号:12783865
- 上传时间:2023-04-22
- 格式:DOCX
- 页数:14
- 大小:63.59KB
Apriori算法.docx
《Apriori算法.docx》由会员分享,可在线阅读,更多相关《Apriori算法.docx(14页珍藏版)》请在冰豆网上搜索。
Apriori算法
课程名称:
数据挖掘
实验项目:
Apriori算法的实现
班级:
_2008级计算机科学与技术_
学号:
学生姓名:
昆明学院
算法背景:
Apriori算法是R.Agrawal和R.Srikant于1994年提出的为布尔关联规则挖掘频繁项集的原创性质算法。
正如我们将看到的,算法的名字基于这样的事实:
算法使用频繁项集性质的先验性质。
Apriori使用一种称作逐层搜索的迭代方法,k项集用于探索(k+1)项集。
首先,通过扫描数据库,累积每个项的计数,并收集满足最小支持度的项,找出频繁1项集的集合。
该集合记作L1。
然后L1用于找频繁2项集的集合L2,L2用于找L3,如此下去,知道不能在找到频繁项集k项集。
找每个Lk需要一次数据库全扫描。
算法实现代码:
#include"stdafx.h"
#include
#include
#include
#include
#include
usingnamespacestd;
typedefstructItem//只有一个词的频繁项
{
stringsItem;
intiSupport;
}ITEM;
typedefvector
typedefvector
typedefstructMultiItem//高层的频繁项
{
VEC_STRvsItem;
intiSupport;
}MULTIITEM;
typedefvector
typedefvector
typedefmap
voidreadFile(ifstream&,conststring&,VEC_STR&);
voidcountWord(VEC_STR*,MAP_STR_INT&,constcharseparator='\\');
voidgenerateLevel1Set(MAP_STR_INT*,VEC_ITEM&);
voidgenerateLevel2(VEC_ITEM*,VEC_MULTIITEM&);
voidcycGenerator(VEC_MULTIITEM*,VEC_STR&,ofstream&);
voidgenerateHighLevelSet(VEC_MULTIITEM*,VEC_MULTIITEM&,VEC_STR&);
voidgenerateInitialHigh(VEC_MULTIITEM*,VEC_VEC_STR&);
voidpruning(VEC_VEC_STR*,VEC_MULTIITEM*,VEC_MULTIITEM&);
boolfind(VEC_MULTIITEM*,VEC_STR*);
voidcountSupport(VEC_STR*,VEC_MULTIITEM&);
voidgenerateFrequentSet(VEC_MULTIITEM*,VEC_MULTIITEM&);
voidprintFrequentSet(VEC_ITEM*,ostream&os=cout);
voidprintFrequentSet(VEC_MULTIITEM*,ostream&os=cout);
constintMINSUPPORT=2;//最小支持度
intmain()
{
//从源文件读取数据
ifstreaminfile;
VEC_STRvs_word;
readFile(infile,"input.txt",vs_word);
infile.close();
//计算所有词语的出现频率
MAP_STR_INTword_count;
countWord(&vs_word,word_count);
//生成单个词语的频繁项集合
VEC_ITEMlevel1Set;
generateLevel1Set(&word_count,level1Set);
//生成具有两个词语的频繁项集合
VEC_MULTIITEMlevel2,level2Set;
generateLevel2(&level1Set,level2);
countSupport(&vs_word,level2);
generateFrequentSet(&level2,level2Set);
//生成具有三个词语的频繁项集合
VEC_MULTIITEMlevel3Set;
generateHighLevelSet(&level2Set,level3Set,vs_word);
//输出单个词的频繁项到文件
ofstreamoutfile;
outfile.open("out.txt");
if(!
outfile)
cout<<"不能打开文件!
"< printFrequentSet(&level1Set,outfile); //循环产生高层的频繁项集合并输出到文件 cycGenerator(&level2Set,vs_word,outfile); cout<<"OK! "< return0; } /**从源文件读取词语 *每一行作为一个字符串存入向量中 */ voidreadFile(ifstream&infile,conststring&filename,VEC_STR&vs_word) { infile.close(); infile.clear(); infile.open(filename.c_str()); if(! infile) cout<<"Unabletoopenthisfile! "< stringword; while(getline(infile,word)) vs_word.push_back(word); } /**计算每个词语的支持度 *从字符串中提取出所有词语,与其支持度一道存入map中 */ voidcountWord(VEC_STR*vs_word,MAP_STR_INT&word_count,constcharseparator) { stringsentence,word; for(unsignedinti=0;i { sentence=(*vs_word)[i]; while(sentence.find(separator)! =-1) { word=sentence.substr(0,sentence.find(separator)); ++word_count[word]; sentence=sentence.substr(sentence.find(separator)+1,sentence.size()-1); } ++word_count[sentence]; } } /**找出频繁1项集的集合 */ voidgenerateLevel1Set(MAP_STR_INT*pWord_Count,VEC_ITEM&level1Set) { ITEMitem; MAP_STR_INT: : const_iteratormap_it=pWord_Count->begin(); while(map_it! =pWord_Count->end()) { if(map_it->second>=MINSUPPORT) { item.sItem=map_it->first; item.iSupport=map_it->second; level1Set.push_back(item); } ++map_it; } } /**由频繁1项集生成初始2项集 */ voidgenerateLevel2(VEC_ITEM*pLevel1Set,VEC_MULTIITEM&initialLevel2) { VEC_STRvsTemp; MULTIITEMmultiTemp; unsignedintlevel1SetSize=pLevel1Set->size(); for(unsignedinti=0;i { vsTemp.push_back((*pLevel1Set)[i].sItem); for(unsignedintj=i+1;j { vsTemp.push_back((*pLevel1Set)[j].sItem); multiTemp.vsItem=vsTemp; multiTemp.iSupport=0; initialLevel2.push_back(multiTemp); vsTemp.pop_back(); } vsTemp.clear(); } } /**循环产生频繁项集合并输出 */ voidcycGenerator(VEC_MULTIITEM*pLowLevelSet,VEC_STR&vs_word,ofstream&os) { VEC_MULTIITEMhighLevelSet,setTemp; printFrequentSet(pLowLevelSet,os); while(pLowLevelSet->size()! =0) { setTemp.clear(); generateHighLevelSet(pLowLevelSet,setTemp,vs_word); highLevelSet=setTemp; printFrequentSet(&highLevelSet,os); pLowLevelSet=&highLevelSet; } } /**由低层的频繁项集生成高层的频繁项集合 */ voidgenerateHighLevelSet(VEC_MULTIITEM*pLowLevelSet,VEC_MULTIITEM&highLevelSet,VEC_STR&vs_word) { VEC_VEC_STRvvsTemp; VEC_MULTIITEMvmiTemp; generateInitialHigh(pLowLevelSet,vvsTemp); pruning(&vvsTemp,pLowLevelSet,vmiTemp); countSupport(&vs_word,vmiTemp); generateFrequentSet(&vmiTemp,highLevelSet); } /**从低层的频繁项集生成初始的高层项集合 */ voidgenerateInitialHigh(VEC_MULTIITEM*pLowLevelSet,VEC_VEC_STR&highLevelSet) { VEC_STRvsTemp; unsignedintlevel1SetSize=pLowLevelSet->size(); for(unsignedinti=0;i for(unsignedintj=i+1;j { unsignedintk=0; for(;k<(*pLowLevelSet)[i].vsItem.size()-1;++k) { if((*pLowLevelSet)[i].vsItem[k]==(*pLowLevelSet)[j].vsItem[k]) vsTemp.push_back((*pLowLevelSet)[i].vsItem[k]); else break; } if(k==(*pLowLevelSet)[i].vsItem.size()-1) { vsTemp.push_back((*pLowLevelSet)[i].vsItem[k]); vsTemp.push_back((*pLowLevelSet)[j].vsItem[k]); highLevelSet.push_back(vsTemp); } vsTemp.clear(); } } /**剪枝步 */ voidpruning(VEC_VEC_STR*pInitialSet,VEC_MULTIITEM*pLowLevelSet,VEC_MULTIITEM&prunedSet) { VEC_STRvsTemp; MULTIITEMmiTemp; for(unsignedinti=0;i { unsignedintj=0; unsignedintsizeI=(*pInitialSet)[i].size(); for(;j { for(unsignedintk=0;k if(k! =j) vsTemp.push_back((*pInitialSet)[i][k]); if(! find(pLowLevelSet,&vsTemp)) break; } if(j==sizeI) { miTemp.vsItem=(*pInitialSet)[i]; miTemp.iSupport=0; prunedSet.push_back(miTemp); } vsTemp.clear(); } } /**在低层的频繁项集中查询高层的初始频繁项的所有子集的函数 */ boolfind(VEC_MULTIITEM*pLowSet,VEC_STR*pSubSet) { for(unsignedinti=0;i { unsignedintj=0; unsignedintsizeI=(*pLowSet)[i].vsItem.size(); for(;j if((*pLowSet)[i].vsItem[j]! =(*pSubSet)[j]) break; if(j==sizeI) returntrue; } returnfalse; } /**计算生成的初始频繁项集中各项的支持度 */ voidcountSupport(VEC_STR*pVs_Word,VEC_MULTIITEM&initialSet) { intflag; for(unsignedinti=0;i for(unsignedintj=0;j { flag=1; for(unsignedintk=0;k { if((*pVs_Word)[i].find(initialSet[j].vsItem[k],0)==-1) { flag=0; break; } } if(flag==1) ++initialSet[j].iSupport; } } /**从初始项集合中提取出频繁项集合 */ voidgenerateFrequentSet(VEC_MULTIITEM*pInitialSet,VEC_MULTIITEM&frequentSet) { for(unsignedinti=0;i { if((*pInitialSet)[i].iSupport>=MINSUPPORT) { frequentSet.push_back((*pInitialSet)[i]); } } } /**打印一项频繁集合 */ voidprintFrequentSet(VEC_ITEM*pLevel1Set,ostream&os) { //os<<"频繁项"; //os<<"支持度\n"< for(unsignedinti=0;i { os<<(*pLevel1Set)[i].sItem<<": \t"<<(*pLevel1Set)[i].iSupport< } os< } /**打印高层频繁项集合 */ voidprintFrequentSet(VEC_MULTIITEM*pFrequentSet,ostream&os) { for(unsignedinti=0;i { unsignedintj=0; for(;j<(*pFrequentSet)[i].vsItem.size()-1;++j) os<<(*pFrequentSet)[i].vsItem[j]<<"&"; os<<(*pFrequentSet)[i].vsItem[j]<<": \t"<<(*pFrequentSet)[i].iSupport< } os< } 运行结果截图
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Apriori 算法