#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <map>
using namespace std;
vector<string>split(const string& src,const string& delimiter);
void rejudge();
vector<vector<string> >vect;
map<string,int>category;
map<string,double>pro_map;
int main()
{
string strLine;
ifstream readfile("data.txt");
if(!readfile)
{
cout<<"Fail to open file data!"<<endl;
cout<<getchar();
return 0;
}
else
{
cout<<"读取原数据如下:"<<endl;
vector<vector<string> >::size_type st_x;
vector<string>::size_type st_y;
vector<string>temp_vect;
while(getline(readfile,strLine))
{
cout<<strLine<<endl;
temp_vect=split(strLine,",");
vect.push_back(temp_vect);
temp_vect.clear();
}
string temp_string;
vector<string>::size_type temp_size1=vect.size()-1;
vector<string>::size_type temp_size2=vect[0].size();
for(st_x=1; st_x<temp_size1+1; st_x++)
{
for(st_y=0; st_y<temp_size2; st_y++)
{
if(st_y!=temp_size2-1)
{
temp_string=vect[0][st_y]+"="+vect[st_x][st_y]+"|"+vect[0][temp_size2-1]+"="+vect[st_x][temp_size2-1];
pro_map[temp_string]++;
}
else
{
temp_string=vect[0][temp_size2-1]+"="+vect[st_x][temp_size2-1];
pro_map[temp_string]++;
category[vect[st_x][temp_size2-1]]=1;
}
temp_string.erase();
}
}
string::size_type st;
cout<<"统计过程如下:"<<endl;
for(map<string,double>::iterator it=pro_map.begin(); it!=pro_map.end(); it++)
{
cout<<it->first<<":"<<it->second<<endl;
if((st=it->first.find("|"))!=string::npos)
{
it->second=it->second/pro_map[it->first.substr(st+1)];
}
}
cout<<"计算概率过程如下:"<<endl;
for(map<string,double>::iterator it2=pro_map.begin(); it2!=pro_map.end(); it2++)
{
if((st=it2->first.find("|"))!=string::npos)
{
pro_map[it2->first]=pro_map[it2->first]/(double)temp_size1;
}
cout<<it2->first<<":"<<it2->second<<endl;
}
rejudge();
}
cout<<getchar();
return 0;
}
vector<string>split(const string& src,const string& delimiter)
{
string::size_type st;
if(src.empty())
{
throw "Empty string!";
}
if(delimiter.empty())
{
throw "Empty delimiter!";
}
vector<string>vect;
string::size_type last_st=0;
while((st=src.find_first_of(delimiter,last_st))!=string::npos)
{
if(st!=last_st)
{
vect.push_back(src.substr(last_st,st-last_st));
}
last_st=st+1;
}
if(last_st!=src.size())
{
vect.push_back(src.substr(last_st,string::npos));
}
return vect;
}
void rejudge()
{
string temp_string;
double temp_pro;
map<string,double>temp_map;
cout<<"经过朴素贝叶斯算法重新分类的结果如下:"<<endl;
for(vector<vector<string> >::size_type st_x=1; st_x<vect.size(); st_x++)
{
for(map<string,int>::iterator it=category.begin(); it!=category.end(); it++)
{
temp_pro=1.0;
temp_string=vect[0][vect[0].size()-1]+"="+it->first;
temp_pro*=pro_map[temp_string];
temp_string.erase();
for(vector<string>::size_type st_y=0; st_y<vect[st_x].size(); st_y++)
{
if(it==category.begin()&&st_y!=vect[st_x].size()-1)
{
cout<<vect[st_x][st_y]<<" ";
}
if(st_y!=vect[st_x].size()-1)
{
temp_string=vect[0][st_y]+"="+vect[st_x][st_y]+"|"+vect[0][vect[0].size()-1]+"="+it->first;
temp_pro*=pro_map[temp_string];
temp_string.erase();
}
}
temp_map[it->first]=temp_pro;
}
string temp_string2;
temp_pro=0;
cout<<"后验概率:";
for(map<string,double>::iterator it2=temp_map.begin(); it2!=temp_map.end(); it2++)
{
cout<<it2->first<<":"<<it2->second<<" ";
if(it2->second>temp_pro)
{
temp_string2.erase();
temp_string2=it2->first;
temp_pro=it2->second;
}
}
cout<<"归类:"<<vect[0][vect[0].size()-1]<<"="<<temp_string2<<endl;
}
}