数据挖掘实验三应用 Apriori 算法挖掘频繁项集 下载本文

while(!infile.eof()) {

infile >> sal[sal_size].serial >> sal[sal_size].market >> sal[sal_size].date>> sal[sal_size].sn>> sal[sal_size].id>> sal[sal_size].num>> sal[sal_size].price;

sal_size++; }

///////////////取统一流水的商品ID前三位按升序无重复的保存起来/////////////////////////

new1[0][0]=sal[0].id/10000; for (int i =1;i

new1[m][n]=sal[i].id/10000; //////流水号相同 n++; //outfile<

if(new1[m][j] > new1[m][j+1]) {

int t = new1[m][j];

new1[m][j] = new1[m][j+1]; new1[m][j+1] = t; } } } for(int l= 0;l< n;l++) { if(new1[m][l-1]!=new1[m][l]) outfile<

} }

infile.close();//关闭文件 outfile.close();//关闭文件 system( \}

2、//Apriori算法挖掘频繁项集support = 2(加注释)

#include #include #include #include #include #include #include #include #include using namespace std;

const int minsup=2; //设置最小支持度

map items_count; //统计各个项集的数目

vector mergeItem(vector vect1,vector vect2,int round); //合并生成新的候选项集

int isExist(vector item,vector >items); //判断项集item是否已经存在候选项集集合items中,存在则返回

vector mergeItem(vector vect1,vector vect2,int round) //判断两个项集是否可以合并(要求只有一项不同)成一个新的项集(做为候选集)

{

////////////////////////////////////////////剪枝工作//// int count=0; //统计两个vector中相同的项的数目 vector vect;

map tempMap; //辅助判断两个vector中重复的项 for(vector::size_type st=0;st

tempMap[vect1[st]]++; vect.push_back(vect1[st]); }

for(int st=0;st

tempMap[vect2[st]]++;

if(tempMap[vect2[st]]==2) //表示这两项相同 {

count++; } else {

vect.push_back(vect2[st]); } }

if((count+1)!=round) //要求两个项目集只有一个项目不相同,其他都相同 { vect.clear(); }

return vect; }

int isExist(vector item,vector >items) //判断项集item是否已经存在候选项集集合items中,存在则返回

{

int count; //统计相同的项的数目 if(!items.empty()) {

for(vector >::size_type ix=0;ix!=items.size();ix++) {

count=0;

for(vector::size_type iy=0;iy!=items[ix].size();iy++) {

for(vector::size_type iz=0;iz!=item.size();iz++) {

if(item[iz]==items[ix].at(iy)) {

count++; } } }

if(count==item.size()) //表示存在 {

return 1; } } }

return 0; }

int main() {

vector > datavec; //原始数据项集 vector > candidatevec; //候选项集 vector > frequentvec; //频繁项集

vector > bitmap; //判断某个项目在某一个事务中是否存在,存在则值为1,反之为0

long trancount=0; //原始事务总数 char name1[50];

ifstream file;

cout<<\选择要打开的文件:new1.txt new2.txt new3.txt\ cin>>name1;

file.open(name1,ios::in); //打开数据文件 if(!file) //检查文件是否打开成功 {

cout<<\ return 1; } else {

string temp;

vector item; //项集的临时vector int begin,end;

while(getline(file,temp)) //一行一行读入数据 {

trancount++; begin=0; temp.erase(0,temp.find_first_not_of(\去除字符串首部的空格 temp.erase(temp.find_last_not_of(\

while((end=temp.find('\\t',begin))!=string::npos) //每一个事务中的项是以'\\t'为分隔符的

{

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(); //清空item }

cout<<\ getchar();

map item_map;

for(vector >::size_type ix=0;ix!=datavec.size();++ix) {

for(vector::size_type iy=0;iy!=datavec[ix].size();++iy) {

items_count[datavec[ix].at(iy)]++; //该项集的计数加

item_map[datavec[ix].at(iy)]=1; //表示该项目在该事务中存在,值为1,否则默认为0

}

bitmap.push_back(item_map);

item_map.clear(); //这里一定要清空一下