⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bayes.cpp

📁 Bayes分类程序源代码,用于两类模式的分类识别
💻 CPP
字号:
#include <iostream.h>
#include <math.h>
#include <fstream.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <time.h>

#define NN 27//
#define N1 11//
#define N2 16//
#define predict_sample 24//
#define dd 11//
#define N 6//

//global variables
//int N=     //样本数
//int d=     //维数
char shuru[100];//样本数据存放的文件名及其路径
char parameter[100];//
char result[100];//存放对预测样本的函数输出值,以及预测精度结果等的文件名及其存放路径


double t0=14.5,grad=3.0,D1=1954.6,srm18=3.5,h1=4.2,ri1=35.0,ssp=-62.0;
double rw75=0.911,gmin=40.0,gmax=140.0,gcur=3.7,xm=1.61,xn=1.73;
double rsh=8.0,xx=7.779,fep0=2.43,A=1.04;
int G=2,swop=3,sg=1,mn[2]={N1,N2};
double oil[N1][dd],water[N2][dd],unk[predict_sample][dd];

void spcorr(double,double,double *,double*);
void can(double *,double *);
void sum1(double *,int,double *);
void sum2(double *,int,double *,double *);
void guige(double *,int,double *,double *,double *);
void ave(int,double *,double *,double *);
void def(int,double *,double *,double *);
void ivsnc(double *);
void pm(double *,double *,double *,double *,double *,int *);
void setX();


/*G表示样本类别数*/
/*N表示规格化后得样本属性个数*/
/*swop=3表示计算sw时所用公式为第三个*/
/*mn*/




/***************************主函数********************************/

