AI实验讲义 联系客服

发布时间 : 星期六 文章AI实验讲义更新完毕开始阅读6eb7a8c5aa00b52acfc7ca7f

double CBpNet::randab(double a, double b)

{ //注意,如果应用矩阵库,头文件matlib.h对rand()函数重新定义,只产生(0,1) //之间的随机数

return((b-a)*rand()+a); }

//将数据转化到(0,1)区间 void CBpNet::normalize() {

int i,j;

//输入数据范围

mInputNormFactor=scope(mSampleInput); //目标数据范围

mTargetNormFactor=scope(mSampleTarget);

for(i=1;i<=mSampleInput.rows();i++) for(j=1;j<=mSampleInput.cols();j++)

mSampleInput.r(i,j)=(mSampleInput.r(i,j)-mInputNormFactor.r(j,1))/(mInputNormFactor.r(j,2)-mInputNormFactor.r(j,1));

for(i=1;i<=mSampleTarget.rows();i++) for(j=1;j<=mSampleTarget.cols();j++)

mSampleTarget.r(i,j)=(mSampleTarget.r(i,j)-mTargetNormFactor.r(j,1))/(mTargetNormFactor.r(j,2)-mTargetNormFactor.r(j,1)); }

//前向计算

void CBpNet::forward(int iSample) {//根据第iSample个样本,前向计算 if(iSample<1||iSample>mSampleInput.rows()){ MessageBox(NULL,\无此样本数据:索引出界!\无此样本数据:索引出界!\ return; } int i,j; double sum=0.0; //输入层数据 for(i=1;i<=iInput;i++) mInput.r(i)=mSampleInput.r(iSample,i);

37

//隐层数据 for(j=1;j<=iHidden;j++){ sum=0.0; for(i=1;i<=iInput;i++) sum+=mInput.r(i)*mWeighti.r(i,j); sum-=mThresholdi.r(j); mHidden.r(j)=1.0/(1.0+exp(-sum)); } //输出数据 for(j=1;j<=iOutput;j++){ sum=0.0; for(i=1;i<=iHidden;i++) sum+=mHidden.r(i)*mWeighto.r(i,j); sum-=mThresholdo.r(j); mOutput.r(j)=1.0/(1.0+exp(-sum)); } }

//后向反馈

void CBpNet::backward(int iSample) { if(iSample<1||iSample>mSampleInput.rows()){ MessageBox(NULL,\无此样本数据:索引出界!\无此样本数据:索引出界!\ return; } int i,j;

//输出误差 for(i=1;i<=iOutput;i++) mOutputDeltas.r(i)=mOutput.r(i)*(1-mOutput.r(i))*(mSampleTarget.r(iSample,i)-mOutput.r(i)); //隐层误差 double sum=0.0; for(j=1;j<=iHidden;j++){ sum=0.0; for(i=1;i<=iOutput;i++)

38

sum+=mOutputDeltas.r(i)*mWeighto.r(j,i); mHiddenDeltas.r(j)=mHidden.r(j)*(1-mHidden.r(j))*sum; } //更新隐层-输出权重 double dblChange; for(j=1;j<=iHidden;j++) for(i=1;i<=iOutput;i++){ dblChange=mOutputDeltas.r(i)*mHidden.r(j); mWeighto.r(j,i)=mWeighto.r(j,i)+dblLearnRate2*dblChange+dblMomentumFactor*mChangeo.r(j,i); mChangeo.r(j,i)=dblChange; } //更新输入-隐层权重 for(i=1;i<=iInput;i++) for(j=1;j<=iHidden;j++){ dblChange=mHiddenDeltas.r(j)*mInput.r(i);

mWeighti.r(i,j)=mWeighti.r(i,j)+dblLearnRate1*dblChange+dblMomentumFactor*mChangei.r(i,j); mChangei.r(i,j)=dblChange; } //修改阙值 for(j=1;j<=iOutput;j++) mThresholdo.r(j)-=dblLearnRate2*mOutputDeltas.r(j); for(i=1;i<=iHidden;i++) mThresholdi.r(i)-=dblLearnRate1*mHiddenDeltas.r(i); //计算误差 dblErr=0.0; for(i=1;i<=iOutput;i++) dblErr+=0.5*(mSampleTarget.r(iSample,i)-mOutput.r(i))*(mSampleTarget.r(iSample,i)-mOutput.r(i)); }

//求数据列的范围

Mm CBpNet::scope(Mm mData) {Mm mScope;

mScope=zeros(mData.cols(),2); double min,max;

39

for(int i=1;i<=mData.cols();i++){ min=max=mData.r(1,i); for(int j=1;j<=mData.rows();j++){ if(mData.r(j,i)>=max) max=mData.r(j,i); if(mData.r(j,i)<=min) min=mData.r(j,i); } if(min==max) min=0.0; mScope.r(i,1)=min; mScope.r(i,2)=max; }

return(mScope); }

//显示矩阵数据,方便调试 void CBpNet::display(Mm data) {CString strData,strTemp; int i=1,j=1;

for(i=1;i<=data.rows();i++){ for(j=1;j<=data.cols();j++){ strTemp.Format(\ strData+=strTemp; } strData=strData+\ }

::MessageBox(NULL,strData,\ }

void CBpNet::Serialize(CArchive &ar) {CObject::Serialize(ar); ///////////////////////////////////// if(ar.IsStoring()){ int i,j; double dblData; CString strTemp=\ ar<

40