C++编程bayes算法.docx
《C++编程bayes算法.docx》由会员分享,可在线阅读,更多相关《C++编程bayes算法.docx(21页珍藏版)》请在冰豆网上搜索。
![C++编程bayes算法.docx](https://file1.bdocx.com/fileroot1/2022-12/12/e4e014e5-a162-458d-b180-d6de956a2533/e4e014e5-a162-458d-b180-d6de956a25331.gif)
C++编程bayes算法
运行界面:
源代码:
#include"stdafx.h"
#include"Bayes.h"
#include"BayesClass.h"
#include
#ifdef_DEBUG
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#definenewDEBUG_NEW
#endif
BayesClass:
:
BayesClass(HWNDh)
{
hwnd=h;
if((fout=fopen("result.txt","w"))==NULL)
exit(0);
}
BayesClass:
:
~BayesClass()
{
if(fout!
=NULL)
fclose(fout);
inti;
for(i=0;i{
if(NULL!
=mean.at(i))
{
deletemean.at(i);
}
}
for(i=0;i{
if(NULL!
=covariance.at(i))
{
deletecovariance.at(i);
}
}
for(i=0;i{
if(NULL!
=prama.at(i))
{
deleteprama.at(i);
}
}
for(i=0;i{
if(NULL!
=faceprama.at(i))
{
deletefaceprama.at(i);
}
}
for(i=0;i{
if(NULL!
=coefficient.at(i))
{
deletecoefficient.at(i);
}
}
for(i=0;i{
if(NULL!
=coefficientface.at(i))
{
deletecoefficientface.at(i);
}
}
}
intBayesClass:
:
LoadSamples(char*fname)
{
FILE*InFile;
inti,j;
intx;
if((InFile=fopen(fname,"r"))==NULL)
returnFAILURE;
fscanf(InFile,"%d",&num);
fscanf(InFile,"%d",&dim);
fscanf(InFile,"%d",&cls);
for(i=0;ivectortemp;
for(j=0;jfscanf(InFile,"%d",&x);
temp.push_back(x);
}
samples.samples.push_back(temp);
fscanf(InFile,"%d",&x);
samples.belong.push_back(x);
}
//writetheloadresulttofile
FPEL(fout);
FPS(fout,"samples:
");
FPEL(fout);
for(i=0;ifor(j=0;jFPI(fout,samples.samples.at(i).at(j),NEL);
}
FPI(fout,samples.belong.at(i),NEL);
FPEL(fout);
}
returnSUCCESS;
}
voidBayesClass:
:
EstimateGauss()
{
inti,j,k;
intcount;
doublesum;
doublemeandim;
//caltheguassmean
for(i=1;i<=cls;i++)
{
double*temp=newdouble[dim];
for(j=0;j{
count=0;
sum=0.0;
for(k=0;k{if(samples.belong.at(k)==i)
{
count++;
sum+=samples.samples.at(k).at(j);
}
}
if(count==0)
{
return;
}
temp[j]=sum/count;
}
preratio.push_back((double)count/num);//calpreratio
Matrix*m=newMatrix(temp,dim);
mean.push_back(m);
delete[]temp;
}
//writethemeanstofile
FPEL(fout);
FPS(fout,"means:
");
FPEL(fout);
for(i=0;i{
FPS(fout,mean.at(i)->ToString().c_str());
FPEL(fout);
}
//calthecovariancematrix
for(i=1;i<=cls;i++)
{
Matrix*m=mean.at(i-1);
double*temp=newdouble[dim*dim];
for(inttempi=0;tempi{
temp[tempi]=0;
}
for(j=0;j{
count=0;
sum=0.0;
meandim=m->GetValue(0,j);
for(k=0;k{if(samples.belong.at(k)==i)
{
count++;
sum+=(samples.samples.at(k).at(j)-meandim)*(samples.samples.at(k).at(j)-meandim);
}
}
if(count==0)
{
return;
}
//temp[j*dim+j]=sum/count;
temp[j*dim+j]=sum/(count-1);//waitforchange
}
Matrix*c=newMatrix(temp,dim,dim);
covariance.push_back(c);
delete[]temp;
}
//writethecovariancetofile
FPEL(fout);
FPS(fout,"covariance:
");
FPEL(fout);
for(i=0;i{
FPS(fout,covariance.at(i)->ToString().c_str());
FPEL(fout);
}
}
voidBayesClass:
:
CalDistPrama(intcontype)
{
this->contype=contype;
switch(contype)
{
caseCON_EQUL:
{
inti;
doubletemp;
//doublea,b,c;
Matrixtotal(0.0,dim);
for(i=0;i{
total=total+covariance.at(i)->T().T();
}
FPEL(fout);
FPS(fout,"Totalcovariance:
");
FPEL(fout);
FPS(fout,total.ToString().c_str());
FPEL(fout);
for(i=0;i{
DISTPRAMA*dp=newDISTPRAMA();
//dp->Vi=(-1.0/2)*(covariance.at(i)->Contra());
dp->Wi=(total.Contra())*(mean.at(i)->T());
temp=((mean.at(i)->T().T())*(total.Contra())*(mean.at(i)->T())).GetFirstValue();
//a=(-1.0/2)*log(covariance.at(i)->Arg());
//b=log(preratio.at(i));
//dp->w0=(-1.0/2)*temp-a+b;
dp->w0=(-1.0/2)*temp-(-1.0/2)*log(total.Arg())+log(preratio.at(i));
prama.push_back(dp);
}
FPEL(fout);
FPS(fout,"DISTPRAMA:
");
FPEL(fout);
for(i=0;i{
DISTPRAMA*dp=prama.at(i);
//FPS(fout,dp->Vi.ToString().c_str());
//FPEL(fout);
FPS(fout,dp->Wi.ToString().c_str());
FPEL(fout);
FPD(fout,dp->w0);
FPEL(fout);
}
}
break;
caseCON_NOTEQUL:
{
inti;
doubletemp;
//doublea,b,c;
for(i=0;i{
DISTPRAMA*dp=newDISTPRAMA();
dp->Vi=(-1.0/2)*(covariance.at(i)->Contra());
dp->Wi=(covariance.at(i)->Contra())*(mean.at(i)->T());
temp=((mean.at(i)->T().T())*(covariance.at(i)->Contra())*(mean.at(i)->T())).GetFirstValue();
//a=(-1.0/2)*log(covariance.at(i)->Arg());
//b=log(preratio.at(i));
//dp->w0=(-1.0/2)*temp-a+b;
dp->w0=(-1.0/2)*temp-(-1.0/2)*log(covariance.at(i)->Arg())+log(preratio.at(i));
prama.push_back(dp);
}
FPEL(fout);
FPS(fout,"DISTPRAMA:
");
FPEL(fout);
for(i=0;i{
DISTPRAMA*dp=prama.at(i);
FPS(fout,dp->Vi.ToString().c_str());
FPEL(fout);
FPS(fout,dp->Wi.ToString().c_str());
FPEL(fout);
FPD(fout,dp->w0);
FPEL(fout);
}
}
break;
}
}
voidBayesClass:
:
CalDistFace()
{
switch(contype)
{
caseCON_EQUL:
{
inti,j;
doubletemp;
Matrixtotal(0.0,dim);
for(i=0;i{
total=total+covariance.at(i)->T().T();
}
for(i=0;i{
for(j=i+1;j{
DISTFACEPRAMA*dfp=newDISTFACEPRAMA();
Matrixtempm=mean.at(i)->T()-mean.at(j)->T();
dfp->w=total.Contra()*tempm;
temp=(tempm.T()*total.Contra()*tempm).GetFirstValue();
dfp->x0=((-1.0/2)-log((preratio.at(i)/preratio.at(j))/temp))*tempm;
faceprama.push_back(dfp);
}
}
FPEL(fout);
FPS(fout,"DISTFACEPRAMA:
");
FPEL(fout);
for(i=0;i{
DISTFACEPRAMA*dfp=faceprama.at(i);
FPS(fout,dfp->w.ToString().c_str());
FPEL(fout);
FPS(fout,dfp->x0.ToString().c_str());
FPEL(fout);
}
}
break;
caseCON_NOTEQUL:
//{
//inti;
//doubletemp;
//for(i=0;i//{
//DISTPRAMA*dp=newDISTPRAMA();
//dp->Vi=(-1.0/2)*(covariance.at(i)->Contra());
//dp->Wi=(covariance.at(i)->Contra())*(mean.at(i)->T());
//temp=((mean.at(i)->T().T())*(covariance.at(i)->Contra())*(mean.at(i)->T())).GetFirstValue();
////a=(-1.0/2)*log(covariance.at(i)->Arg());
////b=log(preratio.at(i));
////dp->w0=(-1.0/2)*temp-a+b;
//dp->w0=(-1.0/2)*temp-(-1.0/2)*log(covariance.at(i)->Arg())+log(preratio.at(i));
//prama.push_back(dp);
//}
//for(i=0;i//{
//DISTPRAMA*dp=prama.at(i);
//FPS(fout,dp->Vi.ToString().c_str());
//FPEL(fout);
//FPS(fout,dp->Wi.ToString().c_str());
//FPEL(fout);
//FPD(fout,dp->w0);
//FPEL(fout);
//}
//}
break;
}
}
intBayesClass:
:
DoDistOne(int*one,intn)
{
SetOne(one,n);
returnDistOne();
}
intBayesClass:
:
DoDistOne(vector*test)
{
if(test->size()!
=dim){
return-1;
}
inti;
this->one.clear();
for(i=0;i{
this->one.push_back(test->at(i));
}
returnDistOne();
}
voidBayesClass:
:
SetOne(int*one,intn)
{
this->one.clear();
intd=(dim>n)?
n:
dim;
inti;
for(i=0;i{
this->one.push_back(one[i]);
}
//ifnislessthandim,theleftarefilledwith0
for(i=d;i{
this->one.push_back(0);
}
}
intBayesClass:
:
DistOne()
{
if(one.size()!
=dim)
{
return-1;
}
double*ratio=newdouble[cls];
inti;
double*temp=newdouble[dim];
for(i=0;i{
temp[i]=one.at(i);
}
Matrixm(temp,dim);
delete[]temp;
//doublea,b;
for(i=0;i{
//a=(m*prama.at(i)->Vi*m.T()).GetFirstValue();
//b=(prama.at(i)->Wi.T()*m.T()).GetFirstValue();
//ratio[i]=a+b+prama.at(i)->w0;
switch(contype)
{
caseCON_EQUL:
{
ratio[i]=(prama.at(i)->Wi.T()*m.T()).GetFirstValue()+prama.at(i)->w0;
}
break;
caseCON_NOTEQUL:
{
ratio[i]=(m*prama.at(i)->Vi*m.T()).GetFirstValue()+(prama.at(i)->Wi.T()*m.T()).GetFirstValue()+prama.at(i)->w0;
}
break;
}
}
for(i=0;i{
FPD(fout,ratio[i]);
}
//getthemax
doublemax=ratio[0];
intindex=0;
for(i=1;i{
if(max}
delete[]ratio;
returnindex+1;
}
voidBayesClass:
:
PrepareForDist(intcontype)
{
EstimateGauss();
CalDistPrama(contype);
//CalDistFace();
CalCoefficientFace();
}
SAMPLE*BayesClass:
:
GetSamples()
{
return&samples;
}
vector*BayesClass:
:
GetDistPrama()
{
return&prama;
}
voidBayesClass:
:
ConvertToEquation()
{
if(dim!
=2)
{
return;
}
inti;
switch(contype)
{
caseCON_EQUL:
{
for(i=0;i{
COEFFICIENT*co=newCOEFFICIENT();
co->one1=prama.at(i)->Wi.GetValue(0,0);
co->one2=prama.at(i)->Wi.GetValue(1,0);
co->zero=prama.at(i)->w0;
coefficient.push_back(co);
}
}
break;
caseCON_NOTEQUL:
{
for(i=0;i{
COEFFICIENT*co=newCOEFFICIENT();
co->two1=prama.at(i)->Vi.GetValue(0,0)+prama.at(i)->Vi.GetValue(0,1);
co->two2=prama.at(i)->Vi.GetValue(1,0)+prama.at(i)->Vi.GetValue(1,1);
co->one1=prama.at(i)->Wi.GetValue(0,0);
co->one2=prama.at(i)->Wi.GetValue(1,0);
co->zero=prama.at(i)->w0;
coefficient.push_back(co);
}
}
break;
}
}
voidBayesClass:
:
CalCoefficientFace()
{
if(dim!
=2)
{
return;
}
inti,j;
switch(contype)
{
caseCON_EQUL:
{
for(i=0;i{
for(j=i+