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

📄 c语言编bp算法及使用说明.txt

📁 c语言编bp算法及使用说明,可以对高维输入训练~~希望对初学NN的朋友有帮助。 飘渺水云间
💻 TXT
字号:
发信人: EAgleSoar (绝对零度), 板面: Simulate
标  题: c语言编bp算法及使用说明
发信站: 飘渺水云间 (Wed Jan 26 20:20:25 2005), 转信


c语言编bp算法及使用说明
训练样本数据文件sample.txt输入格式:(单样本对)
(x1,x2,x3....xh,d1,d2,d3,...dj)

测试样本数据输入:(从键盘输入)
x1,x2,x3...xh
屏幕输出:y1,y2,y3...yj

在确定网络结构以后,即可确定(输入层)nh,(隐层)ni,(输出层)nj,(样本容量)nk
每次使用之前请修改网络结构数据。
#include <stdio.h>
#include <math.h>
#include <conio.h>
#include <stdlib.h>
#define nh 4
#define ni 9
#define nj 3
#define nk 30
#define nr 0.85/*学习效率*/
#define EPS 0.00001

float x[nk][nh],d[nk][nj],whi[nh][ni],wij[ni][nj],thi[ni],thj[nj];
int h,i,j,k;
float xmin[nh],xmax[nh],dmin[nj],dmax[nj];
FILE *fp1,*fp2;

void init(void);
void startleaning(void);
void testsample(void);
void readw(void);
void writew(void);
float sigmoid(float a);
double ranu(void);

