devil1980 发表于 2006-3-28 17:28

改写的C++BP类 未测试

<p>// BpNetWork.cpp: implementation of the CBpNetWork class.<br/>//<br/>//////////////////////////////////////////////////////////////////////</p><p>//////////////////////////////////////////////////////////////////////<br/>// Construction/Destruction<br/>//////////////////////////////////////////////////////////////////////<br/>#include "stdafx.h"<br/>#include "BpNetWork.h"<br/>#include "iostream.h"</p><p>CBpNetWork::CBpNetWork()<br/>{<br/>&nbsp;m_npBeta = new double;//&Ograve;&thorn;&sup2;&atilde;&Ouml;&Aacute;&Ecirc;&auml;&Egrave;&euml;&sup2;&atilde;&Ntilde;§&Iuml;°&ETH;§&Acirc;&Ecirc;<br/>&nbsp;*m_npBeta = 0.2;<br/>&nbsp;m_npAlpha = new double;//&Ecirc;&auml;&sup3;&ouml;&sup2;&atilde;&Ouml;&Aacute;&Ograve;&thorn;&sup2;&atilde;&micro;&Auml;&Ntilde;§&Iuml;°&ETH;§&Acirc;&Ecirc;<br/>&nbsp;*m_npAlpha = 0.2;<br/>&nbsp;m_npTotalErrofM = NULL;//&micro;&Uacute;m&cedil;&ouml;&Ntilde;ù±&frac34;&micro;&Auml;×&Uuml;&Icirc;ó&sup2;&icirc;<br/>&nbsp;m_npOutputLayerThreshold = NULL;//&Ecirc;&auml;&sup3;&ouml;&sup2;&atilde;&micro;&Auml;&atilde;&ETH;&Ouml;&micro;<br/>&nbsp;m_npHideLayerThreshold = NULL;//&Ograve;&thorn;&sup2;&atilde;&micro;&Auml;&atilde;&ETH;&Ouml;&micro;<br/>&nbsp;m_npOutputLayerOutputValue = NULL;//&Ecirc;&auml;&sup3;&ouml;&sup2;&atilde;&micro;&Auml;&Ecirc;&auml;&sup3;&ouml;<br/>&nbsp;m_npHideOutputValue = NULL;//&Ograve;&thorn;&sup2;&atilde;&micro;&Auml;&Ecirc;&auml;&sup3;&ouml;<br/>&nbsp;m_npOutputLayerInputValue = NULL;//&Ecirc;&auml;&sup3;&ouml;&sup2;&atilde;&micro;&Auml;&Ecirc;&auml;&Egrave;&euml;<br/>&nbsp;m_npHideInputValue;//&Ograve;&thorn;&sup2;&atilde;&micro;&Auml;&Ecirc;&auml;&Egrave;&euml;<br/>&nbsp;m_npHideToOutputWeightMatrix = NULL;//&Ograve;&thorn;&sup2;&atilde;&Ouml;&Aacute;&Ecirc;&auml;&sup3;&ouml;&sup2;&atilde;&Egrave;¨&Ouml;&micro;<br/>&nbsp;m_npInputToHideWeightMatrix = NULL;//&Ecirc;&auml;&Egrave;&euml;&sup2;&atilde;&Ouml;&Aacute;&Ograve;&thorn;&sup2;&atilde;&Egrave;¨&Ouml;&micro;<br/>&nbsp;m_fpSingleTrainingSample = NULL;//&micro;&yen;&cedil;&ouml;&Ntilde;ù±&frac34;&frac12;&Igrave;&Ecirc;&brvbar;&Ecirc;&yacute;&frac34;&Yacute;<br/>&nbsp;m_fpSingleInputSample = NULL;//&micro;&yen;&cedil;&ouml;&Ntilde;ù±&frac34;&Ecirc;&auml;&Egrave;&euml;&Ecirc;&yacute;&frac34;&Yacute;<br/>&nbsp;m_fpE_Err = NULL;<br/>&nbsp;m_fpD_Err = NULL;<br/>&nbsp;m_fpInput = NULL;<br/>&nbsp;m_fpTeach = NULL;<br/>&nbsp;m_spStudy_Data = NULL;<br/>&nbsp;m_fpAbsErrValBefore =NULL;<br/>&nbsp;m_nLearningSampleNumber = 0;//&Ntilde;§&Iuml;°&Ntilde;ù±&frac34;&cedil;&ouml;&Ecirc;&yacute;<br/>&nbsp;m_nOutputNetNumber = 0;//&Ecirc;&auml;&Egrave;&euml;&sup2;&atilde;&Eacute;&ntilde;&frac34;&shy;&Ocirc;&ordf;&Ecirc;&yacute;&Auml;&iquest;<br/>&nbsp;m_nHideNetNumber = 0;//&Ograve;&thorn;&sup2;&atilde;&Eacute;&ntilde;&frac34;&shy;&Ocirc;&ordf;&Ecirc;&yacute;&Auml;&iquest;<br/>&nbsp;m_nInputNetNumber = 0;//&Ecirc;&auml;&sup3;&ouml;&sup2;&atilde;&Eacute;&ntilde;&frac34;&shy;&Ocirc;&ordf;&Ecirc;&yacute;&Auml;&iquest;<br/>&nbsp;Init();<br/>}</p><p>CBpNetWork::~CBpNetWork()<br/>{<br/>&nbsp;if(!m_npBeta)&nbsp;delete m_npBeta,m_npBeta = NULL;<br/>&nbsp;if(!m_npAlpha)&nbsp;delete m_npAlpha,m_npAlpha = NULL;<br/>&nbsp;if(!m_npTotalErrofM) delete m_npTotalErrofM, m_npTotalErrofM = NULL;<br/>&nbsp;if(!m_npOutputLayerThreshold) delete []m_npOutputLayerThreshold, m_npOutputLayerThreshold= NULL;<br/>&nbsp;if(!m_npHideLayerThreshold) delete[]m_npHideLayerThreshold, m_npHideLayerThreshold =NULL;<br/>&nbsp;if(!m_npOutputLayerOutputValue) delete[]m_npOutputLayerOutputValue,m_npOutputLayerOutputValue = NULL;<br/>&nbsp;if(!m_npHideOutputValue) delete []m_npHideOutputValue,m_npHideOutputValue=NULL;<br/>&nbsp;if(!m_npOutputLayerInputValue) delete []m_npOutputLayerInputValue,m_npOutputLayerInputValue= NULL;<br/>&nbsp;if(!m_npHideInputValue) delete []m_npHideInputValue, m_npHideInputValue = NULL;<br/>&nbsp;if(!m_npHideToOutputWeightMatrix) delete []m_npHideToOutputWeightMatrix, m_npHideToOutputWeightMatrix = NULL;<br/>&nbsp;if(!m_npInputToHideWeightMatrix) delete []m_npInputToHideWeightMatrix,m_npInputToHideWeightMatrix = NULL;<br/>&nbsp;if(!m_fpSingleTrainingSample) delete []m_fpSingleTrainingSample,m_fpSingleTrainingSample = NULL;<br/>&nbsp;if(!m_fpSingleInputSample) delete []m_fpSingleInputSample, m_fpSingleInputSample =NULL;<br/>&nbsp;if(!m_fpE_Err) delete []m_fpE_Err, m_fpE_Err =NULL;<br/>&nbsp;if(!m_fpD_Err) delete []m_fpD_Err, m_fpD_Err = NULL;<br/>&nbsp;if(!m_fpAbsErrValBefore) delete []m_fpAbsErrValBefore, m_fpAbsErrValBefore= NULL;<br/>&nbsp;Study_Data_T *p = m_spStudy_Data;<br/>for(int i = 0;i&lt; m_nLearningSampleNumber;i++)<br/>&nbsp;&nbsp;for(int j = 0; j&lt; m_nInputNetNumber; j++)<br/>&nbsp;{<br/>&nbsp;<br/>&nbsp;m_fpInput = m_spStudy_Data-&gt;input;<br/>&nbsp;m_fpTeach = m_spStudy_Data-&gt;teach;<br/>&nbsp;if(!m_fpInput) delete []m_fpInput, m_fpInput = NULL;<br/>&nbsp;if(!m_fpTeach) delete []m_fpTeach, m_fpTeach = NULL;<br/>&nbsp;m_spStudy_Data++;<br/>&nbsp;}<br/>&nbsp;delete []p;<br/>}</p><p><br/>CBpNetWork::CBpNetWork(int LearningSplNum, int OutLayNumber, int HideLayNumber, int inLayNum)<br/>{<br/>&nbsp;m_nLearningSampleNumber = LearningSplNum;<br/>&nbsp;m_nOutputNetNumber = OutLayNumber;<br/>&nbsp;m_nHideNetNumber = HideLayNumber;<br/>&nbsp;m_nInputNetNumber = inLayNum;<br/>&nbsp;Init();<br/>}<br/>//initial weight and threshold<br/>bool CBpNetWork::Init()<br/>{<br/>&nbsp;if(!m_nLearningSampleNumber||!m_nOutputNetNumber||!m_nHideNetNumber||!m_nInputNetNumber)<br/>&nbsp;&nbsp;return false;<br/>&nbsp;float sgn;<br/>&nbsp;float rnd;<br/>&nbsp;int i,j;<br/>&nbsp;m_npInputToHideWeightMatrix = new double ;<br/>&nbsp;m_npHideLayerThreshold = new double;<br/>&nbsp;m_npHideToOutputWeightMatrix = new double;<br/>&nbsp;m_fpSingleInputSample = new double;<br/>&nbsp;m_fpSingleTrainingSample = new double ;<br/>&nbsp;m_npHideInputValue = new double;<br/>&nbsp;m_npOutputLayerOutputValue = new double;<br/>&nbsp;m_npOutputLayerInputValue = new double;<br/>&nbsp;m_npHideLayerThreshold = new double;<br/>&nbsp;m_npOutputLayerThreshold = new double ;<br/>&nbsp;m_npTotalErrofM = new double;<br/>&nbsp;m_fpE_Err = new double;<br/>&nbsp;m_fpD_Err = new double;<br/>&nbsp;m_fpAbsErrValBefore = new double;</p><p>&nbsp;m_spStudy_Data = (Study_Data_T *)new double;<br/>&nbsp;for( i = 0;i&lt; m_nLearningSampleNumber;i++)<br/>&nbsp;&nbsp;for( j = 0; j&lt; m_nInputNetNumber; j++)<br/>&nbsp;&nbsp;{<br/>&nbsp;&nbsp;m_fpInput = new double;<br/>&nbsp;&nbsp;m_fpTeach = new double;<br/>&nbsp;&nbsp;m_spStudy_Data-&gt;input = m_fpInput;<br/>&nbsp;&nbsp;m_spStudy_Data-&gt;teach =m_fpTeach;<br/>&nbsp;&nbsp;m_spStudy_Data++;<br/>&nbsp;&nbsp;}<br/>//&Ograve;&thorn;&sup2;&atilde;&Egrave;¨&iexcl;&cent;&atilde;&ETH;&Ouml;&micro;&sup3;&otilde;&Ecirc;&frac14;&raquo;&macr;//<br/>&nbsp;for(j=0;j&lt;m_nHideNetNumber;j++)<br/>&nbsp;&nbsp;for(i=0;i&lt;m_nInputNetNumber;i++)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //sgn=pow((-1),random(100));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sgn=(float)rand()/RAND_MAX ;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rnd=sgn*(rand()%10);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_npInputToHideWeightMatrix= rnd/100;//&Ograve;&thorn;&sup2;&atilde;&Egrave;¨&Ouml;&micro;&sup3;&otilde;&Ecirc;&frac14;&raquo;&macr;&iexcl;&pound;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>//randomize();<br/>&nbsp;for(j=0;j&lt;m_nHideNetNumber;j++)<br/>&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp; //sgn=pow((-1),random(1000));<br/>&nbsp;&nbsp;&nbsp;&nbsp; sgn=(float)rand()/RAND_MAX ;<br/>&nbsp;rnd=sgn*(rand()%10);<br/>&nbsp;m_npHideLayerThreshold= rnd/1000;//&Ouml;&ETH;&frac14;&auml;&sup2;&atilde;&atilde;&ETH;&Ouml;&micro;&sup3;&otilde;&Ecirc;&frac14;&raquo;&macr;<br/>&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&Ecirc;&auml;&sup3;&ouml;&sup2;&atilde;&Egrave;¨&iexcl;&cent;&atilde;&ETH;&Ouml;&micro;&sup3;&otilde;&Ecirc;&frac14;&raquo;&macr;//<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //randomize();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int k=0;k&lt;m_nOutputNetNumber;k++)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int j=0;j&lt;m_nHideNetNumber;j++) <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //sgn=pow((-1),random(1000));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sgn=(float)rand()/RAND_MAX ;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rnd=sgn*(rand()%10);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_npHideToOutputWeightMatrix=rnd/100;//&micro;&Uacute;m&cedil;&ouml;&Ntilde;ù±&frac34;&Ecirc;&auml;&sup3;&ouml;&sup2;&atilde;&Egrave;¨&Ouml;&micro;&sup3;&otilde;&Ecirc;&frac14;&raquo;&macr;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //randomize();<br/>&nbsp;&nbsp;&nbsp; for(k =0; k&lt;m_nOutputNetNumber;k++)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //sgn=pow((-1),random(10));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sgn=(float)rand()/RAND_MAX ;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rnd=sgn*(rand()%10);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_npOutputLayerThreshold=rnd/10;//&Ecirc;&auml;&sup3;&ouml;&sup2;&atilde;&atilde;&ETH;&Ouml;&micro;&sup3;&otilde;&Ecirc;&frac14;&raquo;&macr;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;</p><p><br/>}<br/>//input No. m Tarinning data <br/>void CBpNetWork::InputOfNoMTrainingData(int m,Study_Data_T * tnspl)<br/>{<br/>&nbsp;for (int k=0;k&lt;m;k++)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_fpSingleTrainingSample=tnspl.teach;//Study_Data.m_fpTeach;<br/>}<br/>////&micro;&Uacute;m&cedil;&ouml;&Ntilde;§&Iuml;°&Ntilde;ù±&frac34;&Ecirc;&auml;&Egrave;&euml;×&Oacute;&sup3;&Igrave;&ETH;ò///<br/>void CBpNetWork::InputOfNoMSampleData(int m, Study_Data_T * lnspl)<br/>{<br/>&nbsp;for (int i=0;i&lt;m_nInputNetNumber;i++)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_fpSingleInputSample= lnspl.input;//Study_Data.input;<br/>&nbsp;&nbsp; <br/>}<br/>//&Ograve;&thorn;&sup2;&atilde;&cedil;÷&micro;&yen;&Ocirc;&ordf;&Ecirc;&auml;&Egrave;&euml;&iexcl;&cent;&Ecirc;&auml;&sup3;&ouml;&Ouml;&micro;×&Oacute;&sup3;&Igrave;&ETH;ò///<br/>void CBpNetWork::HideLayInOut()<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double sigma;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i,j;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (j=0;j&lt;m_nHideNetNumber;j++)<br/>&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sigma=0.0;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (i=0;i&lt;m_nInputNetNumber;i++)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sigma+=m_npInputToHideWeightMatrix*m_fpSingleInputSample;//&Ccedil;ó&Ograve;&thorn;&sup2;&atilde;&Auml;&Uacute;&raquo;&yacute;<br/>&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_npHideInputValue=sigma - m_npHideLayerThreshold;//&Ccedil;ó&Ograve;&thorn;&sup2;&atilde;&frac34;&raquo;&Ecirc;&auml;&Egrave;&euml;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_npHideOutputValue=1.0/(1.0+exp(-m_npHideInputValue));//&Ccedil;ó&Ograve;&thorn;&sup2;&atilde;&Ecirc;&auml;&sup3;&ouml;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>}<br/>//&Ecirc;&auml;&sup3;&ouml;&sup2;&atilde;&cedil;÷&micro;&yen;&Ocirc;&ordf;&Ecirc;&auml;&Egrave;&euml;&iexcl;&cent;&Ecirc;&auml;&sup3;&ouml;&Ouml;&micro;×&Oacute;&sup3;&Igrave;&ETH;ò///<br/>void CBpNetWork::OutLayInOut()<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double sigma;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int k=0;k&lt;m_nOutputNetNumber;k++)<br/>&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sigma=0.0;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int j=0;j&lt;m_nHideNetNumber;j++)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sigma+=m_npHideToOutputWeightMatrix*m_npHideOutputValue;//&Ccedil;ó&Ecirc;&auml;&sup3;&ouml;&sup2;&atilde;&Auml;&Uacute;&raquo;&yacute;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_npOutputLayerInputValue=sigma-m_npOutputLayerThreshold; //&Ccedil;ó&Ecirc;&auml;&sup3;&ouml;&sup2;&atilde;&frac34;&raquo;&Ecirc;&auml;&Egrave;&euml;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_npOutputLayerOutputValue=1.0/(1.0+exp(-m_npOutputLayerInputValue));//&Ccedil;ó&Ecirc;&auml;&sup3;&ouml;&sup2;&atilde;&Ecirc;&auml;&sup3;&ouml;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp; <br/>}<br/>//&Ecirc;&auml;&sup3;&ouml;&sup2;&atilde;&Ouml;&Aacute;&Ograve;&thorn;&sup2;&atilde;&micro;&Auml;&Ograve;&raquo;°&atilde;&raquo;&macr;&Icirc;ó&sup2;&icirc;×&Oacute;&sup3;&Igrave;&ETH;ò////<br/>void CBpNetWork::NormalizeErrOutLayToHideLay(int m)<br/>{<br/>&nbsp;double *abs_err = new double;<br/>&nbsp;//double abs_err;//&Atilde;&iquest;&cedil;&ouml;&Ntilde;ù±&frac34;&micro;&Auml;&frac34;&oslash;&para;&Ocirc;&Icirc;ó&sup2;&icirc;&para;&frac14;&Ecirc;&Ccedil;&acute;&Oacute;0&iquest;&ordf;&Ecirc;&frac14;&micro;&Auml;<br/>&nbsp;double sqr_err=0;//&Atilde;&iquest;&cedil;&ouml;&Ntilde;ù±&frac34;&micro;&Auml;&AElig;&frac12;·&frac12;&Icirc;ó&sup2;&icirc;&frac14;&AElig;&Euml;&atilde;&para;&frac14;&Ecirc;&Ccedil;&acute;&Oacute;0&iquest;&ordf;&Ecirc;&frac14;&micro;&Auml;<br/>&nbsp;//for (int output=0;output&lt;m_nOutputNetNumber;output++)&nbsp; //output???<br/>&nbsp;for (int k=0;k&lt;m_nOutputNetNumber;k++)<br/>&nbsp;{<br/>&nbsp;abs_err=m_fpSingleTrainingSample-m_npOutputLayerOutputValue;<br/>&nbsp;if(abs_err == 0)<br/>&nbsp;&nbsp;abs_err = 0.00001;<br/>&nbsp;//&cedil;ù&frac34;&Yacute;&Icirc;ó&sup2;&icirc;&cedil;&Auml;±&auml;&Ntilde;§&Iuml;°&ETH;§&Acirc;&Ecirc;<br/>&nbsp;if(abs_err&gt;m_fpAbsErrValBefore)<br/>&nbsp;{<br/>&nbsp;&nbsp;*m_npAlpha += (abs_err/(abs_err+m_fpAbsErrValBefore))**m_npAlpha;<br/>&nbsp;&nbsp;*m_npBeta += (abs_err/(abs_err+m_fpAbsErrValBefore))**m_npBeta;<br/>&nbsp;}<br/>&nbsp;else <br/>&nbsp;{<br/>&nbsp;&nbsp;*m_npAlpha -= (abs_err/(abs_err+m_fpAbsErrValBefore))**m_npAlpha;<br/>&nbsp;&nbsp;*m_npBeta -= (abs_err/(abs_err+m_fpAbsErrValBefore))**m_npBeta;<br/>&nbsp;}<br/>&nbsp;m_fpAbsErrValBefore = abs_err;<br/>&nbsp;//&Ccedil;ó&micro;&Uacute;m&cedil;&ouml;&Ntilde;ù±&frac34;&Iuml;&Acirc;&micro;&Auml;&micro;&Uacute;k&cedil;&ouml;&Eacute;&ntilde;&frac34;&shy;&Ocirc;&ordf;&micro;&Auml;&frac34;&oslash;&para;&Ocirc;&Icirc;ó&sup2;&icirc;<br/>&nbsp;sqr_err+=(abs_err)*(abs_err);//&Ccedil;ó&micro;&Uacute;m&cedil;&ouml;&Ntilde;ù±&frac34;&Iuml;&Acirc;&Ecirc;&auml;&sup3;&ouml;&sup2;&atilde;&micro;&Auml;&AElig;&frac12;·&frac12;&Icirc;ó&sup2;&icirc;<br/>&nbsp;m_fpD_Err=abs_err*m_npOutputLayerOutputValue*(1.0-m_npOutputLayerOutputValue);//d_err&Ecirc;&auml;&sup3;&ouml;&sup2;&atilde;&cedil;÷&Eacute;&ntilde;&frac34;&shy;&Ocirc;&ordf;&micro;&Auml;&Ograve;&raquo;°&atilde;&raquo;&macr;&Icirc;ó&sup2;&icirc;<br/>&nbsp;}<br/>&nbsp;m_npTotalErrofM=sqr_err/2;//&micro;&Uacute;m&cedil;&ouml;&Ntilde;ù±&frac34;&Iuml;&Acirc;&Ecirc;&auml;&sup3;&ouml;&sup2;&atilde;&micro;&Auml;&AElig;&frac12;·&frac12;&Icirc;ó&sup2;&icirc;/2=&micro;&Uacute;m&cedil;&ouml;&Ntilde;ù±&frac34;&micro;&Auml;&frac34;ù·&frac12;&Icirc;ó&sup2;&icirc;<br/>&nbsp;delete []abs_err;<br/>}</p><p>void CBpNetWork::NormalizeErrHideLayToOutLay()<br/>{<br/>&nbsp;double sigma;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int j=0;j&lt;m_nHideNetNumber;j++) <br/>&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sigma=0.0;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int k=0;k&lt;m_nOutputNetNumber;k++) <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sigma=m_fpD_Err*m_npHideToOutputWeightMatrix;<br/>&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_fpE_Err=sigma*exp(m_npHideOutputValue)/((1-exp(m_npHideOutputValue))*(1-exp(m_npHideOutputValue)));//&Ograve;&thorn;&sup2;&atilde;&cedil;÷&Eacute;&ntilde;&frac34;&shy;&Ocirc;&ordf;&micro;&Auml;&Ograve;&raquo;°&atilde;&raquo;&macr;&Icirc;ó&sup2;&icirc;<br/>&nbsp;&nbsp;}<br/>}<br/>&nbsp; //&Ecirc;&auml;&sup3;&ouml;&sup2;&atilde;&Ouml;&Aacute;&Ograve;&thorn;&sup2;&atilde;&micro;&Auml;&Egrave;¨&Ouml;&micro;&micro;÷&Otilde;&ucirc;&iexcl;&cent;&Ecirc;&auml;&sup3;&ouml;&sup2;&atilde;&atilde;&ETH;&Ouml;&micro;&micro;÷&Otilde;&ucirc;&frac14;&AElig;&Euml;&atilde;×&Oacute;&sup3;&Igrave;&ETH;ò//////<br/>void CBpNetWork::AdjustWeightAndThresholdOutLayToHideLay(int m, FILE * fp)<br/>{<br/>&nbsp;for (int k=0;k&lt;m_nOutputNetNumber;k++)<br/>&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp; for (int j=0;j&lt;m_nHideNetNumber;j++)<br/>&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp; m_npHideToOutputWeightMatrix+=*m_npAlpha*m_fpD_Err*m_npHideOutputValue;//&Ecirc;&auml;&sup3;&ouml;&sup2;&atilde;&Ouml;&Aacute;&Ograve;&thorn;&sup2;&atilde;&micro;&Auml;&Egrave;¨&Ouml;&micro;&micro;÷&Otilde;&ucirc;<br/>&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp; m_npOutputLayerThreshold+=*m_npAlpha*m_fpD_Err;//&Ecirc;&auml;&sup3;&ouml;&sup2;&atilde;&Ouml;&Aacute;&Ograve;&thorn;&sup2;&atilde;&micro;&Auml;&atilde;&ETH;&Ouml;&micro;&micro;÷&Otilde;&ucirc;<br/>&nbsp;} <br/>}<br/>//m_nLearningSampleNumber&cedil;&ouml;&Ntilde;ù±&frac34;&micro;&Auml;&Egrave;&laquo;&frac34;&Ouml;&Icirc;ó&sup2;&icirc;&frac14;&AElig;&Euml;&atilde;×&Oacute;&sup3;&Igrave;&ETH;ò////<br/>double CBpNetWork::GlobalErrSum()<br/>{<br/>&nbsp;double total_err=0;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int m=0;m&lt;m_nLearningSampleNumber;m++) <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; total_err+=m_npTotalErrofM;//&Atilde;&iquest;&cedil;&ouml;&Ntilde;ù±&frac34;&micro;&Auml;&frac34;ù·&frac12;&Icirc;ó&sup2;&icirc;&frac14;&Oacute;&AElig;&eth;&Agrave;&acute;&frac34;&Iacute;&sup3;&Eacute;&Aacute;&Euml;&Egrave;&laquo;&frac34;&Ouml;&Icirc;ó&sup2;&icirc;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return total_err;<br/>}<br/>&nbsp;//&Ograve;&thorn;&sup2;&atilde;&Ouml;&Aacute;&Ecirc;&auml;&Egrave;&euml;&sup2;&atilde;&micro;&Auml;&Egrave;¨&Ouml;&micro;&micro;÷&Otilde;&ucirc;&iexcl;&cent;&Ograve;&thorn;&sup2;&atilde;&atilde;&ETH;&Ouml;&micro;&micro;÷&Otilde;&ucirc;&frac14;&AElig;&Euml;&atilde;×&Oacute;&sup3;&Igrave;&ETH;ò/////<br/>void CBpNetWork::AdjustWeightAndThresholdHideLayToOutLay(int m,FILE * fp)<br/>{<br/>for (int j=0;j&lt;m_nHideNetNumber;j++)<br/>&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i=0;i&lt;m_nInputNetNumber;i++)<br/>&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //cout&lt;&lt;"&micro;&Uacute;"&lt; fprintf(fp,"&micro;&Uacute;%d&cedil;&ouml;&Ntilde;ù±&frac34;&Ecirc;±&micro;&Auml;&Ecirc;&auml;&sup3;&ouml;&sup2;&atilde;&Ouml;&Aacute;&Ograve;&thorn;&sup2;&atilde;&micro;&Auml;&Egrave;¨&Ouml;&micro;&Icirc;&ordf;&pound;&ordm;%f\n",m,m_npHideToOutputWeightMatrix);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_npInputToHideWeightMatrix+=*m_npBeta*m_fpE_Err*m_fpSingleInputSample;//&Ograve;&thorn;&sup2;&atilde;&Ouml;&Aacute;&Ecirc;&auml;&Egrave;&euml;&sup2;&atilde;&micro;&Auml;&Egrave;¨&Ouml;&micro;&micro;÷&Otilde;&ucirc;<br/>&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_npHideLayerThreshold+=*m_npBeta*m_fpE_Err;<br/>&nbsp;}<br/>}</p><p>void CBpNetWork::Excute(Study_Data_T * spl, double err, int count)<br/>{<br/>&nbsp;double temp_err = 0;<br/>&nbsp;int local_count =0;<br/>&nbsp;if(count == 0)<br/>&nbsp;&nbsp;count = 1000;<br/>&nbsp;if(!spl)<br/>&nbsp;&nbsp;return;<br/>&nbsp;do<br/>&nbsp;{<br/>&nbsp;Tarning(spl);<br/>&nbsp;temp_err = GlobalErrSum();<br/>&nbsp;local_count++;<br/>&nbsp;}while(temp_err&gt;err&amp;&amp;local_count&lt;count);<br/>}</p><p>void CBpNetWork::Tarning(Study_Data_T * spl)<br/>{<br/>&nbsp;&nbsp;int i = 0;<br/>&nbsp;&nbsp;Study_Data_T * tlnspl =spl;<br/>&nbsp;&nbsp;Study_Data_T * ttnspl =spl;<br/>&nbsp;for(;tlnspl != NULL&amp;&amp; ttnspl != NULL &amp;&amp; i&lt;m_nLearningSampleNumber*m_nInputNetNumber;tlnspl++,ttnspl++,i++)<br/>&nbsp;{<br/>&nbsp;&nbsp;InputOfNoMSampleData(i, tlnspl);<br/>&nbsp;&nbsp;InputOfNoMTrainingData(i, ttnspl);<br/>&nbsp;&nbsp;HideLayInOut();<br/>&nbsp;&nbsp;OutLayInOut();<br/>&nbsp;&nbsp;NormalizeErrOutLayToHideLay(i);<br/>&nbsp;&nbsp;NormalizeErrHideLayToOutLay();<br/>&nbsp;&nbsp;AdjustWeightAndThresholdOutLayToHideLay(i,NULL);<br/>&nbsp;&nbsp;AdjustWeightAndThresholdHideLayToOutLay(i,NULL);<br/>&nbsp;}<br/>}<br/></p><p>&nbsp;</p><p>// head file</p><p>// BpNetWork.h: interface for the CBpNetWork class.<br/>//<br/>//////////////////////////////////////////////////////////////////////</p><p>#if !defined(AFX_BPNETWORK_H__2FDDE314_11F6_4D49_A046_C42B29C3754D__INCLUDED_)<br/>#define AFX_BPNETWORK_H__2FDDE314_11F6_4D49_A046_C42B29C3754D__INCLUDED_</p><p>#if _MSC_VER &gt; 1000<br/>#pragma once<br/>#endif // _MSC_VER &gt; 1000</p><p>&nbsp;</p><p><br/>#include "math.h"</p><p><br/>typedef&nbsp;struct Study_Data_S {<br/>&nbsp;&nbsp;&nbsp;double *input;<br/>&nbsp;&nbsp;&nbsp;double *teach;<br/>&nbsp;&nbsp;} Study_Data_T;<br/>class CBpNetWork&nbsp; <br/>{<br/>public://&Ecirc;&auml;&sup3;&ouml;&sup2;&atilde;&Ouml;&Aacute;&Ograve;&thorn;&sup2;&atilde;&micro;&Auml;&Ograve;&raquo;°&atilde;&raquo;&macr;&Icirc;ó&sup2;&icirc;×&Oacute;&sup3;&Igrave;&ETH;ò////</p><p>&nbsp;void Tarning(Study_Data_T * spl);<br/>&nbsp;void Excute(Study_Data_T * spl, double err, int count);<br/>&nbsp;void AdjustWeightAndThresholdHideLayToOutLay(int m, FILE * fp);<br/>&nbsp;double GlobalErrSum();<br/>&nbsp;void AdjustWeightAndThresholdOutLayToHideLay(int m, FILE * fp);<br/>&nbsp;void NormalizeErrHideLayToOutLay();<br/>&nbsp;void NormalizeErrOutLayToHideLay(int m);<br/>&nbsp;void OutLayInOut();<br/>&nbsp;void HideLayInOut();<br/>&nbsp;void InputOfNoMSampleData(int m,Study_Data_T * lnspl);<br/>&nbsp;void InputOfNoMTrainingData(int m,Study_Data_T * lnspl);<br/>&nbsp;bool Init();<br/>&nbsp;CBpNetWork(int LearningSplNum, int OutLayNumber,int HideLayNumber,int inLayNum);</p><p>&nbsp;double* m_npBeta;//&Ograve;&thorn;&sup2;&atilde;&Ouml;&Aacute;&Ecirc;&auml;&Egrave;&euml;&sup2;&atilde;&Ntilde;§&Iuml;°&ETH;§&Acirc;&Ecirc;<br/>&nbsp;double* m_npAlpha;//&Ecirc;&auml;&sup3;&ouml;&sup2;&atilde;&Ouml;&Aacute;&Ograve;&thorn;&sup2;&atilde;&micro;&Auml;&Ntilde;§&Iuml;°&ETH;§&Acirc;&Ecirc;<br/>&nbsp;double* m_npTotalErrofM;//&micro;&Uacute;m&cedil;&ouml;&Ntilde;ù±&frac34;&micro;&Auml;×&Uuml;&Icirc;ó&sup2;&icirc;<br/>&nbsp;double* m_npOutputLayerThreshold;//&Ecirc;&auml;&sup3;&ouml;&sup2;&atilde;&micro;&Auml;&atilde;&ETH;&Ouml;&micro;<br/>&nbsp;double* m_npHideLayerThreshold;//&Ograve;&thorn;&sup2;&atilde;&micro;&Auml;&atilde;&ETH;&Ouml;&micro;<br/>&nbsp;double* m_npOutputLayerOutputValue;//&Ecirc;&auml;&sup3;&ouml;&sup2;&atilde;&micro;&Auml;&Ecirc;&auml;&sup3;&ouml;<br/>&nbsp;double* m_npHideOutputValue;//&Ograve;&thorn;&sup2;&atilde;&micro;&Auml;&Ecirc;&auml;&sup3;&ouml;<br/>&nbsp;double* m_npOutputLayerInputValue;//&Ecirc;&auml;&sup3;&ouml;&sup2;&atilde;&micro;&Auml;&Ecirc;&auml;&Egrave;&euml;<br/>&nbsp;double* m_npHideInputValue;//&Ograve;&thorn;&sup2;&atilde;&micro;&Auml;&Ecirc;&auml;&Egrave;&euml;<br/>&nbsp;double* m_npHideToOutputWeightMatrix;//&Ograve;&thorn;&sup2;&atilde;&Ouml;&Aacute;&Ecirc;&auml;&sup3;&ouml;&sup2;&atilde;&Egrave;¨&Ouml;&micro;<br/>&nbsp;double* m_npInputToHideWeightMatrix;//&Ecirc;&auml;&Egrave;&euml;&sup2;&atilde;&Ouml;&Aacute;&Ograve;&thorn;&sup2;&atilde;&Egrave;¨&Ouml;&micro;<br/>&nbsp;double* m_fpSingleTrainingSample;//&micro;&yen;&cedil;&ouml;&Ntilde;ù±&frac34;&frac12;&Igrave;&Ecirc;&brvbar;&Ecirc;&yacute;&frac34;&Yacute;<br/>&nbsp;double* m_fpSingleInputSample;//&micro;&yen;&cedil;&ouml;&Ntilde;ù±&frac34;&Ecirc;&auml;&Egrave;&euml;&Ecirc;&yacute;&frac34;&Yacute;<br/>&nbsp;double* m_fpInput;<br/>&nbsp;double* m_fpTeach;<br/>&nbsp;double* m_fpD_Err;<br/>&nbsp;double* m_fpE_Err;<br/>&nbsp;double * m_fpAbsErrValBefore;<br/>&nbsp;Study_Data_T *m_spStudy_Data;</p><p>&nbsp;CBpNetWork();<br/>&nbsp;virtual ~CBpNetWork();</p><p>private:<br/>&nbsp;int m_nLearningSampleNumber;//&Ntilde;§&Iuml;°&Ntilde;ù±&frac34;&cedil;&ouml;&Ecirc;&yacute;<br/>&nbsp;int m_nOutputNetNumber;//&Ecirc;&auml;&Egrave;&euml;&sup2;&atilde;&Eacute;&ntilde;&frac34;&shy;&Ocirc;&ordf;&Ecirc;&yacute;&Auml;&iquest;<br/>&nbsp;int m_nHideNetNumber;//&Ograve;&thorn;&sup2;&atilde;&Eacute;&ntilde;&frac34;&shy;&Ocirc;&ordf;&Ecirc;&yacute;&Auml;&iquest;<br/>&nbsp;int m_nInputNetNumber;//&Ecirc;&auml;&sup3;&ouml;&sup2;&atilde;&Eacute;&ntilde;&frac34;&shy;&Ocirc;&ordf;&Ecirc;&yacute;&Auml;&iquest;<br/>};</p><p>#endif // !defined(AFX_BPNETWORK_H__2FDDE314_11F6_4D49_A046_C42B29C3754D__INCLUDED_)<br/></p>

