ebookSharing 发表于 2008-9-15 19:34

【源代码】C++的BP算法源程序神经网络

#include "iostream.h"
                  #include "iomanip.h"
                  #define N 20 //学习样本个数
                  #define IN 1 //输入层神经元数目
                  #define HN 8 //隐层神经元数目
                  #define ON 1 //输出层神经元数目
                  double P; //单个样本输入数据
                  double T; //单个样本教师数据
                  double W; //输入层至隐层权值
                  double V; //隐层至输出层权值
                  double X; //隐层的输入
                  double Y; //输出层的输入
                  double H; //隐层的输出
                  double O; //输出层的输出
                  double sita; //隐层的阈值
                  double gama; //输出层的阈值
                  double err_m; //第m个样本的总误差
                  double alpha; //输出层至隐层的学习效率
                  double beta; //隐层至输入层学习效率
                  //定义一个放学习样本的结构
                  struct {
                  double input;
                  double teach;
                  }Study_Data;
                  
                  ///////////////////////////
                  //初始化权、阈值子程序/////
                  ///////////////////////////
                  initial()
                  {
                  float sgn;
                  float rnd;
                  int i,j;
                  //隐层权、阈值初始化//
                    {
                    //sgn=pow((-1),random(100));
                    sgn=rand();
                    rnd=sgn*(rand()%100);
                    W= rnd/100;//隐层权值初始化。
                    }
                  //randomize();
                    {
                  //sgn=pow((-1),random(1000));
                    sgn=rand();
                    rnd=sgn*(rand()%1000);
                    sita= rnd/1000;//中间层阈值初始化
                    cout<<"sita"<<sita<<endl;
                    }
                  //输出层权、阈值初始化//
                  //randomize();
                  for (int k=0;k<ON;k++)
                   for (int j=0;j<HN;j++)
                   {
                   //sgn=pow((-1),random(1000));
                     sgn=rand();
                     rnd=sgn*(rand()%1000);
                     V=rnd/1000;//第m个样本输出层权值初始化
                   }
                  //randomize();
                    {
                    //sgn=pow((-1),random(10));
                    sgn=rand();
                    rnd=sgn*(rand()%10);
                    gama=rnd/10;//输出层阈值初始化
                    cout<<"gama"<<endl;
                    }
                    return 1;
                  
                  }//子程序initial()结束

                  ////////////////////////////////
                  ////第m个学习样本输入子程序///
                  ///////////////////////////////
                  input_P(int m)
                  {
                  for (int i=0;i<IN;i++)
                   P=Study_Data->input;
                  //获得第m个样本的数据
                  //cout<<"第"< //fprintf(fp,"第%d个样本的学习输入:
                  //P[%d]=%f\n",m,P);
                  return 1;
                  }//子程序input_P(m)结束
                  /////////////////////////////
                  ////第m个样本教师信号子程序//
                  /////////////////////////////
                  input_T(int m)
                  {
                  for (int k=0;k<m;k++)
                   T=Study_Data->teach;
                  //cout<<"第"< //
                 fprintf(fp,"第%d个样本的教师信号:T[%d]=%f\n",m,T);
                  return 1;
                  }//子程序input_T(m)结束
                  /////////////////////////////////
                  //隐层各单元输入、输出值子程序///
                  /////////////////////////////////
                  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*P;//求隐层内积
                  }
                  X=sigma - sita;//求隐层净输入
                  H=1.0/(1.0+exp(-X));//求隐层输出
                  }
                  return 1;
                  }//子程序H_I_O()结束
                  ///////////////////////////////////
                  //输出层各单元输入、输出值子程序///
                  ///////////////////////////////////
                  O_I_O()
                  {
                  double sigma;
                  for (int k=0;k<ON;k++)
                   sigma=0.0;
                  for (int j=0;j<HN;j++)
                   sigma+=V*H;//求输出层内积
                  }
                  Y=sigma-gama; //求输出层净输入
                  O=1.0/(1.0+exp(-Y));//求输出层输出
                  }
                  return 1;
                  }//子程序O_I_O()结束
                  ////////////////////////////////////
                  //输出层至隐层的一般化误差子程序////
                  ////////////////////////////////////
                  double d_err;
                  Err_O_H(int m)
                  {
                  double abs_err;//每个样本的绝对误差都是从0开始的
                  double sqr_err=0;//每个样本的平方误差计算都是从0开始的
                  //for (int output=0;output<ON;output++)  //output???
                    for (int k=0;k<ON;k++)
                    abs_err=T-O;
                  //求第m个样本下的第k个神经元的绝对误差
                  sqr_err+=(abs_err)*(abs_err);
                 //求第m个样本下输出层的平方误差
                  d_err=abs_err*O*(1.0-O);
                 //d_err输出层各神经元的一般化误差
                  }
                  err_m=sqr_err/2;
                //第m个样本下输出层的平方误差/2=第m个样本的均方误差
                  return 1;
                  }//子程序Err_O_H(m)结束
                  ////////////////////////////////////
                  //隐层至输入层的一般化误差子程序////
                  ////////////////////////////////////
                  double e_err;
                  Err_H_I(){
                  double sigma;
                  //for (int hidden=0;hidden
                    for (int j=0;j<HN;j++)
                    sigma=0.0;
                       for (int k=0;k<ON;k++)
                        sigma=d_err*V;
                  }
                  e_err=sigma*H*(1-H);//隐层各神经元的一般化误差
                  }
                  return 1;
                  }//子程序Err_H_I()结束
                  ////////////////////////////////////////////////////////
                  //输出层至隐层的权值调整、输出层阈值调整计算子程序//////
                  ////////////////////////////////////////////////////////
                  Delta_O_H(int m,FILE* fp)
                  {
                  for (int k=0;k<ON;k++)
                   for (int j=0;j<HN;j++)
                    //cout<<"第"<
               fprintf(fp,"第%d个样本时的输出层至隐层的权值为:%f\n",m,W);
                    V+=alpha*d_err*H;//输出层至隐层的权值调整
                  }
                  gama+=alpha*d_err;//输出层至隐层的阈值调整
                  }
                  return 1;
                  }//子程序Delta_O_H()结束
                  /////////////////////////////////////////////////////
                  //隐层至输入层的权值调整、隐层阈值调整计算子程序/////
                  /////////////////////////////////////////////////////
                  Delta_H_I(int m,FILE* fp)
                  {
                  for (int j=0;j<HN;j++)
                    for (int i=0;i<IN;i++)
//cout<<"第"< fprintf(fp,"第%d个样本时的输出层至隐层的权值为:%f\n",m,V);
                  W+=beta*e_err*P;//隐层至输入层的权值调整
                  }
                  sita+=beta*e_err;
                  }
                  return 1;
                  }//子程序Delta_H_I()结束
                  /////////////////////////////////
                  //N个样本的全局误差计算子程序////
                  /////////////////////////////////
                  double Err_Sum()
                  {
                  double total_err=0;
                  for (int m=0;m<N;m++)
                    total_err+=err_m;//每个样本的均方误差加起来就成了全局误差
                  }
                  return 1;
                  }//子程序Err_sum()结束
                  /**********************/
                  /**程序入口,即主程序**/
                  /**********************/
                  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->input;
                  }
                  {  
                  for (int m=0;m<N;m++)
                   cout<<"请输入第"<<m+1<<"组教师样本"<<endl;
                    for (int k=0;k<ON;k++)
                   cin>>Study_Data->teach;
                  }
                  initial(); //隐层、输出层权、阈值初始化 (1)
                  do
                  {
                  ++study; ///???
                  for (int m=0;m<N;m++)
                  {
                  input_P(m); //输入第m个学习样本 (2)
                  input_T(m);//输入第m个样本的教师信号 (3)
                  H_I_O(); //第m个学习样本隐层各单元输入、输出值 (4)
                  O_I_O(); //第m个学习样本输出层各单元输入、输出值 (5)
                  Err_O_H(m); //第m个学习样本输出层至隐层一般化误差 (6)
                  Err_H_I(); //第m个学习样本隐层至输入层一般化误差 (7)
                Delta_O_H(m,fp); //第m个学习样本输出层至隐层权阈值调整、修改 (8)
                Delta_H_I(m,fp); //第m个学习样本隐层至输入层权阈值调整、修改 (9)
                  } //全部样本训练完毕
                  sum_err=Err_Sum(); //全部样本全局误差计算 (10)
                  {
                  cout<<"第"<<study<<"次学习的均方误差为"<<sum_err<<endl;
                  fprintf(fp,"第%d次学习的均方误差为:%f\n",study,sum_err);
                  }
                  while (sum_err > Pre_error)    //or(study
                  { //N个样本全局误差小于预定误差否? 小于则退出 (11)
            cout<<"网络已经学习了"<<study<<"次,学习的均方误差为"<<sum_err<<endl;
       fprintf(fp,"网络已经学习了%d次,现在的全局误差为:%f\n",study,total_err);
                  fclose(fp);
                  }
                  char s;
                  cout<<"请随便输入一个字符,按回车退出程序!\n";
                  cin>>s;
                  return 1;
                  }
                  

lijingjjjj1984 发表于 2008-12-27 15:24

好东西,帮忙顶一个。

庄严肃穆 发表于 2009-1-5 15:20

看不懂啊。。。。。。

qszhu2006 发表于 2009-2-9 22:09

顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶

lele8585 发表于 2009-4-18 10:36

我来看看,谢谢啦

lycnet 发表于 2009-5-6 13:14

ding .......

aimaer_21 发表于 2009-5-17 20:58

我来看看,谢谢

lyaya2004 发表于 2009-6-3 21:12

很有用,谢谢!

traveler 发表于 2009-6-16 14:34

感谢楼主无私分享!

liuyingjie 发表于 2009-7-9 15:25

真强啊大哥好佩服你啊
页: [1] 2 3
查看完整版本: 【源代码】C++的BP算法源程序神经网络