void init(void)
{int min,max;

if(fp1==0)
{
 clrscr();
 printf("Can not find the learning sample file!\n");
 exit(0);
}
for(k=0;k<nk;k++)
 {
  for(h=0;h<nh;h++)
   fscanf(fp1,"%f",&x[k][h]);
  for(j=0;j<nj;j++)
   fscanf(fp1,"%f",&d[k][j]);
 }
 for(h=0;h<nh;h++)
 {
  min=1;max=1;
  for(k=0;k<nk;k++)
   {
    if(x[k][h]<x[min][h]) min=k;
    if(x[k][h]>x[max][h]) max=k;
   }
  xmin[h]=x[min][h];
  xmax[h]=x[max][h];
  for(k=0;k<nk;k++)/*归一化*/
  x[k][h]=(x[k][h]-xmin[h])/(xmax[h]-xmin[h]);
 }
for(j=0;j<nj;j++)
 {
  min=1;max=1;
  for(k=0;k<nk;k++)
   {
    if(d[k][j]<d[min][j]) min=k;
    if(d[k][j]>d[max][j]) max=k;
   }
   dmin[j]=d[min][j];
   dmax[j]=d[max][j];
  for(k=0;k<nk;k++)/*归一化*/
d[k][j]=(d[k][j]-dmin[j])/(dmax[j]-dmin[j]);


 }
}
/*----------------------------------------------------*/
void startlearning(void)
{
long int nt,n;
float t,error[nk],gerror,xj[nj],xi[ni],yj[nj],yi[ni],pxi[ni],pxj[nj];
if(fp2==0)
 {
  for(i=0;i<ni;i++)
   {
    for(h=0;h<nh;h++)
     whi[h]=-0.1+0.2*ranu();
    for(j=0;j<nj;j++)
     wij[j]=-0.1+0.2*ranu();
    thi=-0.1+0.2*ranu();
   }
   for(j=0;j<nj;j++)
    thj[j]=-0.1+0.2*ranu();
   fp2=fopen("w.txt","w+");
 }
else
 readw();

/*学习开始*/
printf("\t\nPlease enter the learning times:\n");
scanf("%ld",&nt);
for(n=0;n<nt;n++)   /*学习次数*/
{gerror=0;
 for(k=0;k<nk;k++)/*单样本循环*/
  {
    for(i=0;i<ni;i++)
     {
      t=0;
      for(h=0;h<nh;h++)
       t+=whi[h]*x[k][h];
      xi=t+thi;
      yi=sigmoid(xi);
     }
     for(j=0;j<nj;j++)
      {
t=0;
for(i=0;i<ni;i++)
t+=wij[j]*yi;
xj[j]=t+thj[j];
yj[j]=sigmoid(xj[j]);
}

      for(j=0;j<nj;j++)/*输出层单样本点误差变化率*/
pxj[j]=yj[j]*(1-yj[j])*(yj[j]-d[k][j]);
      for(i=0;i<ni;i++)/*隐层单样本点误差变化率*/
       {
t=0;
for(j=0;j<nj;j++)
 t+=pxj[j]*wij[j];
pxi=yi*(1-yi)*t;
}
       for(j=0;j<nj;j++)
{thj[j]=thj[j]-nr*pxj[j];
 for(i=0;i<ni;i++)
  wij[j]=wij[j]-nr*pxj[j]*yi;
}
      for(i=0;i<ni;i++)
{thi=thi-nr*pxi;
for(h=0;h<nh;h++)
 whi[h]=whi[h]-nr*pxi*x[k][h];
}

t=0;
for(j=0;j<nj;j++)
t+=(yj[j]-d[k][j])*(yj[j]-d[k][j])/2.0;
error[k]=t;
gerror+=error[k];/*全局误差 g(lobal)error*/
  }/*单样本循环结束*/
  if(gerror<EPS) break;
}/* 学习循环结束*/
 writew();
 printf("\t\nGlobal error=%f\n",gerror);
 printf("\t\nAre you satisfied with the global error?\n");
 printf("Press any key to choose a next task!\n");
 getch();

}
/*-------------------------------------------------*/
void testsample(void)
{float tx[nh],t,xj[nj],xi[ni],yj[nj],yi[ni];
 if(fp2==0)
  {
   clrscr();
   printf("\t\ncan not find the weight file:w.txt\n");
   exit(0);
  }
  readw();
  printf("\t\nPlease enter the test data:\n");
  for(h=0;h<nh;h++)
  scanf("%f",&tx[h]);
  for(h=0;h<nh;h++)
   tx[h]=(tx[h]-xmin[h])/(xmax[h]-xmin[h]);
  for(i=0;i<ni;i++)
     {
      t=0;
      for(h=0;h<nh;h++)
       t+=whi[h]*tx[h];
      xi=t+thi;
      yi=sigmoid(xi);
     }
     for(j=0;j<nj;j++)
      {
t=0;
for(i=0;i<ni;i++)
t+=wij[j]*yi;
xj[j]=t+thj[j];
yj[j]=sigmoid(xj[j]);
}
   printf("\t\nNetwork output:\n");

   for(j=0;j<nj;j++)
    {
    yj[j]=yj[j]*(dmax[j]-dmin[j])+dmin[j];
    printf("%f ",yj[j]);
    }
   printf("\t\nAre you satisfied with the output?\n");
   printf("Press any key to choose a next task!\n");
   getch();
}
/*----------------------------------------------*/
void writew(void)
{
rewind(fp2);
for(h=0;h<nh;h++)
 {
  for(i=0;i<ni;i++)
   fprintf(fp2,"%8.3f ",whi[h]);
   fprintf(fp2,"\n");
 }
fprintf(fp2,"\n");

for(i=0;i<ni;i++)
 fprintf(fp2,"%8.3f ",thi);
fprintf(fp2,"\n\n");

for(j=0;j<nj;j++)
 {
  for(i=0;i<ni;i++)
   fprintf(fp2,"%8.3f ",wij[j]);
  fprintf(fp2,"\n");
 }
fprintf(fp2,"\n");
for(j=0;j<nj;j++)
 fprintf(fp2,"%8.3f ",thj[j]);
}
/*------------------------------------------------*/
void readw(void)
{
for(h=0;h<nh;h++)
 for(i=0;i<ni;i++)
   fscanf(fp2,"%f",&whi[h]);
for(i=0;i<ni;i++)
 fscanf(fp2,"%f",&thi);
for(j=0;j<nj;j++)
 for(i=0;i<ni;i++)
  fscanf(fp2,"%f",&wij[j]);
for(j=0;j<nj;j++)
 fscanf(fp2,"%f",&thj[j]);
}
/*--------------------------------*/
float sigmoid(float a)
{return(1.0/(1+exp(-a)));}
/*----------------------------------*/
double ranu(void)
{static double xrand=3.0;
 double m=8589934592.0,
a=30517578125.0;
lp: xrand=fmod(xrand*a,m);
   if(xrand>1.0) return(xrand/m);
   else { xrand=1.0;goto lp;}
}
/*----------------------------------*/

void main()
{
fp1=fopen("sample.txt","r");
fp2=fopen("w.txt","r+");
init();
 while(1)
 {clrscr();
 printf("\t\n    Please choose a next task...\n\n");
 printf("\t\n     (S) to start learning.\n");
 printf("\t\n     (T) to test samples.\n");
 printf("\t\n     (R) to resume learning.\n");
 printf("\t\n     (Q)uit.\n");
 switch(getchar())
 {case 's': startlearning();break;
  case 't': testsample();break;
  case 'r': startlearning();break;
  case 'q': exit(0);break;
 }
 }
fclose(fp1);
fclose(fp2);
}
/*----------------By ahzhming@163.com海阔天空-------------------------*/

--

※ 来源:·飘渺水云间 freecity.cn·[FROM: EAgleSoar]

⌨️ 快捷键说明

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