void main()
{
	double m1,u,dep,fep,h,d;
	double v[N],zz[N],x11[N1][N],x22[N2][N],v1[N],v2[N],u1[N],u2[N];
	double uu[N],x1[N1][N],x2[N2][N],t[N][N],aa[N],b1[N1][N];
	double w[6][6],s[6][6],b2[N2][N],co[2],c[2][6],ff[2],pmax,z[6];
	double tave[6],a[2][6],sum;
	double z1[100][6],z2[100][6];
	int i,j,k,m,l,i1,ii,jj,ie,ip,IG,ih,ni;

/************第一部分****对样本数据进行处理求出判别公式***********/
	setX();//从文件中将数据读入数组

    cout<<endl<<endl;
	cout<<"    ********************对样本数据进行处理***********************"<<endl;
	cout<<endl;
	cout<<"原始样本数据如下:"<<endl;
	cout<<endl;
	cout<<"G   NO1     VSH       POR       SO        FRB       FRC       FRE"<<endl<<endl;
	for(k=0;k<N;k++)
	{
		v1[k]=0.0;
     	u1[k]=0.0;
		v2[k]=0.0;
     	u2[k]=0.0;
	}    
	m=0;
	for(i=0;i<G;i++)
	{   
		ni=mn[i];		
		m=m+ni;	 		
		if(i==0)
		{
			for(j=0;j<ni;j++)
			{
			     printf("%2d",i+1);
				 printf("%4d",j+1);
                 can(oil[j],zz);
				 for(k=0;k<N;k++)
				 {	 x11[j][k]=zz[k];
				     printf("%10.3f",x11[j][k]);
				 }
				 printf("\n");
			}
			sum1(*x11,ni,v1);							
		}
		printf("\n");
		if(i==1)
		{
			for(j=0;j<ni;j++)
			{
				printf("%2d",i+1);
				printf("%4d",j+1);
				can(water[j],zz);
				for(k=0;k<N;k++)
				{
					x22[j][k]=zz[k];
					printf("%10.3f",x22[j][k]);
				}
				printf("\n");
			}
            sum1(*x22,ni,v2);
		}
	}	
	for(k=0;k<N;k++)
	{
		v[k]=(v1[k]+v2[k])/m;		
	}
	for(i=0;i<G;i++)
	{
		ni=mn[i];
		if(i==0)
		{
			sum2(*x11,ni,v,u1);
		}
		if(i==1)
		{
			sum2(*x22,ni,v,u2);
		}
		
	}
	m1=1;
	for(k=0;k<N;k++)
	{
		uu[k]=(u1[k]+u2[k])/(m-m1);	
	}

	
	cout<<endl<<endl;
	cout<<"规格化数据数据如下:"<<endl<<endl;		
	cout<<"G    NO1   VSH       POR       SO        FRB       FRC       FRE"<<endl<<endl;
	for(i=0;i<G;i++)
	{	
		ni=mn[i];
		if(i==0)
		{
			guige(*x11,ni,v,uu,*x1);		
			for(j=0;j<ni;j++)
			{			
                printf("%2d",i+1);
				printf("%4d",j+1);
				for(k=0;k<N;k++)
					printf("%10.3f",x1[j][k]);
				printf("\n");
			}
			printf("\n");
		}
		if(i==1)
		{
			guige(*x22,ni,v,uu,*x2);		
			for(j=0;j<ni;j++)
			{
				printf("%2d",i+1);
				printf("%4d",j+1);
				for(k=0;k<N;k++)
					printf("%10.3f",x2[j][k]);
				printf("\n");
			}
		}
	}

	for(i=0;i<N;i++)
		for(j=0;j<N;j++)
			t[i][j]=0.0;
	for(i=0;i<G;i++)
	{
		ni=mn[i];
		if(i==0)
		{
			ave(ni,*x1,aa,*b1);
			def(ni,*b1,*w,*s);
		}
		if(i==1)
		{
			ave(ni,*x2,aa,*b2);
			def(ni,*b2,*w,*s);
		}
		for(j=0;j<N;j++)
			a[i][j]=aa[j];
		for(j=0;j<N;j++)
			for(k=0;k<N;k++)
				t[j][k]=t[j][k]+s[j][k];
	}
	for(j=0;j<N;j++)
	{
		sum=0.0;
		m=0;
		m=m+mn[i];
		for(i=0;i<G;i++)
		{
			sum=sum+mn[i]*a[i][j];
			m=m+mn[i];			
		}	
		tave[j]=sum/m;
	}
	cout<<endl;
	cout<<"均值为:"<<endl<<endl;
	for(i=0;i<G;i++)
	{
		for(j=0;j<N;j++)
			printf("%12.4f",a[i][j]);
		printf("\n");
	}

    cout<<endl;
    cout<<"总均值为:"<<endl<<endl;
	for(j=0;j<N;j++)
		printf("%13.4e",tave[j]);
    cout<<endl<<endl;
    cout<<"协方差矩阵为:"<<endl<<endl;
	for(i=0;i<N;i++)
	{
		for(j=0;j<N;j++)
			printf("%12.5f",t[i][j]);
		printf("\n");
	}	
	cout<<endl;
    cout<<"协方差逆矩阵为:"<<endl<<endl;
	ivsnc(*t);	
    for(i=0;i<N;i++)
	{
		for(j=0;j<N;j++)
			printf("%12.5f",t[i][j]);
		printf("\n");
	}
	for(i=0;i<G;i++)
	{
		sum=0.0;
		for(k=0;k<N;k++)
		{
			c[i][k]=0.0;
			for(l=0;l<N;l++)
			{
				c[i][k]=c[i][k]+t[k][l]*a[i][l];
				sum=sum+t[l][k]*a[i][k]*a[i][l];
			} 			
		}
		co[i]=(-0.5)*sum;		
	}
	cout<<endl;
    cout<<"判别系数为:"<<endl<<endl;
	for(i=0;i<G;i++)
	{
		for(k=0;k<N;k++)
		{
			printf("%11.5f",c[i][k]);			
		}	    
		printf("%11.5f",co[i]);
		printf("\n");
	}	
	printf("\n");
	cout<<"判别结果:"<<endl<<endl;
	cout<<"  G  NO1   VSH       POR       SO        FRB       FRC       FRE      PMAX  NO2"<<endl;
	for(i=0;i<G;i++)
	{
		ni=mn[i];
		for(ii=0;ii<ni;ii++)
		{
			for(jj=0;jj<N;jj++)
			{
				if(i==0)z[jj]=x1[ii][jj];
				if(i==1)z[jj]=x2[ii][jj];
			}
			pm(*c,co,z,ff,&pmax,&i1);
			printf("%3d%4d",i+1,ii+1);
			for(jj=0;jj<N;jj++)
				printf("%8.3f  ",z[jj]);
			printf("%8.4f%3d\n",pmax,i1+1);
		}
		printf("\n");
	}
	u=0.0;
	for(k=0;k<N;k++)
	{
		h=0.0;
		for(l=0;l<N;l++)
		{
             d=0.0;
			 for(i=0;i<G;i++)
				 d=d+ni*a[i][k]-tave[k]*(a[i][l]-tave[l]);
			 h=h+t[k][l]*d;
		}
		u=u+h;
	}
	cout<<" 显著性检验结果:"<<endl<<endl;
	if(u<=xx)cout<<" 组内差异小"<<endl;
	else cout<<" 组间差异不显著"<<endl;
	IG=G-1;
	for(ie=0;ie<IG;ie++)
	{
		ih=ie+1;
		for(ip=ih-1;ip<G;ip++)
		{
			for(k=0;k<N;k++)
			{
				dep=(c[k][ie]-c[k][ip])*(a[ie][k]-a[ip][k]);
			}
			fep=((m-G-N+1)*mn[ie]*mn[ip]*dep*dep)/((m-G)*N*mn[ie]+mn[ip]);
	     	if(fep<=fep0)
			{
				cout<<" 组间差异不显著"<<endl;
				goto end1;
			}
		}         
	}
	cout<<" 组间差异显著"<<endl;    
	
end1:cout<<endl;
	cout<<"    *********************对未知样本进行预测**************************"<<endl<<endl;
	cout<<" 提示:输入样本以输入深度(D)为零表示输入结束"<<endl<<endl;
	cout<<" 按顺序依次输入 D H RM18 DM RLLD RLLS GR AC RXO RI SP"<<endl<<endl;
	cout<<" 以空格分开各个样本属性值,回车然后输入下一个未知样本"<<endl<<endl;
	cout<<" 请输入未知样本:\n"<<endl;
   	for(i=0;i<predict_sample;i++)
	{
    	can(unk[i],zz);		
    	for(j=0;j<N;j++)
		{
	   		z1[i][j]=zz[j];				
		}   
	}
    guige(*z1,predict_sample,v,uu,*z2);	
    for(i=0;i<predict_sample;i++)
	{ 
     	printf("%3d",i+1);
       	for(j=0;j<N;j++)
		{
     		z[j]=z2[i][j];
     		printf("%10.4f",z[j]);
		}
	   	pm(*c,co,z,ff,&pmax,&i1);		
	   	printf("%10.4f%4d",pmax,i1+1);
    	printf("\n");	
	}
   	printf("预测结束\n");
}


