<h2>/*</h2> 内容:频繁模式挖掘的apriori算法
日期:2014年10月30日
*/
#include<iostream>
#include<map>
#include<vector>
#include<iomanip>
#include<string>
using namespace std;
int data[9][5]={{1,2,5},{2,4},{2,3},{1,2,4},{1,3},{2,3},{1,3},{1,2,3,5},{1,2,3}};
/*
bool IsExist(vector<int> v,int e)
{
vector<int>::iterator it;
for(it=v.begin();it!=v.end();it++)
{
if(*it==e)
return true;
}
if(it==v.end())
return false;
}
*/
int IsExist(map<vector<int>,int> m)
{
map<vector<int>,int>::iterator mit=m.begin();
if(mit!=m.end())
return 1;
return 0;
}
//剪枝法(优化)
int has_infrequent_subset(vector<int> v,map<vector<int>,int> m)
{
vector<int>::iterator it1,it2,it0;
map<vector<int>,int>::iterator mit;
for(it1=v.begin();it1!=v.end();it1++)
{
vector<int> v1;
for(it2=v.begin();it2!=v.end();it2++)
{
if(it2!=it1)
v1.push_back(*it2);
}
int flag=0;
for(mit=m.begin();mit!=m.end();mit++)
{
vector<int> v2=mit->first;
int i;
for(i=0;i<v2.size();i++)
{
if(v1[i]!=v2[i])
break;
}
if(i==v2.size())
flag++;
}
if(flag==0)
return 1;
}
return 0;
}
map<vector<int>,int> aprori_gen(int k,map<vector<int>,int> m)
{
map<vector<int>,int> m0;
map<vector<int>,int>::iterator mit1,mit2;
for(mit1=m.begin();mit1!=m.end();mit1++)
{
vector<int> v1=mit1->first;
map<vector<int>,int>::iterator mit0;
mit0=mit1;
mit0++;
if(mit0==m.end())
break;
for(mit2=mit0;mit2!=m.end();mit2++)
{
vector<int> v2=mit2->first;
int i;
for(i=0;i<k-2;i++)
{
if(v1[i]!=v2[i])
break;
}
//连接步,产生候选
vector<int> v3;
if(i==k-2)
{
for(int j=0;j<k;j++)
{
if(j==k-1)
v3.push_back(v2[j-1]);
else
{
v3.push_back(v1[j]);
}
}
//剪枝步,这里直接将v3与L[k-1]比较,若存在不频繁子集则不插入
if(!has_infrequent_subset(v3,m))
m0.insert(pair<vector<int>,int>(v3,0));
}
}
}
return m0;
}
void show_C_k(map<vector<int>,int> m)
{
map<vector<int>,int>::iterator mit;
for(mit=m.begin();mit!=m.end();mit++)
{
vector<int> v = mit->first;
vector<int>::iterator it;
for(it=v.begin();it!=v.end();it++)
{
cout<<*it;
if(it<v.end()-1)
cout<<"、";
}
cout<<" "<<mit->second<<endl;
}
}
map<vector<int>,int> subset_count(map<vector<int>,int> m)
{
map<vector<int>,int>::iterator mit;
for(mit=m.begin();mit!=m.end();mit++)
{
vector<int> v = mit->first;
vector<int>::iterator it;
int count=0;
int length=v.size();
for(int i=0;i<9;i++)
{
int lcount=0;
for(it=v.begin();it!=v.end();it++)
{
int j=0;
while(data[i][j]!=*it&&j<5)
j++;
if(j==5)
break;
if(data[i][j]==*it)
lcount++;
}
if(lcount==length)
count++;
}
mit->second=count;
}
return m;
}
map<vector<int>,int> delete_lessthan_2_support(map<vector<int>,int> m)
{
map<vector<int>,int>::iterator mit=m.begin();
while(mit!=m.end())
{
if(mit->second<2)
mit=m.erase(mit); //Linux下erase()函数无返回值
else
mit++;
}
return m;
}
//产生1项频繁项集
map<vector<int>,int> find_fequent_1_itemsets()
{
map<vector<int>,int> m;
vector<int> v[6];
int count[6]={0};
int k=0;
for(int i=0;i<9;i++)
for(int j=0;j<5;j++)
{
switch(data[i][j])
{
case 1:count[1]++;break;
case 2:count[2]++;break;
case 3:count[3]++;break;
case 4:count[4]++;break;
case 5:count[5]++;break;
default:break;
}
}
for(int l=1;l<=5;l++)
{
v[l].push_back(l);
m.insert(pair<vector<int>,int>(v[l], count[l]));
}
return m;
}
int main()
{
map<vector<int>,int> L[10],C[10],temp;
//C=get_itemsets(); //获取事物集,可以从数据库中读取,
//产生1项频繁项集
L[1]=find_fequent_1_itemsets();
map<vector<int>,int>::iterator mit;
cout<<"*****************"<<endl;
cout<<"第1项频繁项集"<<endl;
cout<<"-----------------"<<endl;
for(mit=L[1].begin();mit!=L[1].end();mit++)
{
vector<int> v =mit->first;
cout<<*(v.begin())<<" "<<mit->second<<endl;
}
cout<<"*****************"<<endl;
int k;
for(k=2;!L[k-1].empty();k++)//IsExist(L[k-1])
{
//产生k项候选集
C[k]=aprori_gen(k,L[k-1]);
cout<<"*****************"<<endl;
cout<<"第"<<k<<"项频繁项集"<<endl;
cout<<"-----------------"<<endl;
//show_C_k(C[k]);
temp=subset_count(C[k]);
//show_C_k(temp);
L[k]=delete_lessthan_2_support(temp);
show_C_k(L[k]);
cout<<"*****************"<<endl;
}
return 0;
}
apriori算法简单实现
最新推荐文章于 2024-08-28 22:29:36 发布