改写的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/> m_npBeta = new double;//Òþ²ãÖÁÊäÈë²ãѧϰЧÂÊ<br/> *m_npBeta = 0.2;<br/> m_npAlpha = new double;//Êä³ö²ãÖÁÒþ²ãµÄѧϰЧÂÊ<br/> *m_npAlpha = 0.2;<br/> m_npTotalErrofM = NULL;//µÚm¸öÑù±¾µÄ×ÜÎó²î<br/> m_npOutputLayerThreshold = NULL;//Êä³ö²ãµÄãÐÖµ<br/> m_npHideLayerThreshold = NULL;//Òþ²ãµÄãÐÖµ<br/> m_npOutputLayerOutputValue = NULL;//Êä³ö²ãµÄÊä³ö<br/> m_npHideOutputValue = NULL;//Òþ²ãµÄÊä³ö<br/> m_npOutputLayerInputValue = NULL;//Êä³ö²ãµÄÊäÈë<br/> m_npHideInputValue;//Òþ²ãµÄÊäÈë<br/> m_npHideToOutputWeightMatrix = NULL;//Òþ²ãÖÁÊä³ö²ãȨֵ<br/> m_npInputToHideWeightMatrix = NULL;//ÊäÈë²ãÖÁÒþ²ãȨֵ<br/> m_fpSingleTrainingSample = NULL;//µ¥¸öÑù±¾½ÌʦÊý¾Ý<br/> m_fpSingleInputSample = NULL;//µ¥¸öÑù±¾ÊäÈëÊý¾Ý<br/> m_fpE_Err = NULL;<br/> m_fpD_Err = NULL;<br/> m_fpInput = NULL;<br/> m_fpTeach = NULL;<br/> m_spStudy_Data = NULL;<br/> m_fpAbsErrValBefore =NULL;<br/> m_nLearningSampleNumber = 0;//ѧϰÑù±¾¸öÊý<br/> m_nOutputNetNumber = 0;//ÊäÈë²ãÉñ¾­ÔªÊýÄ¿<br/> m_nHideNetNumber = 0;//Òþ²ãÉñ¾­ÔªÊýÄ¿<br/> m_nInputNetNumber = 0;//Êä³ö²ãÉñ¾­ÔªÊýÄ¿<br/> Init();<br/>}</p><p>CBpNetWork::~CBpNetWork()<br/>{<br/> if(!m_npBeta) delete m_npBeta,m_npBeta = NULL;<br/> if(!m_npAlpha) delete m_npAlpha,m_npAlpha = NULL;<br/> if(!m_npTotalErrofM) delete m_npTotalErrofM, m_npTotalErrofM = NULL;<br/> if(!m_npOutputLayerThreshold) delete []m_npOutputLayerThreshold, m_npOutputLayerThreshold= NULL;<br/> if(!m_npHideLayerThreshold) delete[]m_npHideLayerThreshold, m_npHideLayerThreshold =NULL;<br/> if(!m_npOutputLayerOutputValue) delete[]m_npOutputLayerOutputValue,m_npOutputLayerOutputValue = NULL;<br/> if(!m_npHideOutputValue) delete []m_npHideOutputValue,m_npHideOutputValue=NULL;<br/> if(!m_npOutputLayerInputValue) delete []m_npOutputLayerInputValue,m_npOutputLayerInputValue= NULL;<br/> if(!m_npHideInputValue) delete []m_npHideInputValue, m_npHideInputValue = NULL;<br/> if(!m_npHideToOutputWeightMatrix) delete []m_npHideToOutputWeightMatrix, m_npHideToOutputWeightMatrix = NULL;<br/> if(!m_npInputToHideWeightMatrix) delete []m_npInputToHideWeightMatrix,m_npInputToHideWeightMatrix = NULL;<br/> if(!m_fpSingleTrainingSample) delete []m_fpSingleTrainingSample,m_fpSingleTrainingSample = NULL;<br/> if(!m_fpSingleInputSample) delete []m_fpSingleInputSample, m_fpSingleInputSample =NULL;<br/> if(!m_fpE_Err) delete []m_fpE_Err, m_fpE_Err =NULL;<br/> if(!m_fpD_Err) delete []m_fpD_Err, m_fpD_Err = NULL;<br/> if(!m_fpAbsErrValBefore) delete []m_fpAbsErrValBefore, m_fpAbsErrValBefore= NULL;<br/> Study_Data_T *p = m_spStudy_Data;<br/>for(int i = 0;i< m_nLearningSampleNumber;i++)<br/> for(int j = 0; j< m_nInputNetNumber; j++)<br/> {<br/> <br/> m_fpInput = m_spStudy_Data->input;<br/> m_fpTeach = m_spStudy_Data->teach;<br/> if(!m_fpInput) delete []m_fpInput, m_fpInput = NULL;<br/> if(!m_fpTeach) delete []m_fpTeach, m_fpTeach = NULL;<br/> m_spStudy_Data++;<br/> }<br/> delete []p;<br/>}</p><p><br/>CBpNetWork::CBpNetWork(int LearningSplNum, int OutLayNumber, int HideLayNumber, int inLayNum)<br/>{<br/> m_nLearningSampleNumber = LearningSplNum;<br/> m_nOutputNetNumber = OutLayNumber;<br/> m_nHideNetNumber = HideLayNumber;<br/> m_nInputNetNumber = inLayNum;<br/> Init();<br/>}<br/>//initial weight and threshold<br/>bool CBpNetWork::Init()<br/>{<br/> if(!m_nLearningSampleNumber||!m_nOutputNetNumber||!m_nHideNetNumber||!m_nInputNetNumber)<br/> return false;<br/> float sgn;<br/> float rnd;<br/> int i,j;<br/> m_npInputToHideWeightMatrix = new double ;<br/> m_npHideLayerThreshold = new double;<br/> m_npHideToOutputWeightMatrix = new double;<br/> m_fpSingleInputSample = new double;<br/> m_fpSingleTrainingSample = new double ;<br/> m_npHideInputValue = new double;<br/> m_npOutputLayerOutputValue = new double;<br/> m_npOutputLayerInputValue = new double;<br/> m_npHideLayerThreshold = new double;<br/> m_npOutputLayerThreshold = new double ;<br/> m_npTotalErrofM = new double;<br/> m_fpE_Err = new double;<br/> m_fpD_Err = new double;<br/> m_fpAbsErrValBefore = new double;</p><p> m_spStudy_Data = (Study_Data_T *)new double;<br/> for( i = 0;i< m_nLearningSampleNumber;i++)<br/> for( j = 0; j< m_nInputNetNumber; j++)<br/> {<br/> m_fpInput = new double;<br/> m_fpTeach = new double;<br/> m_spStudy_Data->input = m_fpInput;<br/> m_spStudy_Data->teach =m_fpTeach;<br/> m_spStudy_Data++;<br/> }<br/>//Òþ²ãȨ¡¢ãÐÖµ³õʼ»¯//<br/> for(j=0;j<m_nHideNetNumber;j++)<br/> for(i=0;i<m_nInputNetNumber;i++)<br/> {<br/> //sgn=pow((-1),random(100));<br/> sgn=(float)rand()/RAND_MAX ;<br/> rnd=sgn*(rand()%10);<br/> m_npInputToHideWeightMatrix= rnd/100;//Òþ²ãȨֵ³õʼ»¯¡£<br/> }<br/>//randomize();<br/> for(j=0;j<m_nHideNetNumber;j++)<br/> {<br/> //sgn=pow((-1),random(1000));<br/> sgn=(float)rand()/RAND_MAX ;<br/> rnd=sgn*(rand()%10);<br/> m_npHideLayerThreshold= rnd/1000;//Öмä²ããÐÖµ³õʼ»¯<br/> }<br/> //Êä³ö²ãȨ¡¢ãÐÖµ³õʼ»¯//<br/> //randomize();<br/> for (int k=0;k<m_nOutputNetNumber;k++)<br/> for (int j=0;j<m_nHideNetNumber;j++) <br/> {<br/> //sgn=pow((-1),random(1000));<br/> sgn=(float)rand()/RAND_MAX ;<br/> rnd=sgn*(rand()%10);<br/> m_npHideToOutputWeightMatrix=rnd/100;//µÚm¸öÑù±¾Êä³ö²ãȨֵ³õʼ»¯<br/> }<br/> //randomize();<br/> for(k =0; k<m_nOutputNetNumber;k++)<br/> {<br/> //sgn=pow((-1),random(10));<br/> sgn=(float)rand()/RAND_MAX ;<br/> rnd=sgn*(rand()%10);<br/> m_npOutputLayerThreshold=rnd/10;//Êä³ö²ããÐÖµ³õʼ»¯<br/> }<br/> return true;</p><p><br/>}<br/>//input No. m Tarinning data <br/>void CBpNetWork::InputOfNoMTrainingData(int m,Study_Data_T * tnspl)<br/>{<br/> for (int k=0;k<m;k++)<br/> m_fpSingleTrainingSample=tnspl.teach;//Study_Data.m_fpTeach;<br/>}<br/>////µÚm¸öѧϰÑù±¾ÊäÈë×Ó³ÌÐò///<br/>void CBpNetWork::InputOfNoMSampleData(int m, Study_Data_T * lnspl)<br/>{<br/> for (int i=0;i<m_nInputNetNumber;i++)<br/> m_fpSingleInputSample= lnspl.input;//Study_Data.input;<br/> <br/>}<br/>//Òþ²ã¸÷µ¥ÔªÊäÈë¡¢Êä³öÖµ×Ó³ÌÐò///<br/>void CBpNetWork::HideLayInOut()<br/>{<br/> double sigma;<br/> int i,j;<br/> for (j=0;j<m_nHideNetNumber;j++)<br/> {<br/> sigma=0.0;<br/> for (i=0;i<m_nInputNetNumber;i++)<br/> sigma+=m_npInputToHideWeightMatrix*m_fpSingleInputSample;//ÇóÒþ²ãÄÚ»ý<br/> <br/> m_npHideInputValue=sigma - m_npHideLayerThreshold;//ÇóÒþ²ã¾»ÊäÈë<br/> m_npHideOutputValue=1.0/(1.0+exp(-m_npHideInputValue));//ÇóÒþ²ãÊä³ö<br/> }<br/> <br/>}<br/>//Êä³ö²ã¸÷µ¥ÔªÊäÈë¡¢Êä³öÖµ×Ó³ÌÐò///<br/>void CBpNetWork::OutLayInOut()<br/>{<br/> double sigma;<br/> for (int k=0;k<m_nOutputNetNumber;k++)<br/> {<br/> sigma=0.0;<br/> for (int j=0;j<m_nHideNetNumber;j++)<br/> sigma+=m_npHideToOutputWeightMatrix*m_npHideOutputValue;//ÇóÊä³ö²ãÄÚ»ý<br/> <br/> m_npOutputLayerInputValue=sigma-m_npOutputLayerThreshold; //ÇóÊä³ö²ã¾»ÊäÈë<br/> m_npOutputLayerOutputValue=1.0/(1.0+exp(-m_npOutputLayerInputValue));//ÇóÊä³ö²ãÊä³ö<br/> }<br/> <br/>}<br/>//Êä³ö²ãÖÁÒþ²ãµÄÒ»°ã»¯Îó²î×Ó³ÌÐò////<br/>void CBpNetWork::NormalizeErrOutLayToHideLay(int m)<br/>{<br/> double *abs_err = new double;<br/> //double abs_err;//ÿ¸öÑù±¾µÄ¾ø¶ÔÎó²î¶¼ÊÇ´Ó0¿ªÊ¼µÄ<br/> double sqr_err=0;//ÿ¸öÑù±¾µÄƽ·½Îó²î¼ÆËã¶¼ÊÇ´Ó0¿ªÊ¼µÄ<br/> //for (int output=0;output<m_nOutputNetNumber;output++) //output???<br/> for (int k=0;k<m_nOutputNetNumber;k++)<br/> {<br/> abs_err=m_fpSingleTrainingSample-m_npOutputLayerOutputValue;<br/> if(abs_err == 0)<br/> abs_err = 0.00001;<br/> //¸ù¾ÝÎó²î¸Ä±äѧϰЧÂÊ<br/> if(abs_err>m_fpAbsErrValBefore)<br/> {<br/> *m_npAlpha += (abs_err/(abs_err+m_fpAbsErrValBefore))**m_npAlpha;<br/> *m_npBeta += (abs_err/(abs_err+m_fpAbsErrValBefore))**m_npBeta;<br/> }<br/> else <br/> {<br/> *m_npAlpha -= (abs_err/(abs_err+m_fpAbsErrValBefore))**m_npAlpha;<br/> *m_npBeta -= (abs_err/(abs_err+m_fpAbsErrValBefore))**m_npBeta;<br/> }<br/> m_fpAbsErrValBefore = abs_err;<br/> //ÇóµÚm¸öÑù±¾ÏµĵÚk¸öÉñ¾­ÔªµÄ¾ø¶ÔÎó²î<br/> sqr_err+=(abs_err)*(abs_err);//ÇóµÚm¸öÑù±¾ÏÂÊä³ö²ãµÄƽ·½Îó²î<br/> m_fpD_Err=abs_err*m_npOutputLayerOutputValue*(1.0-m_npOutputLayerOutputValue);//d_errÊä³ö²ã¸÷Éñ¾­ÔªµÄÒ»°ã»¯Îó²î<br/> }<br/> m_npTotalErrofM=sqr_err/2;//µÚm¸öÑù±¾ÏÂÊä³ö²ãµÄƽ·½Îó²î/2=µÚm¸öÑù±¾µÄ¾ù·½Îó²î<br/> delete []abs_err;<br/>}</p><p>void CBpNetWork::NormalizeErrHideLayToOutLay()<br/>{<br/> double sigma;<br/> for (int j=0;j<m_nHideNetNumber;j++) <br/> {<br/> sigma=0.0;<br/> for (int k=0;k<m_nOutputNetNumber;k++) <br/> sigma=m_fpD_Err*m_npHideToOutputWeightMatrix;<br/> <br/> m_fpE_Err=sigma*exp(m_npHideOutputValue)/((1-exp(m_npHideOutputValue))*(1-exp(m_npHideOutputValue)));//Òþ²ã¸÷Éñ¾­ÔªµÄÒ»°ã»¯Îó²î<br/> }<br/>}<br/> //Êä³ö²ãÖÁÒþ²ãµÄȨֵµ÷Õû¡¢Êä³ö²ããÐÖµµ÷Õû¼ÆËã×Ó³ÌÐò//////<br/>void CBpNetWork::AdjustWeightAndThresholdOutLayToHideLay(int m, FILE * fp)<br/>{<br/> for (int k=0;k<m_nOutputNetNumber;k++)<br/> {<br/> for (int j=0;j<m_nHideNetNumber;j++)<br/> {<br/> m_npHideToOutputWeightMatrix+=*m_npAlpha*m_fpD_Err*m_npHideOutputValue;//Êä³ö²ãÖÁÒþ²ãµÄȨֵµ÷Õû<br/> }<br/> m_npOutputLayerThreshold+=*m_npAlpha*m_fpD_Err;//Êä³ö²ãÖÁÒþ²ãµÄãÐÖµµ÷Õû<br/> } <br/>}<br/>//m_nLearningSampleNumber¸öÑù±¾µÄÈ«¾ÖÎó²î¼ÆËã×Ó³ÌÐò////<br/>double CBpNetWork::GlobalErrSum()<br/>{<br/> double total_err=0;<br/> for (int m=0;m<m_nLearningSampleNumber;m++) <br/> total_err+=m_npTotalErrofM;//ÿ¸öÑù±¾µÄ¾ù·½Îó²î¼ÓÆðÀ´¾Í³ÉÁËÈ«¾ÖÎó²î <br/> return total_err;<br/>}<br/> //Òþ²ãÖÁÊäÈë²ãµÄȨֵµ÷Õû¡¢Òþ²ããÐÖµµ÷Õû¼ÆËã×Ó³ÌÐò/////<br/>void CBpNetWork::AdjustWeightAndThresholdHideLayToOutLay(int m,FILE * fp)<br/>{<br/>for (int j=0;j<m_nHideNetNumber;j++)<br/> {<br/> for (int i=0;i<m_nInputNetNumber;i++)<br/> {<br/> //cout<<"µÚ"< fprintf(fp,"µÚ%d¸öÑù±¾Ê±µÄÊä³ö²ãÖÁÒþ²ãµÄȨֵΪ£º%f\n",m,m_npHideToOutputWeightMatrix);<br/> m_npInputToHideWeightMatrix+=*m_npBeta*m_fpE_Err*m_fpSingleInputSample;//Òþ²ãÖÁÊäÈë²ãµÄȨֵµ÷Õû<br/> }<br/> m_npHideLayerThreshold+=*m_npBeta*m_fpE_Err;<br/> }<br/>}</p><p>void CBpNetWork::Excute(Study_Data_T * spl, double err, int count)<br/>{<br/> double temp_err = 0;<br/> int local_count =0;<br/> if(count == 0)<br/> count = 1000;<br/> if(!spl)<br/> return;<br/> do<br/> {<br/> Tarning(spl);<br/> temp_err = GlobalErrSum();<br/> local_count++;<br/> }while(temp_err>err&&local_count<count);<br/>}</p><p>void CBpNetWork::Tarning(Study_Data_T * spl)<br/>{<br/> int i = 0;<br/> Study_Data_T * tlnspl =spl;<br/> Study_Data_T * ttnspl =spl;<br/> for(;tlnspl != NULL&& ttnspl != NULL && i<m_nLearningSampleNumber*m_nInputNetNumber;tlnspl++,ttnspl++,i++)<br/> {<br/> InputOfNoMSampleData(i, tlnspl);<br/> InputOfNoMTrainingData(i, ttnspl);<br/> HideLayInOut();<br/> OutLayInOut();<br/> NormalizeErrOutLayToHideLay(i);<br/> NormalizeErrHideLayToOutLay();<br/> AdjustWeightAndThresholdOutLayToHideLay(i,NULL);<br/> AdjustWeightAndThresholdHideLayToOutLay(i,NULL);<br/> }<br/>}<br/></p><p> </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 > 1000<br/>#pragma once<br/>#endif // _MSC_VER > 1000</p><p> </p><p><br/>#include "math.h"</p><p><br/>typedef struct Study_Data_S {<br/> double *input;<br/> double *teach;<br/> } Study_Data_T;<br/>class CBpNetWork <br/>{<br/>public://Êä³ö²ãÖÁÒþ²ãµÄÒ»°ã»¯Îó²î×Ó³ÌÐò////</p><p> void Tarning(Study_Data_T * spl);<br/> void Excute(Study_Data_T * spl, double err, int count);<br/> void AdjustWeightAndThresholdHideLayToOutLay(int m, FILE * fp);<br/> double GlobalErrSum();<br/> void AdjustWeightAndThresholdOutLayToHideLay(int m, FILE * fp);<br/> void NormalizeErrHideLayToOutLay();<br/> void NormalizeErrOutLayToHideLay(int m);<br/> void OutLayInOut();<br/> void HideLayInOut();<br/> void InputOfNoMSampleData(int m,Study_Data_T * lnspl);<br/> void InputOfNoMTrainingData(int m,Study_Data_T * lnspl);<br/> bool Init();<br/> CBpNetWork(int LearningSplNum, int OutLayNumber,int HideLayNumber,int inLayNum);</p><p> double* m_npBeta;//Òþ²ãÖÁÊäÈë²ãѧϰЧÂÊ<br/> double* m_npAlpha;//Êä³ö²ãÖÁÒþ²ãµÄѧϰЧÂÊ<br/> double* m_npTotalErrofM;//µÚm¸öÑù±¾µÄ×ÜÎó²î<br/> double* m_npOutputLayerThreshold;//Êä³ö²ãµÄãÐÖµ<br/> double* m_npHideLayerThreshold;//Òþ²ãµÄãÐÖµ<br/> double* m_npOutputLayerOutputValue;//Êä³ö²ãµÄÊä³ö<br/> double* m_npHideOutputValue;//Òþ²ãµÄÊä³ö<br/> double* m_npOutputLayerInputValue;//Êä³ö²ãµÄÊäÈë<br/> double* m_npHideInputValue;//Òþ²ãµÄÊäÈë<br/> double* m_npHideToOutputWeightMatrix;//Òþ²ãÖÁÊä³ö²ãȨֵ<br/> double* m_npInputToHideWeightMatrix;//ÊäÈë²ãÖÁÒþ²ãȨֵ<br/> double* m_fpSingleTrainingSample;//µ¥¸öÑù±¾½ÌʦÊý¾Ý<br/> double* m_fpSingleInputSample;//µ¥¸öÑù±¾ÊäÈëÊý¾Ý<br/> double* m_fpInput;<br/> double* m_fpTeach;<br/> double* m_fpD_Err;<br/> double* m_fpE_Err;<br/> double * m_fpAbsErrValBefore;<br/> Study_Data_T *m_spStudy_Data;</p><p> CBpNetWork();<br/> virtual ~CBpNetWork();</p><p>private:<br/> int m_nLearningSampleNumber;//ѧϰÑù±¾¸öÊý<br/> int m_nOutputNetNumber;//ÊäÈë²ãÉñ¾­ÔªÊýÄ¿<br/> int m_nHideNetNumber;//Òþ²ãÉñ¾­ÔªÊýÄ¿<br/> int m_nInputNetNumber;//Êä³ö²ãÉñ¾­ÔªÊýÄ¿<br/>};</p><p>#endif // !defined(AFX_BPNETWORK_H__2FDDE314_11F6_4D49_A046_C42B29C3754D__INCLUDED_)<br/></p>测试通过的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/> m_npBeta = new double;//Òþ²ãÖÁÊäÈë²ãѧϰЧÂÊ<br/> *m_npBeta = 0.002;<br/> m_npAlpha = new double;//Êä³ö²ãÖÁÒþ²ãµÄѧϰЧÂÊ<br/> *m_npAlpha = 0.002;<br/> m_npTotalErrofM = NULL;//µÚm¸öÑù±¾µÄ×ÜÎó²î<br/> m_npOutputLayerThreshold = NULL;//Êä³ö²ãµÄãÐÖµ<br/> m_npHideLayerThreshold = NULL;//Òþ²ãµÄãÐÖµ<br/> m_npOutputLayerOutputValue = NULL;//Êä³ö²ãµÄÊä³ö<br/> m_npHideOutputValue = NULL;//Òþ²ãµÄÊä³ö<br/> m_npOutputLayerInputValue = NULL;//Êä³ö²ãµÄÊäÈë<br/> m_npHideInputValue;//Òþ²ãµÄÊäÈë<br/> m_npHideToOutputWeightMatrix = NULL;//Òþ²ãÖÁÊä³ö²ãȨֵ<br/> m_npInputToHideWeightMatrix = NULL;//ÊäÈë²ãÖÁÒþ²ãȨֵ<br/> m_fpSingleTrainingSample = NULL;//µ¥¸öÑù±¾½ÌʦÊý¾Ý<br/> m_fpSingleInputSample = NULL;//µ¥¸öÑù±¾ÊäÈëÊý¾Ý<br/> m_fpE_Err = NULL;<br/> m_fpD_Err = NULL;<br/> m_fpInput = NULL;<br/> m_fpTeach = NULL;<br/> m_spStudy_Data = NULL;<br/> m_fpAbsErrValBefore =NULL;<br/> m_nLearningSampleNumber = 10;//ѧϰÑù±¾¸öÊý<br/> m_nOutputNetNumber = 1;//ÊäÈë²ãÉñ¾­ÔªÊýÄ¿<br/> m_nHideNetNumber = 10;//Òþ²ãÉñ¾­ÔªÊýÄ¿<br/> m_nInputNetNumber = 1;//Êä³ö²ãÉñ¾­ÔªÊýÄ¿<br/> Init();<br/>}</p><p>CBpNetWork::~CBpNetWork()<br/>{<br/> if(m_npBeta!=NULL) delete m_npBeta,m_npBeta = NULL;<br/> if(NULL != m_npAlpha) delete m_npAlpha,m_npAlpha = NULL;<br/> if(NULL != m_npTotalErrofM) delete m_npTotalErrofM, m_npTotalErrofM = NULL;<br/> if(NULL != m_npOutputLayerThreshold) delete []m_npOutputLayerThreshold, m_npOutputLayerThreshold= NULL;<br/> if(NULL != m_npHideLayerThreshold) delete[]m_npHideLayerThreshold, m_npHideLayerThreshold =NULL;<br/> if(NULL != m_npOutputLayerOutputValue) delete[]m_npOutputLayerOutputValue,m_npOutputLayerOutputValue = NULL;<br/> if(NULL != m_npHideOutputValue) delete []m_npHideOutputValue,m_npHideOutputValue=NULL;<br/> if(NULL != m_npOutputLayerInputValue) delete []m_npOutputLayerInputValue,m_npOutputLayerInputValue= NULL;<br/> if(NULL != m_npHideInputValue) delete []m_npHideInputValue, m_npHideInputValue = NULL;<br/> if(NULL != m_npHideToOutputWeightMatrix) delete []m_npHideToOutputWeightMatrix, m_npHideToOutputWeightMatrix = NULL;<br/> if(NULL != m_npInputToHideWeightMatrix) delete []m_npInputToHideWeightMatrix,m_npInputToHideWeightMatrix = NULL;<br/> if(NULL != m_fpSingleTrainingSample) delete []m_fpSingleTrainingSample,m_fpSingleTrainingSample = NULL;<br/> if(NULL != m_fpSingleInputSample) delete []m_fpSingleInputSample, m_fpSingleInputSample =NULL;<br/> if(NULL != m_fpE_Err) delete []m_fpE_Err, m_fpE_Err =NULL;<br/> if(NULL != m_fpD_Err) delete []m_fpD_Err, m_fpD_Err = NULL;<br/> if(NULL != m_fpAbsErrValBefore) delete []m_fpAbsErrValBefore, m_fpAbsErrValBefore= NULL;<br/> Study_Data_T *p = m_spStudy_Data;<br/> <br/>for(int i = 0;i< m_nLearningSampleNumber;i++)<br/> for(int j = 0; j< m_nInputNetNumber; j++)<br/> {<br/> <br/> m_fpInput = m_spStudy_Data->input;<br/> m_fpTeach = m_spStudy_Data->teach;<br/> if(NULL != m_fpInput) delete []m_fpInput, m_fpInput = NULL;<br/> if(NULL != m_fpTeach) delete []m_fpTeach, m_fpTeach = NULL;<br/> m_spStudy_Data++;<br/> }<br/> delete []p;<br/>}</p><p><br/>CBpNetWork::CBpNetWork(int LearningSplNum, int OutLayNumber, int HideLayNumber, int inLayNum)<br/>{<br/> m_nLearningSampleNumber = LearningSplNum;<br/> m_nOutputNetNumber = OutLayNumber;<br/> m_nHideNetNumber = HideLayNumber;<br/> m_nInputNetNumber = inLayNum;<br/> Init();<br/>}<br/>//initial weight and threshold<br/>bool CBpNetWork::Init()<br/>{<br/> if(!m_nLearningSampleNumber||!m_nOutputNetNumber||!m_nHideNetNumber||!m_nInputNetNumber)<br/> return false;<br/> float sgn;<br/> float rnd;<br/> int i,j;<br/> m_npInputToHideWeightMatrix = new double ;<br/> Set(m_npInputToHideWeightMatrix,m_nHideNetNumber*m_nInputNetNumber);</p><p> m_npHideLayerThreshold = new double;<br/> Set(m_npHideLayerThreshold,m_nHideNetNumber);</p><p> m_npHideToOutputWeightMatrix = new double;<br/> Set(m_npHideToOutputWeightMatrix,m_nOutputNetNumber*m_nHideNetNumber);</p><p> m_fpSingleInputSample = new double;<br/> Set(m_fpSingleInputSample,m_nLearningSampleNumber);</p><p> m_fpSingleTrainingSample = new double ;<br/> Set(m_fpSingleTrainingSample,m_nOutputNetNumber);<br/> m_npHideInputValue = new double;<br/> Set(m_npHideInputValue,m_nHideNetNumber);</p><p> m_npOutputLayerOutputValue = new double;<br/> Set(m_npOutputLayerOutputValue,m_nOutputNetNumber);</p><p> m_npOutputLayerInputValue = new double;<br/> Set(m_npOutputLayerInputValue,m_nOutputNetNumber);</p><p> m_npHideLayerThreshold = new double;<br/> Set(m_npHideLayerThreshold,m_nHideNetNumber);</p><p> m_npOutputLayerThreshold = new double ;<br/> Set(m_npOutputLayerThreshold,m_nOutputNetNumber);</p><p> m_npTotalErrofM = new double;<br/> Set(m_npTotalErrofM,m_nLearningSampleNumber);</p><p> m_fpE_Err = new double;<br/> Set(m_fpE_Err,m_nHideNetNumber);</p><p> m_fpD_Err = new double;<br/> Set(m_fpD_Err,m_nOutputNetNumber);</p><p> m_fpAbsErrValBefore = new double;<br/> Set(m_fpAbsErrValBefore,m_nOutputNetNumber);</p><p> m_npHideOutputValue = new double;<br/> Set(m_npHideOutputValue,m_nHideNetNumber);</p><p> m_spStudy_Data = (Study_Data_T *)new double;<br/> for( i = 0;i< m_nLearningSampleNumber;i++)<br/> for( j = 0; j< m_nInputNetNumber; j++)<br/> {<br/> m_fpInput = new double;<br/> m_fpTeach = new double;<br/> m_spStudy_Data->input = m_fpInput;<br/> m_spStudy_Data->teach =m_fpTeach;<br/> m_spStudy_Data++;<br/> }<br/>//Òþ²ãȨ¡¢ãÐÖµ³õʼ»¯//<br/> for(j=0;j<m_nHideNetNumber;j++)<br/> for(i=0;i<m_nInputNetNumber;i++)<br/> {<br/> //sgn=pow((-1),random(100));<br/> sgn=(float)rand()/RAND_MAX ;<br/> rnd=sgn*(rand()%10);<br/> m_npInputToHideWeightMatrix= rnd/100;//Òþ²ãȨֵ³õʼ»¯¡£<br/> }<br/>//randomize();<br/> for(j=0;j<m_nHideNetNumber;j++)<br/> {<br/> //sgn=pow((-1),random(1000));<br/> sgn=(float)rand()/RAND_MAX;<br/> rnd=sgn*(rand()%10);<br/> m_npHideLayerThreshold= 0;//Öмä²ããÐÖµ³õʼ»¯<br/> }<br/> //Êä³ö²ãȨ¡¢ãÐÖµ³õʼ»¯//<br/> //randomize();<br/> for (int k=0;k<m_nOutputNetNumber;k++)<br/> for (int j=0;j<m_nHideNetNumber;j++) <br/> {<br/> //sgn=pow((-1),random(1000));<br/> sgn=(float)rand()/RAND_MAX ;<br/> rnd=sgn*(rand()%10);<br/> m_npHideToOutputWeightMatrix=rnd/100;//µÚm¸öÑù±¾Êä³ö²ãȨֵ³õʼ»¯<br/> }<br/> //randomize();<br/> for(k =0; k<m_nOutputNetNumber;k++)<br/> {<br/> //sgn=pow((-1),random(10));<br/> sgn=(float)rand()/RAND_MAX ;<br/> rnd=sgn*(rand()%10);<br/> m_npOutputLayerThreshold=0;//Êä³ö²ããÐÖµ³õʼ»¯<br/> }<br/> return true;</p><p><br/>}<br/>//input No. m Tarinning data <br/>void CBpNetWork::InputOfNoMTrainingData(int m,Study_Data_T * tnspl)<br/>{<br/> for (int k=0;k<m_nInputNetNumber;k++)<br/> m_fpSingleTrainingSample=tnspl.teach;//Study_Data.m_fpTeach;<br/>}<br/>////µÚm¸öѧϰÑù±¾ÊäÈë×Ó³ÌÐò///<br/>void CBpNetWork::InputOfNoMSampleData(int m, Study_Data_T * lnspl)<br/>{<br/> for (int i=0;i<m_nInputNetNumber;i++)<br/> m_fpSingleInputSample= lnspl.input;//Study_Data.input;<br/> <br/>}<br/>//Òþ²ã¸÷µ¥ÔªÊäÈë¡¢Êä³öÖµ×Ó³ÌÐò///<br/>void CBpNetWork::HideLayInOut()<br/>{<br/> double sigma;<br/> int i,j;<br/> for (j=0;j<m_nHideNetNumber;j++)<br/> {<br/> sigma=0.0;<br/> for (i=0;i<m_nInputNetNumber;i++)<br/> sigma+=m_npInputToHideWeightMatrix*m_fpSingleInputSample;//ÇóÒþ²ãÄÚ»ý<br/> <br/> m_npHideInputValue=sigma - m_npHideLayerThreshold;//ÇóÒþ²ã¾»ÊäÈë<br/> m_npHideOutputValue=1.0/(1.0+exp(-m_npHideInputValue));//ÇóÒþ²ãÊä³ö<br/> }<br/> <br/>}<br/>//Êä³ö²ã¸÷µ¥ÔªÊäÈë¡¢Êä³öÖµ×Ó³ÌÐò///<br/>void CBpNetWork::OutLayInOut()<br/>{<br/> double sigma;<br/> for (int k=0;k<m_nOutputNetNumber;k++)<br/> {<br/> sigma=0.0;<br/> for (int j=0;j<m_nHideNetNumber;j++)<br/> sigma+=m_npHideToOutputWeightMatrix*m_npHideOutputValue;//ÇóÊä³ö²ãÄÚ»ý<br/> <br/> m_npOutputLayerInputValue=sigma-m_npOutputLayerThreshold; //ÇóÊä³ö²ã¾»ÊäÈë<br/> m_npOutputLayerOutputValue=1.0/(1.0+exp(-m_npOutputLayerInputValue));//ÇóÊä³ö²ãÊä³ö<br/> }<br/> <br/>}<br/>//Êä³ö²ãÖÁÒþ²ãµÄÒ»°ã»¯Îó²î×Ó³ÌÐò////<br/>void CBpNetWork::NormalizeErrOutLayToHideLay(int m)<br/>{<br/> double *abs_err = new double;<br/> //double abs_err;//ÿ¸öÑù±¾µÄ¾ø¶ÔÎó²î¶¼ÊÇ´Ó0¿ªÊ¼µÄ<br/> double sqr_err=0;//ÿ¸öÑù±¾µÄƽ·½Îó²î¼ÆËã¶¼ÊÇ´Ó0¿ªÊ¼µÄ<br/> //for (int output=0;output<m_nOutputNetNumber;output++) //output???<br/> for (int k=0;k<m_nOutputNetNumber;k++)<br/> {<br/> abs_err=m_fpSingleTrainingSample-m_npOutputLayerOutputValue;<br/> if(abs_err == 0)<br/> abs_err = 0.0000001;<br/> //¸ù¾ÝÎó²î¸Ä±äѧϰЧÂÊ<br/>/* if(abs_err>m_fpAbsErrValBefore)<br/> {<br/> *m_npAlpha += (abs_err/(abs_err+m_fpAbsErrValBefore))**m_npAlpha;<br/> *m_npBeta += (abs_err/(abs_err+m_fpAbsErrValBefore))**m_npBeta;<br/> }<br/> else <br/> {<br/> *m_npAlpha -= (abs_err/(abs_err+m_fpAbsErrValBefore))**m_npAlpha;<br/> *m_npBeta -= (abs_err/(abs_err+m_fpAbsErrValBefore))**m_npBeta;<br/> }*/<br/> m_fpAbsErrValBefore = abs_err;<br/> //ÇóµÚm¸öÑù±¾ÏµĵÚk¸öÉñ¾­ÔªµÄ¾ø¶ÔÎó²î<br/> sqr_err+=(abs_err)*(abs_err);//ÇóµÚm¸öÑù±¾ÏÂÊä³ö²ãµÄƽ·½Îó²î<br/> m_fpD_Err=abs_err*m_npOutputLayerOutputValue*(1.0-m_npOutputLayerOutputValue);//d_errÊä³ö²ã¸÷Éñ¾­ÔªµÄÒ»°ã»¯Îó²î<br/> }<br/> m_npTotalErrofM=sqr_err/2;//µÚm¸öÑù±¾ÏÂÊä³ö²ãµÄƽ·½Îó²î/2=µÚm¸öÑù±¾µÄ¾ù·½Îó²î<br/> delete []abs_err;<br/>}</p><p>void CBpNetWork::NormalizeErrHideLayToOutLay()<br/>{<br/> double sigma;<br/> for (int j=0;j<m_nHideNetNumber;j++) <br/> {<br/> sigma=0.0;<br/> for (int k=0;k<m_nOutputNetNumber;k++) <br/> sigma=m_fpD_Err*m_npHideToOutputWeightMatrix;<br/> <br/> m_fpE_Err=sigma*exp(m_npHideOutputValue)/((1-exp(m_npHideOutputValue))*(1-exp(m_npHideOutputValue)));//Òþ²ã¸÷Éñ¾­ÔªµÄÒ»°ã»¯Îó²î<br/> }<br/>}<br/> //Êä³ö²ãÖÁÒþ²ãµÄȨֵµ÷Õû¡¢Êä³ö²ããÐÖµµ÷Õû¼ÆËã×Ó³ÌÐò//////<br/>void CBpNetWork::AdjustWeightAndThresholdOutLayToHideLay(int m, FILE * fp)<br/>{<br/> for (int k=0;k<m_nOutputNetNumber;k++)<br/> {<br/> for (int j=0;j<m_nHideNetNumber;j++)<br/> {<br/> m_npHideToOutputWeightMatrix+=*m_npAlpha*m_fpD_Err*m_npHideOutputValue;//Êä³ö²ãÖÁÒþ²ãµÄȨֵµ÷Õû<br/> }<br/> m_npOutputLayerThreshold+=*m_npAlpha*m_fpD_Err;//Êä³ö²ãÖÁÒþ²ãµÄãÐÖµµ÷Õû<br/> } <br/>}<br/>//m_nLearningSampleNumber¸öÑù±¾µÄÈ«¾ÖÎó²î¼ÆËã×Ó³ÌÐò////<br/>double CBpNetWork::GlobalErrSum()<br/>{<br/> double total_err=0;<br/> for (int m=0;m<m_nLearningSampleNumber;m++) <br/> total_err+=m_npTotalErrofM;//ÿ¸öÑù±¾µÄ¾ù·½Îó²î¼ÓÆðÀ´¾Í³ÉÁËÈ«¾ÖÎó²î <br/> return total_err;<br/>}<br/> //Òþ²ãÖÁÊäÈë²ãµÄȨֵµ÷Õû¡¢Òþ²ããÐÖµµ÷Õû¼ÆËã×Ó³ÌÐò/////<br/>void CBpNetWork::AdjustWeightAndThresholdHideLayToOutLay(int m,FILE * fp)<br/>{<br/>for (int j=0;j<m_nHideNetNumber;j++)<br/> {<br/> for (int i=0;i<m_nInputNetNumber;i++)<br/> {<br/> //cout<<"µÚ"< fprintf(fp,"µÚ%d¸öÑù±¾Ê±µÄÊä³ö²ãÖÁÒþ²ãµÄȨֵΪ£º%f\n",m,m_npHideToOutputWeightMatrix);<br/> m_npInputToHideWeightMatrix+=*m_npBeta*m_fpE_Err*m_fpSingleInputSample;//Òþ²ãÖÁÊäÈë²ãµÄȨֵµ÷Õû<br/> }<br/> m_npHideLayerThreshold+=*m_npBeta*m_fpE_Err;<br/> }<br/>}</p><p>void CBpNetWork::Excute(Study_Data_T * spl, double err, int count)<br/>{<br/> double temp_err = 0;<br/> int local_count =0;<br/> FILE * f;<br/> if(count == 0)<br/> count = 1000;<br/> if(!spl)<br/> return;<br/> f = fopen("c:\\ err.txt","a+");<br/> do<br/> {<br/> Tarning(spl);<br/> temp_err = GlobalErrSum();</p><p> fprintf(f," %d, %f ",local_count, temp_err);<br/> temp_err = sqrt(temp_err/m_nLearningSampleNumber);<br/> local_count++;<br/> }while(temp_err>err);//&&local_count<count);<br/> fprintf(f,"\n");<br/> fclose(f);<br/> f = fopen("c:\\ weight.txt","a+");<br/> for(int i =0;i<m_nHideNetNumber*m_nInputNetNumber;i++)<br/> fprintf(f," %f ",m_npInputToHideWeightMatrix);<br/> fprintf(f,"\n\n");<br/> for (i = 0; i<m_nOutputNetNumber*m_nHideNetNumber;i++)<br/> fprintf(f,"%f",m_npHideToOutputWeightMatrix);<br/> fprintf(f,"\n\n");<br/> fclose(f);<br/>}</p><p>void CBpNetWork::Tarning(Study_Data_T * spl)<br/>{<br/> int i = 0;<br/> Study_Data_T * tlnspl =spl;<br/> Study_Data_T * ttnspl =spl;<br/> for(;tlnspl != NULL&& ttnspl != NULL && i<m_nLearningSampleNumber*m_nInputNetNumber;i++)<br/> {<br/> InputOfNoMSampleData(0, tlnspl);<br/> InputOfNoMTrainingData(0, ttnspl);<br/> HideLayInOut();<br/> OutLayInOut();<br/> NormalizeErrOutLayToHideLay(0);<br/> NormalizeErrHideLayToOutLay();<br/> AdjustWeightAndThresholdOutLayToHideLay(0,NULL);<br/> AdjustWeightAndThresholdHideLayToOutLay(0,NULL);<br/> }<br/>}</p><p>void CBpNetWork::Set(double * pointer, int num)<br/>{<br/>int i =0;<br/>for(;i<num;i++)<br/>pointer = 0;<br/>}</p><p>void CBpNetWork::Predict(int m, Study_Data_T *PresentData)<br/>{<br/>InputOfNoMSampleData(m, PresentData);<br/>HideLayInOut();<br/>OutLayInOut();<br/>}<br/></p><p> </p><p> </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 > 1000<br/>#pragma once<br/>#endif // _MSC_VER > 1000</p><p> </p><p><br/>#include "math.h"</p><p><br/>typedef struct Study_Data_S <br/> {<br/> double *input;<br/> double *teach;<br/> } Study_Data_T;<br/>class CBpNetWork <br/>{<br/>public://Êä³ö²ãÖÁÒþ²ãµÄÒ»°ã»¯Îó²î×Ó³ÌÐò////<br/> void Predict(int m, Study_Data_T *PresentData);</p><p> void Tarning(Study_Data_T * spl);<br/> void Excute(Study_Data_T * spl, double err, int count);<br/> void AdjustWeightAndThresholdHideLayToOutLay(int m, FILE * fp);<br/> double GlobalErrSum();<br/> void AdjustWeightAndThresholdOutLayToHideLay(int m, FILE * fp);<br/> void NormalizeErrHideLayToOutLay();<br/> void NormalizeErrOutLayToHideLay(int m);<br/> void OutLayInOut();<br/> void HideLayInOut();<br/> void InputOfNoMSampleData(int m,Study_Data_T * lnspl);<br/> void InputOfNoMTrainingData(int m,Study_Data_T * lnspl);<br/> bool Init();<br/> CBpNetWork(int LearningSplNum, int OutLayNumber,int HideLayNumber,int inLayNum);</p><p> double* m_npBeta;//Òþ²ãÖÁÊäÈë²ãѧϰЧÂÊ<br/> double* m_npAlpha;//Êä³ö²ãÖÁÒþ²ãµÄѧϰЧÂÊ<br/> double* m_npTotalErrofM;//µÚm¸öÑù±¾µÄ×ÜÎó²î<br/> double* m_npOutputLayerThreshold;//Êä³ö²ãµÄãÐÖµ<br/> double* m_npHideLayerThreshold;//Òþ²ãµÄãÐÖµ<br/> double* m_npOutputLayerOutputValue;//Êä³ö²ãµÄÊä³ö<br/> double* m_npHideOutputValue;//Òþ²ãµÄÊä³ö<br/> double* m_npOutputLayerInputValue;//Êä³ö²ãµÄÊäÈë<br/> double* m_npHideInputValue;//Òþ²ãµÄÊäÈë<br/> double* m_npHideToOutputWeightMatrix;//Òþ²ãÖÁÊä³ö²ãȨֵ<br/> double* m_npInputToHideWeightMatrix;//ÊäÈë²ãÖÁÒþ²ãȨֵ<br/> double* m_fpSingleTrainingSample;//µ¥¸öÑù±¾½ÌʦÊý¾Ý<br/> double* m_fpSingleInputSample;//µ¥¸öÑù±¾ÊäÈëÊý¾Ý<br/> double* m_fpInput;<br/> double* m_fpTeach;<br/> double* m_fpD_Err;<br/> double* m_fpE_Err;<br/> double* m_fpAbsErrValBefore;<br/> Study_Data_T *m_spStudy_Data;</p><p> CBpNetWork();<br/> virtual ~CBpNetWork();</p><p>private:<br/> void Set(double*,int );<br/> int m_nLearningSampleNumber;//ѧϰÑù±¾¸öÊý<br/> int m_nOutputNetNumber;//ÊäÈë²ãÉñ¾­ÔªÊýÄ¿<br/> int m_nHideNetNumber;//Òþ²ãÉñ¾­ÔªÊýÄ¿<br/> int m_nInputNetNumber;//Êä³ö²ãÉñ¾­ÔªÊýÄ¿<br/>};</p><p>#endif // !defined(AFX_BPNETWORK_H__2FDDE314_11F6_4D49_A046_C42B29C3754D__INCLUDED_)<br/></p>
页:
[1]