void spcorr(double h,double ri,double *rm,double *yy)
{
	double y[5],x[5]={5.0,20.0,50.0,100.0,200.0},p[4],q[3],r[2];
    double x1,s;
	int i=0;
	x1=ri/(*rm);
	h=h/0.3048;
	h=log10(h);
    y[0]=0.7287-1.6228*h+1.2741*h*h-0.3564*pow(h,3);
	y[1]=1.2735-2.8651*h+2.2902*h*h-0.6383*pow(h,3);
	y[2]=1.4156-2.6646*h+1.7730*h*h-0.4146*pow(h,3);
	y[3]=1.9524-3.7751*h+2.6247*h*h-0.6449*pow(h,3);
	y[4]=3.0503-6.5901*h+5.1026*h*h-1.3703*pow(h,3);
	for(i=0;i<5;i++)
		y[i]=pow(10.0,y[i]);
	for(i=0;i<4;i++)
		p[i]=(y[i+1]-y[i])/(x[i+1]-x[i]);
	for(i=0;i<3;i++)
		q[i]=(p[i+1]-p[i])/(x[i+2]-x[i]);
	for(i=0;i<2;i++)
		r[i]=(q[i+1]-q[i])/(x[i+3]-x[i]);
	s=(r[1]-r[0])/(x[4]-x[0]);
	*yy=y[0]+p[0]*(x1-x[0])+q[0]*(x1-x[0])*(x1-x[1])+r[0]*(x1-x[0])*(x1-x[1])*(x1-x[2])+s*(x1-x[0])*(x1-x[1])*(x1-x[2])*(x1-x[3]);
   	return;
}