devil1980 发表于 2006-3-30 17:01

测试通过的BP类,可以收敛Total误差

<p>// BpNetWork.cpp: implementation of the CBpNetWork class.<br/>//<br/>//////////////////////////////////////////////////////////////////////<br/>//Author mail: <a href="mailto:os.win2k@163.com">os.win2k@163.com</a><br/>//////////////////////////////////////////////////////////////////////<br/>// Construction/Destruction<br/>//////////////////////////////////////////////////////////////////////<br/>#include "stdafx.h"<br/>#include "BpNetWork.h"<br/>#include "iostream.h"</p><p>CBpNetWork::CBpNetWork()<br/>{<br/>&nbsp;m_npBeta = new double;//&Ograve;&thorn;&sup2;&atilde;&Ouml;&Aacute;&Ecirc;&auml;&Egrave;&euml;&sup2;&atilde;&Ntilde;§&Iuml;°&ETH;§&Acirc;&Ecirc;<br/>&nbsp;*m_npBeta = 0.002;<br/>&nbsp;m_npAlpha = new double;//&Ecirc;&auml;&sup3;&ouml;&sup2;&atilde;&Ouml;&Aacute;&Ograve;&thorn;&sup2;&atilde;&micro;&Auml;&Ntilde;§&Iuml;°&ETH;§&Acirc;&Ecirc;<br/>&nbsp;*m_npAlpha = 0.002;<br/>&nbsp;m_npTotalErrofM = NULL;//&micro;&Uacute;m&cedil;&ouml;&Ntilde;ù±&frac34;&micro;&Auml;×&Uuml;&Icirc;ó&sup2;&icirc;<br/>&nbsp;m_npOutputLayerThreshold = NULL;//&Ecirc;&auml;&sup3;&ouml;&sup2;&atilde;&micro;&Auml;&atilde;&ETH;&Ouml;&micro;<br/>&nbsp;m_npHideLayerThreshold = NULL;//&Ograve;&thorn;&sup2;&atilde;&micro;&Auml;&atilde;&ETH;&Ouml;&micro;<br/>&nbsp;m_npOutputLayerOutputValue = NULL;//&Ecirc;&auml;&sup3;&ouml;&sup2;&atilde;&micro;&Auml;&Ecirc;&auml;&sup3;&ouml;<br/>&nbsp;m_npHideOutputValue = NULL;//&Ograve;&thorn;&sup2;&atilde;&micro;&Auml;&Ecirc;&auml;&sup3;&ouml;<br/>&nbsp;m_npOutputLayerInputValue = NULL;//&Ecirc;&auml;&sup3;&ouml;&sup2;&atilde;&micro;&Auml;&Ecirc;&auml;&Egrave;&euml;<br/>&nbsp;m_npHideInputValue;//&Ograve;&thorn;&sup2;&atilde;&micro;&Auml;&Ecirc;&auml;&Egrave;&euml;<br/>&nbsp;m_npHideToOutputWeightMatrix = NULL;//&Ograve;&thorn;&sup2;&atilde;&Ouml;&Aacute;&Ecirc;&auml;&sup3;&ouml;&sup2;&atilde;&Egrave;¨&Ouml;&micro;<br/>&nbsp;m_npInputToHideWeightMatrix = NULL;//&Ecirc;&auml;&Egrave;&euml;&sup2;&atilde;&Ouml;&Aacute;&Ograve;&thorn;&sup2;&atilde;&Egrave;¨&Ouml;&micro;<br/>&nbsp;m_fpSingleTrainingSample = NULL;//&micro;&yen;&cedil;&ouml;&Ntilde;ù±&frac34;&frac12;&Igrave;&Ecirc;&brvbar;&Ecirc;&yacute;&frac34;&Yacute;<br/>&nbsp;m_fpSingleInputSample = NULL;//&micro;&yen;&cedil;&ouml;&Ntilde;ù±&frac34;&Ecirc;&auml;&Egrave;&euml;&Ecirc;&yacute;&frac34;&Yacute;<br/>&nbsp;m_fpE_Err = NULL;<br/>&nbsp;m_fpD_Err = NULL;<br/>&nbsp;m_fpInput = NULL;<br/>&nbsp;m_fpTeach = NULL;<br/>&nbsp;m_spStudy_Data = NULL;<br/>&nbsp;m_fpAbsErrValBefore =NULL;<br/>&nbsp;m_nLearningSampleNumber = 10;//&Ntilde;§&Iuml;°&Ntilde;ù±&frac34;&cedil;&ouml;&Ecirc;&yacute;<br/>&nbsp;m_nOutputNetNumber = 1;//&Ecirc;&auml;&Egrave;&euml;&sup2;&atilde;&Eacute;&ntilde;&frac34;&shy;&Ocirc;&ordf;&Ecirc;&yacute;&Auml;&iquest;<br/>&nbsp;m_nHideNetNumber = 10;//&Ograve;&thorn;&sup2;&atilde;&Eacute;&ntilde;&frac34;&shy;&Ocirc;&ordf;&Ecirc;&yacute;&Auml;&iquest;<br/>&nbsp;m_nInputNetNumber = 1;//&Ecirc;&auml;&sup3;&ouml;&sup2;&atilde;&Eacute;&ntilde;&frac34;&shy;&Ocirc;&ordf;&Ecirc;&yacute;&Auml;&iquest;<br/>&nbsp;Init();<br/>}</p><p>CBpNetWork::~CBpNetWork()<br/>{<br/>&nbsp;if(m_npBeta!=NULL)&nbsp;delete m_npBeta,m_npBeta = NULL;<br/>&nbsp;if(NULL != m_npAlpha)&nbsp;delete m_npAlpha,m_npAlpha = NULL;<br/>&nbsp;if(NULL != m_npTotalErrofM) delete m_npTotalErrofM, m_npTotalErrofM = NULL;<br/>&nbsp;if(NULL != m_npOutputLayerThreshold) delete []m_npOutputLayerThreshold, m_npOutputLayerThreshold= NULL;<br/>&nbsp;if(NULL != m_npHideLayerThreshold) delete[]m_npHideLayerThreshold, m_npHideLayerThreshold =NULL;<br/>&nbsp;if(NULL != m_npOutputLayerOutputValue) delete[]m_npOutputLayerOutputValue,m_npOutputLayerOutputValue = NULL;<br/>&nbsp;if(NULL != m_npHideOutputValue) delete []m_npHideOutputValue,m_npHideOutputValue=NULL;<br/>&nbsp;if(NULL != m_npOutputLayerInputValue) delete []m_npOutputLayerInputValue,m_npOutputLayerInputValue= NULL;<br/>&nbsp;if(NULL != m_npHideInputValue) delete []m_npHideInputValue, m_npHideInputValue = NULL;<br/>&nbsp;if(NULL != m_npHideToOutputWeightMatrix) delete []m_npHideToOutputWeightMatrix, m_npHideToOutputWeightMatrix = NULL;<br/>&nbsp;if(NULL != m_npInputToHideWeightMatrix) delete []m_npInputToHideWeightMatrix,m_npInputToHideWeightMatrix = NULL;<br/>&nbsp;if(NULL != m_fpSingleTrainingSample) delete []m_fpSingleTrainingSample,m_fpSingleTrainingSample = NULL;<br/>&nbsp;if(NULL != m_fpSingleInputSample) delete []m_fpSingleInputSample, m_fpSingleInputSample =NULL;<br/>&nbsp;if(NULL != m_fpE_Err) delete []m_fpE_Err, m_fpE_Err =NULL;<br/>&nbsp;if(NULL != m_fpD_Err) delete []m_fpD_Err, m_fpD_Err = NULL;<br/>&nbsp;if(NULL != m_fpAbsErrValBefore) delete []m_fpAbsErrValBefore, m_fpAbsErrValBefore= NULL;<br/>&nbsp;Study_Data_T *p = m_spStudy_Data;<br/>&nbsp;<br/>for(int i = 0;i&lt; m_nLearningSampleNumber;i++)<br/>&nbsp;&nbsp;for(int j = 0; j&lt; m_nInputNetNumber; j++)<br/>&nbsp;{<br/>&nbsp;<br/>&nbsp;m_fpInput = m_spStudy_Data-&gt;input;<br/>&nbsp;m_fpTeach = m_spStudy_Data-&gt;teach;<br/>&nbsp;if(NULL != m_fpInput) delete []m_fpInput, m_fpInput = NULL;<br/>&nbsp;if(NULL != m_fpTeach) delete []m_fpTeach, m_fpTeach = NULL;<br/>&nbsp;m_spStudy_Data++;<br/>&nbsp;}<br/>&nbsp;delete []p;<br/>}</p><p><br/>CBpNetWork::CBpNetWork(int LearningSplNum, int OutLayNumber, int HideLayNumber, int inLayNum)<br/>{<br/>&nbsp;m_nLearningSampleNumber = LearningSplNum;<br/>&nbsp;m_nOutputNetNumber = OutLayNumber;<br/>&nbsp;m_nHideNetNumber = HideLayNumber;<br/>&nbsp;m_nInputNetNumber = inLayNum;<br/>&nbsp;Init();<br/>}<br/>//initial weight and threshold<br/>bool CBpNetWork::Init()<br/>{<br/>&nbsp;if(!m_nLearningSampleNumber||!m_nOutputNetNumber||!m_nHideNetNumber||!m_nInputNetNumber)<br/>&nbsp;&nbsp;return false;<br/>&nbsp;float sgn;<br/>&nbsp;float rnd;<br/>&nbsp;int i,j;<br/>&nbsp;m_npInputToHideWeightMatrix = new double ;<br/>&nbsp;Set(m_npInputToHideWeightMatrix,m_nHideNetNumber*m_nInputNetNumber);</p><p>&nbsp;m_npHideLayerThreshold = new double;<br/>&nbsp;Set(m_npHideLayerThreshold,m_nHideNetNumber);</p><p>&nbsp;m_npHideToOutputWeightMatrix = new double;<br/>&nbsp;Set(m_npHideToOutputWeightMatrix,m_nOutputNetNumber*m_nHideNetNumber);</p><p>&nbsp;m_fpSingleInputSample = new double;<br/>&nbsp;Set(m_fpSingleInputSample,m_nLearningSampleNumber);</p><p>&nbsp;m_fpSingleTrainingSample = new double ;<br/>&nbsp;Set(m_fpSingleTrainingSample,m_nOutputNetNumber);<br/>&nbsp;m_npHideInputValue = new double;<br/>&nbsp;Set(m_npHideInputValue,m_nHideNetNumber);</p><p>&nbsp;m_npOutputLayerOutputValue = new double;<br/>&nbsp;Set(m_npOutputLayerOutputValue,m_nOutputNetNumber);</p><p>&nbsp;m_npOutputLayerInputValue = new double;<br/>&nbsp;Set(m_npOutputLayerInputValue,m_nOutputNetNumber);</p><p>&nbsp;m_npHideLayerThreshold = new double;<br/>&nbsp;Set(m_npHideLayerThreshold,m_nHideNetNumber);</p><p>&nbsp;m_npOutputLayerThreshold = new double ;<br/>&nbsp;Set(m_npOutputLayerThreshold,m_nOutputNetNumber);</p><p>&nbsp;m_npTotalErrofM = new double;<br/>&nbsp;Set(m_npTotalErrofM,m_nLearningSampleNumber);</p><p>&nbsp;m_fpE_Err = new double;<br/>&nbsp;Set(m_fpE_Err,m_nHideNetNumber);</p><p>&nbsp;m_fpD_Err = new double;<br/>&nbsp;Set(m_fpD_Err,m_nOutputNetNumber);</p><p>&nbsp;m_fpAbsErrValBefore = new double;<br/>&nbsp;Set(m_fpAbsErrValBefore,m_nOutputNetNumber);</p><p>&nbsp;m_npHideOutputValue = new double;<br/>&nbsp;Set(m_npHideOutputValue,m_nHideNetNumber);</p><p>&nbsp;m_spStudy_Data = (Study_Data_T *)new double;<br/>&nbsp;for( i = 0;i&lt; m_nLearningSampleNumber;i++)<br/>&nbsp;&nbsp;for( j = 0; j&lt; m_nInputNetNumber; j++)<br/>&nbsp;&nbsp;{<br/>&nbsp;&nbsp;m_fpInput = new double;<br/>&nbsp;&nbsp;m_fpTeach = new double;<br/>&nbsp;&nbsp;m_spStudy_Data-&gt;input = m_fpInput;<br/>&nbsp;&nbsp;m_spStudy_Data-&gt;teach =m_fpTeach;<br/>&nbsp;&nbsp;m_spStudy_Data++;<br/>&nbsp;&nbsp;}<br/>//&Ograve;&thorn;&sup2;&atilde;&Egrave;¨&iexcl;&cent;&atilde;&ETH;&Ouml;&micro;&sup3;&otilde;&Ecirc;&frac14;&raquo;&macr;//<br/>&nbsp;for(j=0;j&lt;m_nHideNetNumber;j++)<br/>&nbsp;&nbsp;for(i=0;i&lt;m_nInputNetNumber;i++)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //sgn=pow((-1),random(100));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sgn=(float)rand()/RAND_MAX ;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rnd=sgn*(rand()%10);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_npInputToHideWeightMatrix= rnd/100;//&Ograve;&thorn;&sup2;&atilde;&Egrave;¨&Ouml;&micro;&sup3;&otilde;&Ecirc;&frac14;&raquo;&macr;&iexcl;&pound;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>//randomize();<br/>&nbsp;for(j=0;j&lt;m_nHideNetNumber;j++)<br/>&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp; //sgn=pow((-1),random(1000));<br/>&nbsp;&nbsp;&nbsp;&nbsp; sgn=(float)rand()/RAND_MAX;<br/>&nbsp;rnd=sgn*(rand()%10);<br/>&nbsp;m_npHideLayerThreshold= 0;//&Ouml;&ETH;&frac14;&auml;&sup2;&atilde;&atilde;&ETH;&Ouml;&micro;&sup3;&otilde;&Ecirc;&frac14;&raquo;&macr;<br/>&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&Ecirc;&auml;&sup3;&ouml;&sup2;&atilde;&Egrave;¨&iexcl;&cent;&atilde;&ETH;&Ouml;&micro;&sup3;&otilde;&Ecirc;&frac14;&raquo;&macr;//<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //randomize();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int k=0;k&lt;m_nOutputNetNumber;k++)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int j=0;j&lt;m_nHideNetNumber;j++) <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //sgn=pow((-1),random(1000));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sgn=(float)rand()/RAND_MAX ;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rnd=sgn*(rand()%10);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_npHideToOutputWeightMatrix=rnd/100;//&micro;&Uacute;m&cedil;&ouml;&Ntilde;ù±&frac34;&Ecirc;&auml;&sup3;&ouml;&sup2;&atilde;&Egrave;¨&Ouml;&micro;&sup3;&otilde;&Ecirc;&frac14;&raquo;&macr;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //randomize();<br/>&nbsp;&nbsp;&nbsp; for(k =0; k&lt;m_nOutputNetNumber;k++)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //sgn=pow((-1),random(10));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sgn=(float)rand()/RAND_MAX ;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rnd=sgn*(rand()%10);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_npOutputLayerThreshold=0;//&Ecirc;&auml;&sup3;&ouml;&sup2;&atilde;&atilde;&ETH;&Ouml;&micro;&sup3;&otilde;&Ecirc;&frac14;&raquo;&macr;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;</p><p><br/>}<br/>//input No. m Tarinning data <br/>void CBpNetWork::InputOfNoMTrainingData(int m,Study_Data_T * tnspl)<br/>{<br/>&nbsp;for (int k=0;k&lt;m_nInputNetNumber;k++)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_fpSingleTrainingSample=tnspl.teach;//Study_Data.m_fpTeach;<br/>}<br/>////&micro;&Uacute;m&cedil;&ouml;&Ntilde;§&Iuml;°&Ntilde;ù±&frac34;&Ecirc;&auml;&Egrave;&euml;×&Oacute;&sup3;&Igrave;&ETH;ò///<br/>void CBpNetWork::InputOfNoMSampleData(int m, Study_Data_T * lnspl)<br/>{<br/>&nbsp;for (int i=0;i&lt;m_nInputNetNumber;i++)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_fpSingleInputSample= lnspl.input;//Study_Data.input;<br/>&nbsp;&nbsp; <br/>}<br/>//&Ograve;&thorn;&sup2;&atilde;&cedil;÷&micro;&yen;&Ocirc;&ordf;&Ecirc;&auml;&Egrave;&euml;&iexcl;&cent;&Ecirc;&auml;&sup3;&ouml;&Ouml;&micro;×&Oacute;&sup3;&Igrave;&ETH;ò///<br/>void CBpNetWork::HideLayInOut()<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double sigma;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i,j;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (j=0;j&lt;m_nHideNetNumber;j++)<br/>&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sigma=0.0;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (i=0;i&lt;m_nInputNetNumber;i++)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sigma+=m_npInputToHideWeightMatrix*m_fpSingleInputSample;//&Ccedil;ó&Ograve;&thorn;&sup2;&atilde;&Auml;&Uacute;&raquo;&yacute;<br/>&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_npHideInputValue=sigma - m_npHideLayerThreshold;//&Ccedil;ó&Ograve;&thorn;&sup2;&atilde;&frac34;&raquo;&Ecirc;&auml;&Egrave;&euml;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_npHideOutputValue=1.0/(1.0+exp(-m_npHideInputValue));//&Ccedil;ó&Ograve;&thorn;&sup2;&atilde;&Ecirc;&auml;&sup3;&ouml;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>}<br/>//&Ecirc;&auml;&sup3;&ouml;&sup2;&atilde;&cedil;÷&micro;&yen;&Ocirc;&ordf;&Ecirc;&auml;&Egrave;&euml;&iexcl;&cent;&Ecirc;&auml;&sup3;&ouml;&Ouml;&micro;×&Oacute;&sup3;&Igrave;&ETH;ò///<br/>void CBpNetWork::OutLayInOut()<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double sigma;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int k=0;k&lt;m_nOutputNetNumber;k++)<br/>&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sigma=0.0;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int j=0;j&lt;m_nHideNetNumber;j++)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sigma+=m_npHideToOutputWeightMatrix*m_npHideOutputValue;//&Ccedil;ó&Ecirc;&auml;&sup3;&ouml;&sup2;&atilde;&Auml;&Uacute;&raquo;&yacute;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_npOutputLayerInputValue=sigma-m_npOutputLayerThreshold; //&Ccedil;ó&Ecirc;&auml;&sup3;&ouml;&sup2;&atilde;&frac34;&raquo;&Ecirc;&auml;&Egrave;&euml;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_npOutputLayerOutputValue=1.0/(1.0+exp(-m_npOutputLayerInputValue));//&Ccedil;ó&Ecirc;&auml;&sup3;&ouml;&sup2;&atilde;&Ecirc;&auml;&sup3;&ouml;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp; <br/>}<br/>//&Ecirc;&auml;&sup3;&ouml;&sup2;&atilde;&Ouml;&Aacute;&Ograve;&thorn;&sup2;&atilde;&micro;&Auml;&Ograve;&raquo;°&atilde;&raquo;&macr;&Icirc;ó&sup2;&icirc;×&Oacute;&sup3;&Igrave;&ETH;ò////<br/>void CBpNetWork::NormalizeErrOutLayToHideLay(int m)<br/>{<br/>&nbsp;double *abs_err = new double;<br/>&nbsp;//double abs_err;//&Atilde;&iquest;&cedil;&ouml;&Ntilde;ù±&frac34;&micro;&Auml;&frac34;&oslash;&para;&Ocirc;&Icirc;ó&sup2;&icirc;&para;&frac14;&Ecirc;&Ccedil;&acute;&Oacute;0&iquest;&ordf;&Ecirc;&frac14;&micro;&Auml;<br/>&nbsp;double sqr_err=0;//&Atilde;&iquest;&cedil;&ouml;&Ntilde;ù±&frac34;&micro;&Auml;&AElig;&frac12;·&frac12;&Icirc;ó&sup2;&icirc;&frac14;&AElig;&Euml;&atilde;&para;&frac14;&Ecirc;&Ccedil;&acute;&Oacute;0&iquest;&ordf;&Ecirc;&frac14;&micro;&Auml;<br/>&nbsp;//for (int output=0;output&lt;m_nOutputNetNumber;output++)&nbsp; //output???<br/>&nbsp;for (int k=0;k&lt;m_nOutputNetNumber;k++)<br/>&nbsp;{<br/>&nbsp;abs_err=m_fpSingleTrainingSample-m_npOutputLayerOutputValue;<br/>&nbsp;if(abs_err == 0)<br/>&nbsp;&nbsp;abs_err = 0.0000001;<br/>&nbsp;//&cedil;ù&frac34;&Yacute;&Icirc;ó&sup2;&icirc;&cedil;&Auml;±&auml;&Ntilde;§&Iuml;°&ETH;§&Acirc;&Ecirc;<br/>/*&nbsp;if(abs_err&gt;m_fpAbsErrValBefore)<br/>&nbsp;{<br/>&nbsp;&nbsp;*m_npAlpha += (abs_err/(abs_err+m_fpAbsErrValBefore))**m_npAlpha;<br/>&nbsp;&nbsp;*m_npBeta += (abs_err/(abs_err+m_fpAbsErrValBefore))**m_npBeta;<br/>&nbsp;}<br/>&nbsp;else <br/>&nbsp;{<br/>&nbsp;&nbsp;*m_npAlpha -= (abs_err/(abs_err+m_fpAbsErrValBefore))**m_npAlpha;<br/>&nbsp;&nbsp;*m_npBeta -= (abs_err/(abs_err+m_fpAbsErrValBefore))**m_npBeta;<br/>&nbsp;}*/<br/>&nbsp;m_fpAbsErrValBefore = abs_err;<br/>&nbsp;//&Ccedil;ó&micro;&Uacute;m&cedil;&ouml;&Ntilde;ù±&frac34;&Iuml;&Acirc;&micro;&Auml;&micro;&Uacute;k&cedil;&ouml;&Eacute;&ntilde;&frac34;&shy;&Ocirc;&ordf;&micro;&Auml;&frac34;&oslash;&para;&Ocirc;&Icirc;ó&sup2;&icirc;<br/>&nbsp;sqr_err+=(abs_err)*(abs_err);//&Ccedil;ó&micro;&Uacute;m&cedil;&ouml;&Ntilde;ù±&frac34;&Iuml;&Acirc;&Ecirc;&auml;&sup3;&ouml;&sup2;&atilde;&micro;&Auml;&AElig;&frac12;·&frac12;&Icirc;ó&sup2;&icirc;<br/>&nbsp;m_fpD_Err=abs_err*m_npOutputLayerOutputValue*(1.0-m_npOutputLayerOutputValue);//d_err&Ecirc;&auml;&sup3;&ouml;&sup2;&atilde;&cedil;÷&Eacute;&ntilde;&frac34;&shy;&Ocirc;&ordf;&micro;&Auml;&Ograve;&raquo;°&atilde;&raquo;&macr;&Icirc;ó&sup2;&icirc;<br/>&nbsp;}<br/>&nbsp;m_npTotalErrofM=sqr_err/2;//&micro;&Uacute;m&cedil;&ouml;&Ntilde;ù±&frac34;&Iuml;&Acirc;&Ecirc;&auml;&sup3;&ouml;&sup2;&atilde;&micro;&Auml;&AElig;&frac12;·&frac12;&Icirc;ó&sup2;&icirc;/2=&micro;&Uacute;m&cedil;&ouml;&Ntilde;ù±&frac34;&micro;&Auml;&frac34;ù·&frac12;&Icirc;ó&sup2;&icirc;<br/>&nbsp;delete []abs_err;<br/>}</p><p>void CBpNetWork::NormalizeErrHideLayToOutLay()<br/>{<br/>&nbsp;double sigma;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int j=0;j&lt;m_nHideNetNumber;j++) <br/>&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sigma=0.0;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int k=0;k&lt;m_nOutputNetNumber;k++) <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sigma=m_fpD_Err*m_npHideToOutputWeightMatrix;<br/>&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_fpE_Err=sigma*exp(m_npHideOutputValue)/((1-exp(m_npHideOutputValue))*(1-exp(m_npHideOutputValue)));//&Ograve;&thorn;&sup2;&atilde;&cedil;÷&Eacute;&ntilde;&frac34;&shy;&Ocirc;&ordf;&micro;&Auml;&Ograve;&raquo;°&atilde;&raquo;&macr;&Icirc;ó&sup2;&icirc;<br/>&nbsp;&nbsp;}<br/>}<br/>&nbsp; //&Ecirc;&auml;&sup3;&ouml;&sup2;&atilde;&Ouml;&Aacute;&Ograve;&thorn;&sup2;&atilde;&micro;&Auml;&Egrave;¨&Ouml;&micro;&micro;÷&Otilde;&ucirc;&iexcl;&cent;&Ecirc;&auml;&sup3;&ouml;&sup2;&atilde;&atilde;&ETH;&Ouml;&micro;&micro;÷&Otilde;&ucirc;&frac14;&AElig;&Euml;&atilde;×&Oacute;&sup3;&Igrave;&ETH;ò//////<br/>void CBpNetWork::AdjustWeightAndThresholdOutLayToHideLay(int m, FILE * fp)<br/>{<br/>&nbsp;for (int k=0;k&lt;m_nOutputNetNumber;k++)<br/>&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp; for (int j=0;j&lt;m_nHideNetNumber;j++)<br/>&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp; m_npHideToOutputWeightMatrix+=*m_npAlpha*m_fpD_Err*m_npHideOutputValue;//&Ecirc;&auml;&sup3;&ouml;&sup2;&atilde;&Ouml;&Aacute;&Ograve;&thorn;&sup2;&atilde;&micro;&Auml;&Egrave;¨&Ouml;&micro;&micro;÷&Otilde;&ucirc;<br/>&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp; m_npOutputLayerThreshold+=*m_npAlpha*m_fpD_Err;//&Ecirc;&auml;&sup3;&ouml;&sup2;&atilde;&Ouml;&Aacute;&Ograve;&thorn;&sup2;&atilde;&micro;&Auml;&atilde;&ETH;&Ouml;&micro;&micro;÷&Otilde;&ucirc;<br/>&nbsp;} <br/>}<br/>//m_nLearningSampleNumber&cedil;&ouml;&Ntilde;ù±&frac34;&micro;&Auml;&Egrave;&laquo;&frac34;&Ouml;&Icirc;ó&sup2;&icirc;&frac14;&AElig;&Euml;&atilde;×&Oacute;&sup3;&Igrave;&ETH;ò////<br/>double CBpNetWork::GlobalErrSum()<br/>{<br/>&nbsp;double total_err=0;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int m=0;m&lt;m_nLearningSampleNumber;m++) <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; total_err+=m_npTotalErrofM;//&Atilde;&iquest;&cedil;&ouml;&Ntilde;ù±&frac34;&micro;&Auml;&frac34;ù·&frac12;&Icirc;ó&sup2;&icirc;&frac14;&Oacute;&AElig;&eth;&Agrave;&acute;&frac34;&Iacute;&sup3;&Eacute;&Aacute;&Euml;&Egrave;&laquo;&frac34;&Ouml;&Icirc;ó&sup2;&icirc;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return total_err;<br/>}<br/>&nbsp;//&Ograve;&thorn;&sup2;&atilde;&Ouml;&Aacute;&Ecirc;&auml;&Egrave;&euml;&sup2;&atilde;&micro;&Auml;&Egrave;¨&Ouml;&micro;&micro;÷&Otilde;&ucirc;&iexcl;&cent;&Ograve;&thorn;&sup2;&atilde;&atilde;&ETH;&Ouml;&micro;&micro;÷&Otilde;&ucirc;&frac14;&AElig;&Euml;&atilde;×&Oacute;&sup3;&Igrave;&ETH;ò/////<br/>void CBpNetWork::AdjustWeightAndThresholdHideLayToOutLay(int m,FILE * fp)<br/>{<br/>for (int j=0;j&lt;m_nHideNetNumber;j++)<br/>&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i=0;i&lt;m_nInputNetNumber;i++)<br/>&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //cout&lt;&lt;"&micro;&Uacute;"&lt; fprintf(fp,"&micro;&Uacute;%d&cedil;&ouml;&Ntilde;ù±&frac34;&Ecirc;±&micro;&Auml;&Ecirc;&auml;&sup3;&ouml;&sup2;&atilde;&Ouml;&Aacute;&Ograve;&thorn;&sup2;&atilde;&micro;&Auml;&Egrave;¨&Ouml;&micro;&Icirc;&ordf;&pound;&ordm;%f\n",m,m_npHideToOutputWeightMatrix);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_npInputToHideWeightMatrix+=*m_npBeta*m_fpE_Err*m_fpSingleInputSample;//&Ograve;&thorn;&sup2;&atilde;&Ouml;&Aacute;&Ecirc;&auml;&Egrave;&euml;&sup2;&atilde;&micro;&Auml;&Egrave;¨&Ouml;&micro;&micro;÷&Otilde;&ucirc;<br/>&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_npHideLayerThreshold+=*m_npBeta*m_fpE_Err;<br/>&nbsp;}<br/>}</p><p>void CBpNetWork::Excute(Study_Data_T * spl, double err, int count)<br/>{<br/>&nbsp;double temp_err = 0;<br/>&nbsp;int local_count =0;<br/>&nbsp;FILE * f;<br/>&nbsp;if(count == 0)<br/>&nbsp;&nbsp;count = 1000;<br/>&nbsp;if(!spl)<br/>&nbsp;&nbsp;return;<br/>&nbsp;f = fopen("c:\\ err.txt","a+");<br/>&nbsp;do<br/>&nbsp;{<br/>&nbsp;Tarning(spl);<br/>&nbsp;temp_err = GlobalErrSum();</p><p>&nbsp;fprintf(f," %d, %f ",local_count, temp_err);<br/>&nbsp;temp_err = sqrt(temp_err/m_nLearningSampleNumber);<br/>&nbsp;local_count++;<br/>&nbsp;}while(temp_err&gt;err);//&amp;&amp;local_count&lt;count);<br/>&nbsp;fprintf(f,"\n");<br/>&nbsp;fclose(f);<br/>&nbsp;f = fopen("c:\\ weight.txt","a+");<br/>&nbsp;for(int i =0;i&lt;m_nHideNetNumber*m_nInputNetNumber;i++)<br/>&nbsp;fprintf(f," %f ",m_npInputToHideWeightMatrix);<br/>&nbsp;fprintf(f,"\n\n");<br/>&nbsp;for (i = 0; i&lt;m_nOutputNetNumber*m_nHideNetNumber;i++)<br/>&nbsp;fprintf(f,"%f",m_npHideToOutputWeightMatrix);<br/>&nbsp;fprintf(f,"\n\n");<br/>&nbsp;fclose(f);<br/>}</p><p>void CBpNetWork::Tarning(Study_Data_T * spl)<br/>{<br/>&nbsp;&nbsp;int i = 0;<br/>&nbsp;&nbsp;Study_Data_T * tlnspl =spl;<br/>&nbsp;&nbsp;Study_Data_T * ttnspl =spl;<br/>&nbsp;for(;tlnspl != NULL&amp;&amp; ttnspl != NULL &amp;&amp; i&lt;m_nLearningSampleNumber*m_nInputNetNumber;i++)<br/>&nbsp;{<br/>&nbsp;&nbsp;InputOfNoMSampleData(0, tlnspl);<br/>&nbsp;&nbsp;InputOfNoMTrainingData(0, ttnspl);<br/>&nbsp;&nbsp;HideLayInOut();<br/>&nbsp;&nbsp;OutLayInOut();<br/>&nbsp;&nbsp;NormalizeErrOutLayToHideLay(0);<br/>&nbsp;&nbsp;NormalizeErrHideLayToOutLay();<br/>&nbsp;&nbsp;AdjustWeightAndThresholdOutLayToHideLay(0,NULL);<br/>&nbsp;&nbsp;AdjustWeightAndThresholdHideLayToOutLay(0,NULL);<br/>&nbsp;}<br/>}</p><p>void CBpNetWork::Set(double * pointer, int num)<br/>{<br/>int i =0;<br/>for(;i&lt;num;i++)<br/>pointer = 0;<br/>}</p><p>void CBpNetWork::Predict(int m, Study_Data_T *PresentData)<br/>{<br/>InputOfNoMSampleData(m,&nbsp; PresentData);<br/>HideLayInOut();<br/>OutLayInOut();<br/>}<br/></p><p>&nbsp;</p><p>&nbsp;</p><p>//head file</p><p>// BpNetWork.h: interface for the CBpNetWork class.<br/>//<br/>//////////////////////////////////////////////////////////////////////</p><p>#if !defined(AFX_BPNETWORK_H__2FDDE314_11F6_4D49_A046_C42B29C3754D__INCLUDED_)<br/>#define AFX_BPNETWORK_H__2FDDE314_11F6_4D49_A046_C42B29C3754D__INCLUDED_</p><p>#if _MSC_VER &gt; 1000<br/>#pragma once<br/>#endif // _MSC_VER &gt; 1000</p><p>&nbsp;</p><p><br/>#include "math.h"</p><p><br/>typedef&nbsp;struct Study_Data_S <br/>&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;double *input;<br/>&nbsp;&nbsp;&nbsp;&nbsp;double *teach;<br/>&nbsp;&nbsp;&nbsp;&nbsp;} Study_Data_T;<br/>class CBpNetWork&nbsp; <br/>{<br/>public://&Ecirc;&auml;&sup3;&ouml;&sup2;&atilde;&Ouml;&Aacute;&Ograve;&thorn;&sup2;&atilde;&micro;&Auml;&Ograve;&raquo;°&atilde;&raquo;&macr;&Icirc;ó&sup2;&icirc;×&Oacute;&sup3;&Igrave;&ETH;ò////<br/>&nbsp;void Predict(int m, Study_Data_T *PresentData);</p><p>&nbsp;void Tarning(Study_Data_T * spl);<br/>&nbsp;void Excute(Study_Data_T * spl, double err, int count);<br/>&nbsp;void AdjustWeightAndThresholdHideLayToOutLay(int m, FILE * fp);<br/>&nbsp;double GlobalErrSum();<br/>&nbsp;void AdjustWeightAndThresholdOutLayToHideLay(int m, FILE * fp);<br/>&nbsp;void NormalizeErrHideLayToOutLay();<br/>&nbsp;void NormalizeErrOutLayToHideLay(int m);<br/>&nbsp;void OutLayInOut();<br/>&nbsp;void HideLayInOut();<br/>&nbsp;void InputOfNoMSampleData(int m,Study_Data_T * lnspl);<br/>&nbsp;void InputOfNoMTrainingData(int m,Study_Data_T * lnspl);<br/>&nbsp;bool Init();<br/>&nbsp;CBpNetWork(int LearningSplNum, int OutLayNumber,int HideLayNumber,int inLayNum);</p><p>&nbsp;double* m_npBeta;//&Ograve;&thorn;&sup2;&atilde;&Ouml;&Aacute;&Ecirc;&auml;&Egrave;&euml;&sup2;&atilde;&Ntilde;§&Iuml;°&ETH;§&Acirc;&Ecirc;<br/>&nbsp;double* m_npAlpha;//&Ecirc;&auml;&sup3;&ouml;&sup2;&atilde;&Ouml;&Aacute;&Ograve;&thorn;&sup2;&atilde;&micro;&Auml;&Ntilde;§&Iuml;°&ETH;§&Acirc;&Ecirc;<br/>&nbsp;double* m_npTotalErrofM;//&micro;&Uacute;m&cedil;&ouml;&Ntilde;ù±&frac34;&micro;&Auml;×&Uuml;&Icirc;ó&sup2;&icirc;<br/>&nbsp;double* m_npOutputLayerThreshold;//&Ecirc;&auml;&sup3;&ouml;&sup2;&atilde;&micro;&Auml;&atilde;&ETH;&Ouml;&micro;<br/>&nbsp;double* m_npHideLayerThreshold;//&Ograve;&thorn;&sup2;&atilde;&micro;&Auml;&atilde;&ETH;&Ouml;&micro;<br/>&nbsp;double* m_npOutputLayerOutputValue;//&Ecirc;&auml;&sup3;&ouml;&sup2;&atilde;&micro;&Auml;&Ecirc;&auml;&sup3;&ouml;<br/>&nbsp;double* m_npHideOutputValue;//&Ograve;&thorn;&sup2;&atilde;&micro;&Auml;&Ecirc;&auml;&sup3;&ouml;<br/>&nbsp;double* m_npOutputLayerInputValue;//&Ecirc;&auml;&sup3;&ouml;&sup2;&atilde;&micro;&Auml;&Ecirc;&auml;&Egrave;&euml;<br/>&nbsp;double* m_npHideInputValue;//&Ograve;&thorn;&sup2;&atilde;&micro;&Auml;&Ecirc;&auml;&Egrave;&euml;<br/>&nbsp;double* m_npHideToOutputWeightMatrix;//&Ograve;&thorn;&sup2;&atilde;&Ouml;&Aacute;&Ecirc;&auml;&sup3;&ouml;&sup2;&atilde;&Egrave;¨&Ouml;&micro;<br/>&nbsp;double* m_npInputToHideWeightMatrix;//&Ecirc;&auml;&Egrave;&euml;&sup2;&atilde;&Ouml;&Aacute;&Ograve;&thorn;&sup2;&atilde;&Egrave;¨&Ouml;&micro;<br/>&nbsp;double* m_fpSingleTrainingSample;//&micro;&yen;&cedil;&ouml;&Ntilde;ù±&frac34;&frac12;&Igrave;&Ecirc;&brvbar;&Ecirc;&yacute;&frac34;&Yacute;<br/>&nbsp;double* m_fpSingleInputSample;//&micro;&yen;&cedil;&ouml;&Ntilde;ù±&frac34;&Ecirc;&auml;&Egrave;&euml;&Ecirc;&yacute;&frac34;&Yacute;<br/>&nbsp;double* m_fpInput;<br/>&nbsp;double* m_fpTeach;<br/>&nbsp;double* m_fpD_Err;<br/>&nbsp;double* m_fpE_Err;<br/>&nbsp;double* m_fpAbsErrValBefore;<br/>&nbsp;Study_Data_T *m_spStudy_Data;</p><p>&nbsp;CBpNetWork();<br/>&nbsp;virtual ~CBpNetWork();</p><p>private:<br/>&nbsp;void Set(double*,int );<br/>&nbsp;int m_nLearningSampleNumber;//&Ntilde;§&Iuml;°&Ntilde;ù±&frac34;&cedil;&ouml;&Ecirc;&yacute;<br/>&nbsp;int m_nOutputNetNumber;//&Ecirc;&auml;&Egrave;&euml;&sup2;&atilde;&Eacute;&ntilde;&frac34;&shy;&Ocirc;&ordf;&Ecirc;&yacute;&Auml;&iquest;<br/>&nbsp;int m_nHideNetNumber;//&Ograve;&thorn;&sup2;&atilde;&Eacute;&ntilde;&frac34;&shy;&Ocirc;&ordf;&Ecirc;&yacute;&Auml;&iquest;<br/>&nbsp;int m_nInputNetNumber;//&Ecirc;&auml;&sup3;&ouml;&sup2;&atilde;&Eacute;&ntilde;&frac34;&shy;&Ocirc;&ordf;&Ecirc;&yacute;&Auml;&iquest;<br/>};</p><p>#endif // !defined(AFX_BPNETWORK_H__2FDDE314_11F6_4D49_A046_C42B29C3754D__INCLUDED_)<br/></p>
页: [1]
查看完整版本: 改写的C++BP类 未测试