double sqr_err0//每个样本的平方误差计算都是从0开始的 //for int output0output for int k0k abs_errkTk-Ok //求第m个样本下的第k个神经元的绝对误差 sqr_errabs_errkabs_errk//求第m个样本下输出层的平方误差 d_errkabs_errkOk1.0-Ok//d_errk输出层各神经元的一般化误差 err_mmsqr_err/2//第m个样本下输出层的平方误差/2第m个样本的均方误差 return 1 //子程序Err_O_Hm结束 //////////////////////////////////// //隐层至输入层的一般化误差子程序//// //////////////////////////////////// double e_errHN Err_H_I double sigma //for int hidden0hidden for int j0j sigma0.0 for int k0k sigmad_errkVkj e_errjsigmaHj1-Hj//隐层各神经元的一般化误差 return 1 //子程序Err_H_I结束 //////////////////////////////////////////////////////// //输出层至隐层的权值调整、输出层阈值调整计算子程序////// //////////////////////////////////////////////////////// Delta_O_Hint mFILE fp for int k0k for int j0j //coutltltquot第quotlt fprintffpquot第d个样本时的输出层至隐层的权值为f quotmWkj Vkjalphad_errkHj//输出层至隐层的权值调整 gamakalphad_errk//输出层至隐层的阈值调整 return 1 //子程序Delta_O_H结束 ///////////////////////////////////////////////////// //隐层至输入层的权值调整、隐层阈值调整计算子程序///// ///////////////////////////////////////////////////// Delta_H_Iint mFILE fp for int j0j for int i0i //coutltltquot第quotlt fprintffpquot第d个样本时的输出层至隐层的权值为f quotmVj Wjbetae_errjP//隐层至输入层的权值调整 sitajbetae_errj return 1 //子程序Delta_H_I结束 ///////////////////////////////// //N个样本的全局误差计算子程序//// ///////////////////////////////// double Err_Sum double total_err0 for int m0m total_errerr_mm//每个样本的均方误差加起来就成了全局误差 return 1 //子程序Err_sum结束 // /程序入口即主程序/ // main FILE fp double sum_err int study//训练次数 if fpfopenquotbp.txtquotquotaquotNULL printfquot不能创建bp.txt文件 quot exit1 coutltltquot请输入输出层到隐含层学习效率: alpha quot cingtgtalpha coutltltquot请输入隐含层到输入层学习效率: beta quot cingtgtbeta int study0 //学习次数 double Pre_error //预定误差 coutltltquot请输入预定误差: Pre_error quot cingtgtPre_error int Pre_times coutltltquot请输入预定最大学习次数:Pre_times quot cingtgtPre_times coutltltquot请输入学习样本数据 quot for int m0m coutltltquot请输入第quotlt for int i0i cingtgtStudy_Datam-gtinput for int m0m coutltltquot请输入第quotlt for int k0k cingtgtStudy_Datam-gtteachk initial //隐层、输出层权、阈值初始化 1 do study /// for int m0m input_Pm //输入第m个学习样本 2 input_Tm//输入第m个样本的教师信号 3 H_I_O //第m个学习样本隐层各单元输入、输出值 4 O_I_O //第m个学习样本输出层各单元输入、输出值 5 Err_O_Hm //第m个学习样本输出层至隐层一般化误差 6 Err_H_I //第m个学习样本隐层至输入层一般化误差 7 Delta_O_Hmfp //第m个学习样本输出层至隐层权阈值调整、修改 8 Delta_H_Imfp //第m个学习样本隐层至输入层权阈值调整、修改 9 //全部样本训练完毕 sum_errErr_Sum //全部样本全局误差计算 10 coutltltquot第quotltfprintffpquot第d次学习的均方误差为f quotstudysum_err while sum_err gt Pre_error //orstudy //N个样本全局误差小于预定误差否 小于则退出 11 coutltltquot网络已经学习了quotltfprintffpquot网络已经学习了d次现在的全局误差为f quotstudytotal_err fclosefp char s coutltltquot请随便输入一个字符按回车退出程序 quot cingtgts return 1 -------------------------------------------------------------------------------- BP算法源代码2-1 include quotBpNet.hquot ifdef _DEBUG define new DEBUG_NEW undef THIS_FILE static char THIS_FILE __FILE__ endif ///////////////////////////////////////////////////////////////////////////// // CBpNet IMPLEMENT_SERIAL CBpNet CObject 1 CBpNet::CBpNet initMMATCOM_VERSION//启用矩阵运算库 CBpNet::CBpNet exitM delete this ///////////////////////////////////////////////////////////////////////////// // CBpNet message handlers //创建新网络 void CBpNet::CreateMm mInputData Mm mTarget int iInput int iHidden int iOutput int ij mSampleInputzerosmInput.rowsmInput.cols mSampleTargetzerosmTarget.rowsmTarget.cols mSampleInputmInputData mSampleTargetmTarget this-gtiInputiInput this-gtiHiddeniHidden this-gtiOutputiOutput //创建计算用的单个样本矩阵 mInputzeros1this-gtiInput mHiddenzeros1this-gtiHidden mOutputzeros1this-gtiOutput //创建权重矩阵并赋初值 mWeightizerosthis-gtiInputthis-gtiHidden mWeightozerosthis-gtiHiddenthis-gtiOutput //赋初值 fori1iltthis-gtiInputi forj1jltthis-gtiHiddenj mWeighti.rijrandab-1.01.0 fori1iltthis-gtiHiddeni forj1jltthis-gtiOutputj mWeighto.rijrandab-1.01.0 //创建阙值矩阵并赋值 mThresholdizeros1this-gtiHidden fori1iltthis-gtiHiddeni mThresholdi.rirandab-1.01.0 mThresholdozeros1this-gtiOutput fori1iltthis-gtiOutputi mThresholdo.rirandab-1.01.0 //创建权重变化矩阵 mChangeizerosthis-gtiInputthis-gtiHidden mChangeozerosthis-gtiHiddenthis-gtiOutput mInputNormFactorzerosiInput2 mTargetNormFactorzerosiOutput2 //误差矩阵 mOutputDeltaszerosiOutput mHiddenDeltaszerosiHidden //学习速率赋值 dblLearnRate10.5 dblLearnRate20.5 dblMomentumFactor0.95 m_isOKfalse m_IsStopfalse dblMse1.0e-6//误差限 dblError1.0 lEpochs0 //根据已有的网络进行预测 Mm CBpNet::simulateMm mData int ij Mm mResult Mm datazerosmData.rowsmData.cols datamData ifmData.colsiInput ::MessageBoxNULLquot输入数据变量个数错误quotquot输入数据变量个数错误quotMB_OK return mResult mResultzerosdata.rowsiOutput //正规化数据 fori1iltdata.rowsi forj1jltdata.colsj data.rijdata.rij-mInputNormFactor.rj1/mInputNormFactor.rj2-mInputNormFactor.rj1 //计算 int iSample Mm mInputdatamHiddendatamOutputdata mInputdatazeros1iInput mHiddendatazeros1iHidden mOutputdatazeros1iOutput double sum0.0 foriSample1iSampleltdata.rowsiSample //输入层数据 fori1iltiInputi mInputdata.ridata.riSamplei //隐层数据 forj1jltiHiddenj sum0.0 fori1iltiInputi summInputdata.rimWeighti.rij sum-mThresholdi.rj mHiddendata.rj1.0/1.0exp-sum //输出数据 forj1jltiOutputj sum0.0 fori1iltiHiddeni summHiddendata.rimWeighto.rij sum-mThresholdo.rj mOutputdata.rj1.0/1.0exp-sum //转换 forj1jltiOutputj mResult.riSamplejmOutputdata.rjmTargetNormFactor.rj2-mTa
上一篇:
Telnet服务器VC2010代码
下一篇:
让我掉下眼泪的