void can(double *shu,double *zz)
{   
	double d,h,rm18,dm,rlld,rlls,gr,ac,rxo,ri,sp,t,psp,k,c,rw,rwn,rmn,rmfn;
	double rmfen,rwen,rmf,rt,sh1,sh,sw,so,sxo,fre,frc,frb,por,alfa,rm,yy;
	int ki;
	d=shu[0];h=shu[1];rm18=shu[2];dm=shu[3];rlld=shu[4];rlls=shu[5];
	gr=shu[6];ac=shu[7];rxo=shu[8];ri=shu[9];sp=shu[10];
	t=t0+grad*d/100;
	rm=71.4*rm18/(1.8*t+39.0);
	spcorr(h,ri,&rm,&yy);
	psp=yy*sp;
	/*计算rw*/
	t=1.8*t+32.0;
	k=60.0+0.133*t;
	c=1.78363+4.94273*0.1*dm-1.76949*pow(dm,2)+5.89192*0.1*pow(dm,3);
	if(rw75!=0.0)rwn=rw75;
	else
	{
		rmn=71.4*rm18/82.0;
		rmfn=c*pow(rmn,1.07);
		if(rmfn>0.1)rmfen=0.85*rmfn;
		else rmfen=(146.0*rmfn-5.0)/(337.0*rmfn+77.0);
		rwen=rmfen/pow(10,(-psp/k));
		if(rwen>0.12)rwn=-0.58+pow(10.0,(0.69*rwen-0.24));
		else rwn=(77.0*rwen+5.0)/(146.0-337.0*rwen);
	}
	rw=82.0*rwn/(t+7.0);
	rmf=c*pow(rm,1.07);
	/*计算rt*/
	rt=(rlld-0.29*rxo)*pow((rlld/rlls),0.1)/0.71;
	if((rlld<=rlls)||(rlld<=rxo))rt=rlld;
	/*计算vsh*/
	sh1=(gr-gmin)/(gmax-gmin);
	if(sh1>1.0)sh1=1.0;
	if(sh1<0.0)sh1=0.0;
	sh=(pow(2.0,(gcur*sh1))-1.0)/(pow(2.0,gcur)-1.0);
	/*计算por*/
	ac=ac/0.3048;
	if(sg!=1)por=1.64*pow(10,-3.0)*ac-0.232;
	else por=1.64*pow(10,-3.0)*ac-0.35*sh-0.202;
	if(por<0.001)por=0.001;
	/*计算sw,sxo*/
	ki=swop;
	if(ki==1)
	{
		sw=(sqrt(0.81*rw/rt)-sh*(rw/(0.4*rsh)))/por;
		sxo=(1.0/por)*(sqrt(0.81*rmf/rxo)-sh*(rmf/(0.4*rsh)));			 
	}
		
	if(ki==2)
	{
		xm=1.87+0.019/por;
		if(por>0.1)xm=2.1;
		if(xm>4.0)xm=4.0;
	    A=1.0;	   
        sw=pow(A*rw/(pow(por,xm)*rt),(1.0/xn));
		sxo=pow(A*rmf/(pow(por,xm)*rxo),1.0/xn);				 
	}
	if(ki==3)
	{	 
		sw=pow((A*rw/(pow(por,xm)*rt)),(1.0/xn));
		sxo=pow((A*rmf)/(pow(por,xm)*rxo),(1.0/xn));	  
	}	
   	if(sw>0.999)sw=0.999;
	if(sw<0.001)sw=0.001;
	if(sxo>0.8)sxo=sw;
	if(sxo<sw)sxo=sw;
	fre=sw/sxo;
	so=1.0-sw;
	frc=rxo/rt;
	alfa=psp/ssp;
	frb=alfa*rt/rw;
	zz[0]=sh;
	zz[1]=por;
	zz[2]=so;
	zz[3]=frb;
	zz[4]=frc;
	zz[5]=fre;	
	return;	
}

void sum1(double *x,int ni,double *v)
{
	double sum;
	int k,j;
	for(k=0;k<N;k++)
	{
        sum=0.0;
		for(j=0;j<ni;j++)
			sum=sum+*(x+j*N+k);
		v[k]=sum;	
	}	
	return;
}

void sum2(double *x,int ni,double *v,double *u)
{
	int j,k;
	double sum;
	for(k=0;k<N;k++)
	{
		sum=0.0;
		for(j=0;j<ni;j++)
		{
			sum=sum+pow((*(x+j*6+k)-v[k]),2.0);
		}
		u[k]=sum;
		if(u[k]<0.000001)u[k]=0.000001;
		u[k]=sqrt(u[k]);	
	}
	return;
}

void guige(double *x,int ni,double *v,double *uu,double *y)
{
	int j,k;
	for(j=0;j<ni;j++)
		for(k=0;k<N;k++)
			*(y+k+j*6)=(*(x+k+j*6)-v[k])/uu[k];
	return;	
}

