📄 c++的bp算法源程序【转载】.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0080)http://junan.home.sunbo.net/misc.php?xname=6EDQTV0&dname=DPJQ411&xpos=0&op=print -->
<HTML><HEAD><TITLE>C++的BP算法源程序【转载】</TITLE>
<STYLE type=text/css>BODY {
FONT-SIZE: 12px; LINE-HEIGHT: 140%; FONT-FAMILY: 宋体
}
TD {
FONT-SIZE: 12px; LINE-HEIGHT: 140%; FONT-FAMILY: 宋体
}
FONT {
FONT-SIZE: 12px; LINE-HEIGHT: 140%; FONT-FAMILY: 宋体
}
</STYLE>
<META http-equiv=content-type content="text/html; charset=gb2312">
<META content="MSHTML 6.00.2900.2722" name=GENERATOR></HEAD>
<BODY bgColor=#ffffff leftMargin=5 topMargin=5 onload=window.print()
marginwidth="5" marginheight="5">
<CENTER>
<TABLE cellSpacing=0 cellPadding=0 width=640 align=center border=0>
<TBODY>
<TR>
<TD colSpan=2><IMG height=36 alt=君安工作室
src="C++的BP算法源程序【转载】.files/1091238464.gif" border=0> </TD></TR>
<TR>
<TD>当前位置: <A
href="http://junan.home.sunbo.net/index.php?xname=6EDQTV0">首页</A> > <A
href="http://junan.home.sunbo.net/show_hdr.php?xname=6EDQTV0&dname=DPJQ411&xpos=0">C++的BP算法源程序【转载】</A>
> print </TD>
<TD vAlign=bottom align=right><A href="javascript:history.back()">返回</A>
<A href="javascript:window.print()">打印</A> </TD></TR>
<TR>
<TD colSpan=2>
<TABLE cellSpacing=0 cellPadding=3 width="100%" border=0>
<TBODY>
<TR align=left bgColor=#edf0f5>
<TD>
<TABLE cellSpacing=0 cellPadding=0 width="95%" border=0>
<TBODY>
<TR>
<TD align=middle><FONT
style="FONT-SIZE: 18px"><B>C++的BP算法源程序【转载】</B></FONT></TD></TR>
<TR>
<TD align=right>时间: 2005-04-01 21:46:29 | [<<] <A
title=下一篇
href="http://junan.home.sunbo.net/misc.php?xname=6EDQTV0&dname=DPJQ411&xpos=1">[>>]</A>
<HR align=center width="100%" noShade SIZE=1>
</TD></TR></TBODY></TABLE></TD></TR>
<TR align=left bgColor=#edf0f5>
<TD>
<DIV class=readf>//C++的BP算法源程序 <BR><BR>#include "iostream.h"
<BR>#include "iomanip.h" <BR>#define N 20 //学习样本个数 <BR>#define IN 1
//输入层神经元数目 <BR>#define HN 8 //隐层神经元数目 <BR>#define ON 1 //输出层神经元数目
<BR>double P[IN]; //单个样本输入数据 <BR>double T[ON]; //单个样本教师数据 <BR>double
W[HN][IN]; //输入层至隐层权值 <BR>double V[ON][HN]; //隐层至输出层权值
<BR><BR><BR>double X[HN]; //隐层的输入 <BR>double Y[ON]; //输出层的输入
<BR>double H[HN]; //隐层的输出 <BR>double O[ON]; //输出层的输出 <BR>double
sita[HN]; //隐层的阈值 <BR>double gama[ON]; //输出层的阈值 <BR>double err_m[N];
//第m个样本的总误差 <BR>double alpha; //输出层至隐层的学习效率 <BR>double beta;
//隐层至输入层学习效率 <BR>//定义一个放学习样本的结构 <BR>struct { <BR>double input[IN];
<BR>double teach[ON]; <BR>}Study_Data[N][IN];
<BR><BR>/////////////////////////// <BR>//初始化权、阈值子程序/////
<BR>/////////////////////////// <BR>initial() <BR>{ <BR>float sgn;
<BR>float rnd; <BR><BR><BR>int i,j; <BR>//隐层权、阈值初始化// <BR>{
<BR>//sgn=pow((-1),random(100)); <BR>sgn=rand();
<BR>rnd=sgn*(rand()%100); <BR>W[j]<I>= rnd/100;//隐层权值初始化。 <BR>}
<BR>//randomize(); <BR>{ <BR>//sgn=pow((-1),random(1000));
<BR>sgn=rand(); <BR>rnd=sgn*(rand()%1000); <BR>sita[j]=
rnd/1000;//中间层阈值初始化
<BR>cout<<"sita"<<sita[j]<<endl; <BR>}
<BR>//输出层权、阈值初始化// <BR>//randomize(); <BR>for (int k=0;k<ON;k++)
<BR>for (int j=0;j<HN;j++) <BR>{
<BR>//sgn=pow((-1),random(1000)); <BR><BR><BR>sgn=rand();
<BR>rnd=sgn*(rand()%1000); <BR>V[k][j]=rnd/1000;//第m个样本输出层权值初始化
<BR>} <BR>//randomize(); <BR>{ <BR>//sgn=pow((-1),random(10));
<BR>sgn=rand(); <BR>rnd=sgn*(rand()%10);
<BR>gama[k]=rnd/10;//输出层阈值初始化 <BR>cout<<"gama[k]"<<endl;
<BR>} <BR>return 1; <BR><BR>}//子程序initial()结束
<BR><BR><BR>//////////////////////////////// <BR>////第m个学习样本输入子程序///
<BR>/////////////////////////////// <BR>input_P(int m) <BR>{
<BR><BR><BR>for (int i=0;i<IN;i++)
<BR>P<I>=Study_Data[m]->input<I>; <BR>//获得第m个样本的数据
<BR>//cout<<"第"< //fprintf(fp,"第%d个样本的学习输入:
<BR>//P[%d]=%f\n",m,P<I>); <BR>return 1; <BR>}//子程序input_P(m)结束
<BR><BR>///////////////////////////// <BR>////第m个样本教师信号子程序//
<BR>///////////////////////////// <BR>input_T(int m) <BR>{ <BR>for
(int k=0;k<m;k++) <BR>T[k]=Study_Data[m]->teach[k];
<BR>//cout<<"第"<
//fprintf(fp,"第%d个样本的教师信号:T[%d]=%f\n",m,T[k]); <BR>return 1;
<BR>}//子程序input_T(m)结束 <BR><BR>/////////////////////////////////
<BR>//隐层各单元输入、输出值子程序/// <BR>/////////////////////////////////
<BR><BR><BR>H_I_O(){ <BR>double sigma; <BR>int i,j; <BR>for
(j=0;j<HN;j++) <BR>sigma=0.0; <BR>for (i=0;i<IN;i++)
<BR>sigma+=W[j]<I>*P<I>;//求隐层内积 <BR>} <BR>X[j]=sigma -
sita<I>;//求隐层净输入 <BR>H[j]=1.0/(1.0+exp(-X[j]));//求隐层输出 <BR>}
<BR>return 1; <BR>}//子程序H_I_O()结束
<BR><BR>/////////////////////////////////// <BR>//输出层各单元输入、输出值子程序///
<BR>/////////////////////////////////// <BR>O_I_O() <BR>{ <BR>double
sigma; <BR>for (int k=0;k<ON;k++) <BR>sigma=0.0; <BR><BR><BR>for
(int j=0;j<HN;j++) <BR>sigma+=V[k][j]*H[k];//求输出层内积 <BR>}
<BR>Y[k]=sigma-gama[k]; //求输出层净输入
<BR>O[k]=1.0/(1.0+exp(-Y[k]));//求输出层输出 <BR>} <BR>return 1;
<BR>}//子程序O_I_O()结束 <BR><BR>////////////////////////////////////
<BR>//输出层至隐层的一般化误差子程序//// <BR>////////////////////////////////////
<BR>double d_err[ON]; <BR>Err_O_H(int m) <BR>{ <BR>double
abs_err[ON];//每个样本的绝对误差都是从0开始的 <BR>double
sqr_err=0;//每个样本的平方误差计算都是从0开始的 <BR>//for (int
output=0;output<ON;output++) //output??? <BR>for (int
k=0;k<ON;k++) <BR>abs_err[k]=T[k]-O[k]; <BR>//求第m个样本下的第k个神经元的绝对误差
<BR>sqr_err+=(abs_err[k])*(abs_err[k]);//求第m个样本下输出层的平方误差
<BR><BR><BR><BR>d_err[k]=abs_err[k]*O[k]*(1.0-O[k]);//d_err[k]输出层各神经元的一般化误差
<BR>} <BR>err_m[m]=sqr_err/2;//第m个样本下输出层的平方误差/2=第m个样本的均方误差
<BR>return 1; <BR>}//子程序Err_O_H(m)结束
<BR><BR>////////////////////////////////////
<BR>//隐层至输入层的一般化误差子程序//// <BR>////////////////////////////////////
<BR>double e_err[HN]; <BR>Err_H_I(){ <BR>double sigma; <BR>//for
(int hidden=0;hidden <BR>for (int j=0;j<HN;j++) <BR>sigma=0.0;
<BR> for (int k=0;k<ON;k++)
<BR> sigma=d_err[k]*V[k][j]; <BR>}
<BR>e_err[j]=sigma*H[j]*(1-H[j]);//隐层各神经元的一般化误差 <BR>} <BR>return 1;
<BR><BR><BR>}//子程序Err_H_I()结束
<BR><BR>////////////////////////////////////////////////////////
<BR>//输出层至隐层的权值调整、输出层阈值调整计算子程序//////
<BR>////////////////////////////////////////////////////////
<BR>Delta_O_H(int m,FILE* fp) <BR>{ <BR>for (int k=0;k<ON;k++)
<BR>for (int j=0;j<HN;j++) <BR>//cout<<"第"<
fprintf(fp,"第%d个样本时的输出层至隐层的权值为:%f\n",m,W[k][j <BR>]);
<BR>V[k][j]+=alpha*d_err[k]*H[j];//输出层至隐层的权值调整 <BR>}
<BR>gama[k]+=alpha*d_err[k];//输出层至隐层的阈值调整 <BR>} <BR>return 1;
<BR>}//子程序Delta_O_H()结束 <BR><BR>//////////////////
///////////////////////////////////
<BR>//隐层至输入层的权值调整、隐层阈值调整计算子程序/////
<BR>/////////////////////////////////////////////////////
<BR>Delta_H_I(int m,FILE* fp) <BR><BR><BR>{ <BR>for (int
j=0;j<HN;j++) <BR>for (int i=0;i<IN;i++)
<BR>//cout<<"第"<
fprintf(fp,"第%d个样本时的输出层至隐层的权值为:%f\n",m,V[j]<I><BR>);
<BR>W[j]<I>+=beta*e_err[j]*P<I>;//隐层至输入层的权值调整 <BR>}
<BR>sita[j]+=beta*e_err[j]; <BR>} <BR>return 1;
<BR>}//子程序Delta_H_I()结束 <BR><BR>/////////////////////////////////
<BR>//N个样本的全局误差计算子程序//// <BR>/////////////////////////////////
<BR>double Err_Sum() <BR>{ <BR>double total_err=0; <BR>for (int
m=0;m<N;m++) <BR>total_err+=err_m[m];//每个样本的均方误差加起来就成了全局误差 <BR>}
<BR>return 1; <BR><BR><BR>}//子程序Err_sum()结束
<BR><BR>/**********************/ <BR>/**程序入口,即主程序**/
<BR>/**********************/ <BR>main() <BR>{ <BR>FILE *fp;
<BR>double sum_err; <BR>int study;//训练次数 <BR><BR>if
((fp=fopen("bp.txt","a+"))==NULL) <BR>{
<BR>printf("不能创建bp.txt文件!\n"); <BR>exit(1); <BR>}
<BR>cout<<"请输入输出层到隐含层学习效率: alpha=\n"; <BR>cin>>alpha;
<BR><BR>cout<<"请输入隐含层到输入层学习效率: beta=\n"; <BR>cin>>beta;
<BR><BR><BR><BR>int study=0; //学习次数 <BR>double Pre_error ; //预定误差
<BR>cout<<"请输入预定误差: Pre_error= \n"; <BR>cin>>Pre_error;
<BR><BR>int Pre_times; <BR>cout<<"请输入预定最大学习次数:Pre_times=\n";
<BR>cin>>Pre_times; <BR><BR>cout<<"请输入学习样本数据\n"; <BR>{
<BR>for (int m=0;m<N;m++)
<BR>cout<<"请输入第"<<m+1<<"组学习样本"<<endl;
<BR>for (int i=0;i<IN;i++)
<BR> cin>>Study_Data[m]->input<I>; <BR>} <BR>{ <BR>for
(int m=0;m<N;m++)
<BR>cout<<"请输入第"<<m+1<<"组教师样本"<<endl;
<BR>for (int k=0;k<ON;k++)
<BR>cin>>Study_Data[m]->teach[k]; <BR>}
<BR><BR><BR><BR>initial(); //隐层、输出层权、阈值初始化 (1) <BR>do <BR>{
<BR>++study; ///??? <BR>for (int m=0;m<N;m++) <BR>{
<BR>input_P(m); //输入第m个学习样本 (2) <BR>input_T(m);//输入第m个样本的教师信号 (3)
<BR>H_I_O(); //第m个学习样本隐层各单元输入、输出值 (4) <BR>O_I_O();
//第m个学习样本输出层各单元输入、输出值 (5) <BR>Err_O_H(m); //第m个学习样本输出层至隐层一般化误差 (6)
<BR>Err_H_I(); //第m个学习样本隐层至输入层一般化误差 (7) <BR>Delta_O_H(m,fp);
//第m个学习样本输出层至隐层权阈值调整、修改 (8) <BR>Delta_H_I(m,fp);
//第m个学习样本隐层至输入层权阈值调整、修改 (9) <BR>} //全部样本训练完毕
<BR><BR>sum_err=Err_Sum(); //全部样本全局误差计算 (10) <BR>{
<BR>cout<<"第"<<study<<"次学习的均方误差为"<<sum_err<<endl;
<BR>fprintf(fp,"第%d次学习的均方误差为:%f\n",study,sum_err); <BR>}
<BR><BR><BR>while (sum_err > Pre_error)
//or(study <BR>{ //N个样本全局误差小于预定误差否? 小于则退出 (11)
<BR>cout<<"网络已经学习了"<<study<<"次,学习的均方误差为"<<sum_err<<endl;
<BR>fprintf(fp,"网络已经学习了%d次,现在的全局误差为:%f\n",study,total_err);
<BR>fclose(fp); <BR>} <BR>char s;
<BR>cout<<"请随便输入一个字符,按回车退出程序!\n"; <BR>cin>>s; <BR>return
1; <BR>} </I></I></I></I></I></I></I></I></I></I></I></DIV></TD></TR>
<TR align=left bgColor=#edf0f5>
<TD>
<HR
style="BORDER-RIGHT: dotted; BORDER-TOP: dotted; BORDER-LEFT: dotted; COLOR: #a0a0a0; BORDER-BOTTOM: dotted"
noShade SIZE=1>
</TD></TR>
<TR align=right bgColor=#edf0f5>
<TD><FONT color=#a0a0a0><A
href="http://junan.home.sunbo.net/misc.php?xname=6EDQTV0&dname=DPJQ411&xpos=0&op=comment&gallery=">评论(0)</A>
| <A
href="http://junan.home.sunbo.net/misc.php?xname=6EDQTV0&dname=DPJQ411&xpos=0&op=recommend">推荐</A>
| <A
href="http://junan.home.sunbo.net/misc.php?xname=6EDQTV0&dname=DPJQ411&xpos=0&op=print">打印</A>
| <A href="javascript:window.close()">关闭</A></FONT>
</TD></TR></TBODY></TABLE>
<TABLE cellSpacing=1 cellPadding=4 width="100%" bgColor=#a0a0a0
border=0><TBODY>
<TR align=left bgColor=#edf0f5>
<TD>目前尚未有任何评论!! </TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD
colSpan=2>http://junan.home.sunbo.net/show_hdr.php?xname=6EDQTV0&dname=DPJQ411&xpos=0
(2006-03-08 10:09:14) </TD></TR></TBODY></TABLE></CENTER></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -