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

📄 ann1.c

📁 两类正态分布模式贝叶斯分类算法源程序
💻 C
字号:
#include "stdio.h"
#include "math.h"
#include <stdlib.h>
main()
{
 float data[10][65],yb[10],yc[10],yd,sb[10],sc[10],data1[64],
	   sd,wab[65][10],wbc[11][10],wcd[11],Vab[65][10],
	   Vbc[11][10],Vcd[11],Eb[10],Ec[10],Ed;
 float con=5,sum,error,td,temp;
 int i,j,flag,k;
 FILE *fp;
 float F();
 float F1();

 if((fp=fopen("train.txt","r"))==NULL)//read data
	{printf("\n the file train.txt can not be opened");
	 exit(0);
	}

 for(i=0;i<10;i++)
   	for(j=0;j<65;j++)
			fscanf(fp,"%f",&data[i][j]);
 fclose(fp);
 
 for(i=0;i<=64;i++)
	 for(j=0;j<10;j++)
	 {
	  temp=rand()%100;
	  temp/=100;
	  if(temp>0.4) temp-=1;
	  wab[i][j]=temp;
	 }
	 
 for(i=0;i<=10;i++)
	 for(j=0;j<10;j++)
	 {
	  temp=rand()%100;
	  temp/=100;
	  if(temp>0.4) temp-=1;
	  wbc[i][j]=temp;
	 }

 for(i=0;i<=10;i++)
 { 
  temp=rand()%100;
  temp/=100;
  if(temp>0.4) temp-=1;
  wcd[i]=temp;
 }


 do
 {
  flag=0;//标记是否收敛
  for(k=0;k<10;k++)
  {
	//forward calculate
   for(i=0;i<10;i++)
    sb[i]=0;
   
   for(j=0;j<10;j++)
   	for(i=0;i<64;i++)
     sb[j]=sb[j]+wab[i][j]*data[k][i];
   for(i=0;i<10;i++)
    sb[i]=sb[i]-1.0*wab[64][i];
   for(i=0;i<10;i++)
   	yb[i]=F(sb[i]);//f(s)=1/(1+exp(-s))
   
   for(i=0;i<10;i++)
    sc[i]=0;
   for(j=0;j<10;j++)
    for(i=0;i<10;i++)
     sc[j]=sc[j]+wbc[i][j]*yb[i];
   for(i=0;i<10;i++)
	sc[i]=sc[i]-1.0*wbc[10][i];
   for(i=0;i<10;i++)
    yc[i]=F(sc[i]);

    sd=0;
   for(i=0;i<10;i++)
    sd=sd+wcd[i]*yc[i];
    sd=sd-1.0*wcd[10];
   yd=F(sd);
   
   td=data[k][64];
   //error=0.5*(data[k][64]-yd)*(data[k][64]-yd);
   error=fabs(td-yd);
   if(error>0.005)
	flag=1;
	//error feedback
   Ed=F1(sd)*(td-yd);//f1(s)=f(s)(1-f(s))
   for(i=0;i<10;i++)
    Vcd[i]=con*Ed*yc[i];
   Vcd[10]=con*Ed*(-1.0);
    
   for(i=0;i<10;i++)
   Ec[i]=F1(sc[i])*wcd[i]*Ed;
   for(i=0;i<10;i++)
    for(j=0;j<10;j++)
     Vbc[i][j]=con*Ec[j]*yb[i];
   for(i=0;i<10;i++)
	Vbc[10][i]=con*Ec[i]*(-1.0);
       
   for(i=0;i<10;i++)
   {sum=0;
    for(j=0;j<10;j++)
     sum=sum+wbc[i][j]*Ec[j];
    Eb[i]=F1(sb[i])*sum;
   }
   for(i=0;i<64;i++)
    for(j=0;j<10;j++)
     Vab[i][j]=con*Eb[j]*data[k][i];
   for(i=0;i<10;i++)
	Vab[64][i]=con*Eb[j]*(-1.0);

   if(k==9&&flag==0)
	   goto recog;

    //calculate quan zhi
   for(i=0;i<=64;i++)
    for(j=0;j<10;j++)
	 wab[i][j]=wab[i][j]+Vab[i][j];
   
   for(i=0;i<=10;i++)
    for(j=0;j<10;j++)
	 wbc[i][j]=wbc[i][j]+Vbc[i][j];
  
   for(i=0;i<=10;i++)
    wcd[i]=wcd[i]+Vcd[i];

   printf("yd=%f  td=%f  error=%f\n",yd,td,error);
  }
 }
 while(flag);

//识别

recog:
if((fp=fopen("sample.txt","r"))==NULL)//read data
	{printf("\n the file sample.txt can not be opened");
	 exit(0);
	}

   	for(j=0;j<64;j++)
			fscanf(fp,"%f",&data1[j]);

   for(i=0;i<10;i++)
    sb[i]=0;
   
   for(j=0;j<10;j++)
   	for(i=0;i<64;i++)
     sb[j]=sb[j]+wab[i][j]*data1[i];
   for(i=0;i<10;i++)
    sb[i]=sb[i]-1.0*wab[64][i];
   for(i=0;i<10;i++)
   	yb[i]=F(sb[i]);//f(s)=1/(1+exp(-s))
   
   for(i=0;i<10;i++)
    sc[i]=0;
   for(j=0;j<10;j++)
    for(i=0;i<10;i++)
     sc[j]=sc[j]+wbc[i][j]*yb[i];
   for(i=0;i<10;i++)
	sc[i]=sc[i]-1.0*wbc[10][i];
   for(i=0;i<10;i++)
    yc[i]=F(sc[i]);

    sd=0;
   for(i=0;i<10;i++)
    sd=sd+wcd[i]*yc[i];
    sd=sd-1.0*wcd[10];
   yd=F(sd);
   printf("yd=%f ",yd);

}

float F(s)
float s;
{
 float value;
 value=1/(1+exp(-s));
 return(value);
}

float F1(s)
float s;
{
 float value;
 value=exp(-s)/((1+exp(-s))*(1+exp(-s)));
 return(value);
}

⌨️ 快捷键说明

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