C++的BP算法源程序
时间:2010-04-06 20:00来源:网络 作者:秩名 点击:次
本文给出了一个C++下面BP神经网络算法的源程序。
BP神经网络算法C++源程序:
- #include "iostream.h"
- #include "iomanip.h"
- #define N 20 //学习样本个数
- #define IN 1 //输入层神经元数目
- #define HN 8 //隐层神经元数目
- #define ON 1 //输出层神经元数目
- double P[IN];
- double T[ON];
- double W[HN][IN];
- double V[ON][HN];
- double X[HN];
- double Y[ON];
- double H[HN];
- double O[ON];
- double sita[HN];
- double gama[ON];
- double err_m[N];
- double alpha;
- double beta;
-
- struct {
- double input[IN];
- double teach[ON];
- }Study_Data[N][IN];
-
-
-
-
- initial()
- {
- float sgn;
- float rnd;
- int i,j;
-
- {
-
- sgn=rand();
- rnd=sgn*(rand()%100);
- W[j][i]= rnd/100;
- }
-
- {
-
- sgn=rand();
- rnd=sgn*(rand()%1000);
- sita[j]= rnd/1000;
- cout<<"sita"<<sita[j]<<endl;
- }
-
-
- for (int k=0;k<ON;k++)
- for (int j=0;j<HN;j++)
- {
-
- sgn=rand();
- rnd=sgn*(rand()%1000);
- V[k][j]=rnd/1000;
- }
-
- {
-
- sgn=rand();
- rnd=sgn*(rand()%10);
- gama[k]=rnd/10;
- cout<<"gama[k]"<<endl;
- }
- return 1;
-
- }
-
-
-
-
-
- input_P(int m)
- {
- for (int i=0;i<IN;i++)
- P[i]=Study_Data[m]->input[i];
-
-
-
- return 1;
- }
-
-
-
-
- input_T(int m)
- {
- for (int k=0;k<m;k++)
- T[k]=Study_Data[m]->teach[k];
-
- return 1;
- }
-
-
-
-
- H_I_O(){
- double sigma;
- int i,j;
- for (j=0;j<HN;j++)
- sigma=0.0;
- for (i=0;i<IN;i++)
- sigma+=W[j][i]*P[i];
- }
- X[j]=sigma - sita[i];
- H[j]=1.0/(1.0+exp(-X[j]));
- }
- return 1;
- }
-
-
-
-
- O_I_O()
- {
- double sigma;
- for (int k=0;k<ON;k++)
- sigma=0.0;
- for (int j=0;j<HN;j++)
- sigma+=V[k][j]*H[k];
- }
- Y[k]=sigma-gama[k];
- O[k]=1.0/(1.0+exp(-Y[k]));
- }
- return 1;
- }
-
-
-
-
- double d_err[ON];
- Err_O_H(int m)
- {
- double abs_err[ON];
- double sqr_err=0;
-
- for (int k=0;k<ON;k++)
- abs_err[k]=T[k]-O[k];
-
- sqr_err+=(abs_err[k])*(abs_err[k]);
-
- d_err[k]=abs_err[k]*O[k]*(1.0-O[k]);
- }
- err_m[m]=sqr_err/2;
- return 1;
- }
-
-
-
-
- double e_err[HN];
- Err_H_I(){
- double sigma;
-
- for (int j=0;j<HN;j++)
- sigma=0.0;
- for (int k=0;k<ON;k++)
- sigma=d_err[k]*V[k][j];
- }
- e_err[j]=sigma*H[j]*(1-H[j]);
- }
- return 1;
- }
-
-
-
-
- Delta_O_H(int m,FILE* fp)
- {
- for (int k=0;k<ON;k++)
- for (int j=0;j<HN;j++)
-
- V[k][j]+=alpha*d_err[k]*H[j];
- }
- gama[k]+=alpha*d_err[k];
- }
- return 1;
- }
-
-
-
-
- Delta_H_I(int m,FILE* fp)
- {
- for (int j=0;j<HN;j++)
- for (int i=0;i<IN;i++)
-
- W[j][i]+=beta*e_err[j]*P[i];
- }
- sita[j]+=beta*e_err[j];
- }
- return 1;
- }
-
-
-
-
- double Err_Sum()
- {
- double total_err=0;
- for (int m=0;m<N;m++)
- total_err+=err_m[m];
- }
- return 1;
- }
-
-
-
-
- main()
- {
- FILE *fp;
- double sum_err;
- int study;
-
- if ((fp=fopen("bp.txt","a+"))==NULL)
- {
- printf("不能创建bp.txt文件!\n");
- exit(1);
- }
- cout<<"请输入输出层到隐含层学习效率: alpha=\n";
- cin>>alpha;
-
- cout<<"请输入隐含层到输入层学习效率: beta=\n";
- cin>>beta;
-
- int study=0;
- double Pre_error ;
- cout<<"请输入预定误差: Pre_error= \n";
- cin>>Pre_error;
-
- int Pre_times;
- cout<<"请输入预定最大学习次数:Pre_times=\n";
- cin>>Pre_times;
-
- cout<<"请输入学习样本数据\n";
- {
- for (int m=0;m<N;m++)
- cout<<"请输入第"<<m+1<<"组学习样本"<<endl;
- for (int i=0;i<IN;i++)
- cin>>Study_Data[m]->input[i];
- }
- {
- for (int m=0;m<N;m++)
- cout<<"请输入第"<<m+1<<"组教师样本"<<endl;
- for (int k=0;k<ON;k++)
- cin>>Study_Data[m]->teach[k];
- }
-
- initial();
- do
- {
- ++study;
- for (int m=0;m<N;m++)
- {
- input_P(m);
- input_T(m);
- H_I_O();
- O_I_O();
- Err_O_H(m);
- Err_H_I();
- Delta_O_H(m,fp);
- Delta_H_I(m,fp);
- }
-
- sum_err=Err_Sum();
- {
- cout<<"第"<<study<<"次学习的均方误差为"<<sum_err<<endl;
- fprintf(fp,"第%d次学习的均方误差为:%f\n",study,sum_err);
- }
-
- while (sum_err > Pre_error)
- {
- cout<<"网络已经学习了"<<study<<"次,学习的均方误差为"<<sum_err<<endl;
- fprintf(fp,"网络已经学习了%d次,现在的全局误差为:%f\n",study,total_err);
- fclose(fp);
- }
- char s;
- cout<<"请随便输入一个字符,按回车退出程序!\n";
- cin>>s;
- return 1;
- }
- }
|