朴树贝叶斯算法及截图.docx
《朴树贝叶斯算法及截图.docx》由会员分享,可在线阅读,更多相关《朴树贝叶斯算法及截图.docx(8页珍藏版)》请在冰豆网上搜索。
朴树贝叶斯算法及截图
//naiveBayesClassify.cpp:
定义控制台应用程序的入口点。
//
#include"stdafx.h"
#include
#include
#include
#include
#include
usingnamespacestd;
//savethetrainingdata
typedefvector>strDVect;
//saveallpossibleconditionprobabilitys
typedefmap>>thriMap;
//serviceforthriMap
typedefmap>doubleMap;
typedefmapstrMap;
//savethekindofaimattributevalue
typedefmapaimMap;
//kindofeveryattributeincludingaimattributevalue
typedefmapattMap;
//constfordenominatorandnumerator
doubleK=1;
//sample
typedefvectorsampleVect;
//checkthethreedimensionsmapandreturn4states
intexistRecord(thriMapprob,stringaimValue,stringattName,stringattValue)
{
thriMap:
:
const_iteratoriterThri= prob.find(aimValue);
if(iterThri==prob.end())
return1;
doubleMap:
:
const_iteratoriterDouble=iterThri->second.find(attName);
if(iterDouble==iterThri->second.end())
return2;
strMap:
:
const_iteratoriterSingle=iterDouble->second.find(attValue);
if(iterSingle==iterDouble->second.end())
return3;
return4;
}
voidshow(thriMapprob)
{
thriMap:
:
iteratoriterThri=prob.begin();
for(;iterThri!
=prob.end();iterThri++)
{
doubleMap:
:
iteratoriterDouble=iterThri->second.begin();
for(;iterDouble!
=iterThri->second.end();iterDouble++)
{
strMap:
:
iteratoriterSingle=iterDouble->second.begin();
for(;iterSingle!
=iterDouble->second.end();iterSingle++)
{
cout<first<<""<first<<""<first<<""<second< }
}
}
}
//getallpossiblestatistics
//threedimensionshashprob,firstkeynotesaimattributevalue,secondkeynotesrefenceattributename,
//thirdkeynotesreferenceattributevalue,thevaluenotestherefenceattributevaluenumber
voidgetConditionStat(strDVectdatas,thriMap&prob,aimMap&aimNum)
{
inti,j,k,m,n;
m=datas.size();
n=datas[0].size();
doubleMapdoubleMapIns;
strMapstrMapIns;
thriMap:
:
iteratoriterThri;
doubleMap:
:
iteratoriterDouble;
for(i=1;i {
//saveallpossiblestatistics
for(j=0;j {
switch(existRecord(prob,datas[i][n-1],datas[0][j],datas[i][j]))
{
case1:
//mustclear
strMapIns.clear();
doubleMapIns.clear();
strMapIns.insert(make_pair(datas[i][j],1));
doubleMapIns.insert(make_pair(datas[0][j],strMapIns));
prob.insert(make_pair(datas[i][n-1],doubleMapIns));
break;
case2:
strMapIns.clear();
strMapIns.insert(make_pair(datas[i][j],1));
prob.find(datas[i][n-1])->second.insert(make_pair(datas[0][j],strMapIns));
break;
case3:
prob.find(datas[i][n-1])->second.find(datas[0][j])->second.insert(make_pair(datas[i][j],1));
break;
case4:
prob.find(datas[i][n-1])->second.find(datas[0][j])->second.find(datas[i][j])->second++;
break;
}
}
//savethekindofaimattributevalue
if(aimNum.find(datas[i][n-1])!
=aimNum.end())
{
aimNum.find(datas[i][n-1])->second++;
}
else
{
aimNum.insert(make_pair(datas[i][n-1],1));
}
}
}
voidgetConditionProb(thriMap&prob,aimMapaimNum,attMapattKind)
{
//saveallpossibleconditionprobabilitys
thriMap:
:
iteratoriterThri=prob.begin();
for(;iterThri!
=prob.end();iterThri++)
{
doubleMap:
:
iteratoriterDouble=iterThri->second.begin();
for(;iterDouble!
=iterThri->second.end();iterDouble++)
{
strMap:
:
iteratoriterSingle=iterDouble->second.begin();
for(;iterSingle!
=iterDouble->second.end();iterSingle++)
{
//addconstK,Lto denominatorandnumerator
//thepartof"attKind.find(iterDouble->first)->second*K"addtheweightofkindofrefenceattribute。
iterSingle->second=(iterSingle->second +K)/(attKind.find(iterDouble->first)->second*K+aimNum.find(iterThri->first)->second);
}
}
}
}
voidgetClassification(strDVectdatas,thriMapprob,aimMapaimNum,attMapattKind,sampleVectsampleIns,intrecords)
{
//savealltheprobability
doublesum=0;
doublemax=0;
doublepp;
stringclassKind;
//获得极大后验假设
doubleh_map;
aimMap:
:
const_iteratoriterAim=aimNum.begin();
for(;iterAim!
=aimNum.end();iterAim++)
{
//getpriorprobability
//thepartof"((--attKind.end())->second*K"addtheweightofthekindofaimattribute。
pp=(double)(iterAim->second+K)/((--attKind.end())->second*K+records);
//获得极大使然假设
doubleh_ml=1;
for(inti=0;i {
if(existRecord(prob,iterAim->first,datas[0][i],sampleIns.at(i))!
=4)
{
cout<<"thereisnovalueofattrubute"< h_ml*=K;
}
else
{
h_ml*=prob.find(iterAim->first)->second.find(datas[0][i])->second.find(sampleIns.at(i))->second;
}
}
h_map=pp*h_ml;
if(h_map>max)
{
max=h_map;
classKind=iterAim->first;
}
sum+=h_map;
}
//normalize
max=max/sum;
cout<<"thethemostclassis"<
}
int_tmain(intargc,_TCHAR*argv[])
{
inti,j,m,n;
//m:
numberoftrainingdata,n:
numberofattributes
m=15;n=5;
strDVectdatas(m);
for(i=0;i {
datas[i].resize(n);
}
//firstrowsaveattributes
datas[0][0]="age";
datas[0][1]="inco";
datas[0][2]="student";
datas[0][3]="credit_rating";
datas[0][4]="class:
buys_computer";
datas[1][0]="<=30";
datas[1][1]="high";
datas[1][2]="no";
datas[1][3]="fair";
datas[1][4]="no";
datas[2][0]="<=30";
datas[2][1]="high";
datas[2][2]="no";
datas[2][3]="excellent";
datas[2][4]="no";
datas[3][0]="31..40";
datas[3][1]="high";
datas[3][2]="no";
datas[3][3]="fair";
datas[3][4]="yes";
datas[4][0]=">40";
datas[4][1]="medi";
datas[4][2]="no";
datas[4][3]="fair";
datas[4][4]="yes";
datas[5][0]=">40";
datas[5][1]="low";
datas[5][2]="yes";
datas[5][3]="fair";
datas[5][4]="yes";
datas[6][0]=">40";
datas[6][1]="low";
datas[6][2]="yes";
datas[6][3]="excellent";
datas[6][4]="no";
datas[7][0]="31..40";
datas[7][1]="low";
datas[7][2]="yes";
datas[7][3]="excellent";
datas[7][4]="yes";
datas[8][0]="<=30";
datas[8][1]="medi";
datas[8][2]="no";
datas[8][3]="fair";
datas[8][4]="no";
datas[9][0]="<=30";
datas[9][1]="low";
datas[9][2]="yes";
datas[9][3]="fair";
datas[9][4]="yes";
datas[10][0]=">40";
datas[10][1]="medi";
datas[10][2]="yes";
datas[10][3]="fair";
datas[10][4]="yes";
datas[11][0]="<=30";
datas[11][1]="medi";
datas[11][2]="yes";
datas[11][3]="excellent";
datas[11][4]="yes";
datas[12][0]="31..40";
datas[12][1]="medi";
datas[12][2]="no";
datas[12][3]="excellent";
datas[12][4]="yes";
datas[13][0]="31..40";
datas[13][1]="high";
datas[13][2]="yes";
datas[13][3]="fair";
datas[13][4]="yes";
datas[14][0]=">40";
datas[14][1]="medi";
datas[14][2]="no";
datas[14][3]="excellent";
datas[14][4]="no";
for(i=0;i {
for(j=0;j {
cout.width(15);
cout<:
left)< }
cout< }
thriMapprob;
aimMapaimNum;
attMapattKind;
attKind.insert(make_pair("age",3));
attKind.insert(make_pair("inco",3));
attKind.insert(make_pair("student",2));
attKind.insert(make_pair("credit_rating",2));
attKind.insert(make_pair("class:
buys_computer",2));
getConditionStat(datas,prob,aimNum);
//initK
K=(double)1/(m-1);
getConditionProb(prob,aimNum,attKind);
show(prob);
sampleVectsampleIns;
sampleIns.push_back("31..40");
sampleIns.push_back("high");
sampleIns.push_back("no");
sampleIns.push_back("fair");
getClassification(datas,prob,aimNum,attKind,sampleIns,m-1);
return0;
}