void ave(int ni,double *x,double *aa,double *b)
{
	int j,k;
	double sum;
	for(j=0;j<N;j++)
	{
		sum=0.0;
		for(k=0;k<ni;k++)
			sum=sum+*(x+6*k+j);	
		aa[j]=sum/ni;
		for(k=0;k<ni;k++)
			*(b+6*k+j)=*(x+6*k+j)-aa[j];
	}
	return;
}

void def(int ni,double *b,double *w,double *s)
{
	int k,l,j;
	double sum;
	for(k=0;k<N;k++)
		for(l=0;l<N;l++)
		{
			sum=0.0;
		    for(j=0;j<ni;j++)
				sum=sum+(*(b+k+6*j))*(*(b+l+6*j));
			*(w+l+6*k)=sum;
			*(s+l+6*k)=*(w+l+6*k)/(ni-1);
		}
	return;
}

void ivsnc(double *t)
{
	int i,j,k;
	double tkk,tit;
	for(k=0;k<N;k++)
	{
		tkk=*(t+k+N*k);
		for(j=0;j<N;j++)
		{
			*(t+j+N*k)=(*(t+j+N*k))/tkk;
		}
		*(t+k+N*k)=1.0/tkk;
		for(i=0;i<N;i++)
		{
			if(i==k)continue;
		    tit=*(t+N*i+k);
		    for(j=0;j<N;j++)
			{
				*(t+j+N*i)=*(t+j+N*i)-tit*(*(t+j+N*k));
			}
			*(t+k+N*i)=(-1.0)*tit*(*(t+k+N*k));
		}
	}
	return;
}

void pm(double *c,double *co,double *z,double *ff,double *pmax,int *i1)
{
	double fma,sum,h,p,q;
	int i,k,j;
	fma=0.0;	
	for(i=0;i<G;i++)
	{
	    sum=0.0;
		for(k=0;k<N;k++)
		{
			sum=sum+(*(c+k+N*i))*z[k];
		}
		ff[i]=sum+co[i];
		if(fma>=ff[i])continue;
		fma=ff[i];	
	}
	*pmax=0.0;
    h=0.0;
    for(j=0;j<G;j++)
	{
		h=h+exp(ff[j]-fma);
	}
    for(i=0;i<G;i++)
	{
  	   q=exp(ff[i]-fma);
	   p=q/h;
   	   if((*pmax)>=p)continue;
	   *pmax=p;
	   *i1=i;		
	}
	return;
}
//计算样本X[]
void setX()
{
	char shuru[100]={"e:\\data\\total.txt"};
	cout<<"请输入样本数据的文件名及其路径"<<endl;
	FILE *fp=fopen(shuru,"r");	
	if(fp == NULL)
	{
		cout<<"can't open the file "<<shuru<<endl;
		exit(1);
	}		
	int i1=0,i2=0,j,d1;
	float value;  
	for(int i=0;i<NN;i++)
	{   
		j=0;
		int c=fgetc(fp);
		if(c==-1)break;
		if(char(c)=='+') 
		{
	    	c=fgetc(fp);
			while(1)
			{	
		    	do
				{
					c=fgetc(fp);
				    if(c=='\n')
					{   i1++;
				    	goto out2;
					}	
				}while(isspace(c));
		    	ungetc(c,fp);			
		    	fscanf(fp,"%d:%f",&d1,&value);
		    	oil[i1][j]=value;
	    		j++;
			}
			
		}		
		else if(char(c)=='-')
		{
			c=fgetc(fp);	
			while(1)
			{	
		    	do
				{
					c=fgetc(fp);
				    if(c=='\n')
					{
						i2++;
						goto out2;
					}	
				}while(isspace(c));
		    	ungetc(c,fp);			
		    	fscanf(fp,"%d:%f",&d1,&value);
		    	water[i2][j]=value;
	    		j++;
			}	
		}		
      out2:continue;	
	}
	for(i=0;i<predict_sample;i++)
	{
        j=0;
		int c=fgetc(fp);
		if(c==-1)break;		
	    c=fgetc(fp);
		while(1)
		{	
		   	do
			{
				c=fgetc(fp);
			    if(c=='\n')
				{   i1++;
			    	goto out3;
				}	
			}while(isspace(c));
		   	ungetc(c,fp);			
		   	fscanf(fp,"%d:%f",&d1,&value);
		   	unk[i][j]=value;
	    	j++;
		}
    out3:continue;
	}
    fclose(fp);  

	for(i=0;i<predict_sample;i++)
	{
		for(j=0;j<dd;j++)
		{
			cout<<unk[i][j]<<"   ";
		}
		cout<<endl;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -