% function main()
clc % 清屏
clear all; %清除内存以便加快运算速度
close all; %关闭当前所有figure图像
SamNum=321; %输入样本数量为321
TestSamNum=321; %测试样本数量也是321
HiddenUnitNum=8; %中间层隐节点数量取8
InDim=1; %网络输入维度为1
OutDim=1;
%原始数据
p=-8:0.05:8;
t=cos(p*pi);
%[SamIn,minp,maxp,tn,mint,maxt]=premnmx(p,t); %原始样本对(输入和输出)初始化
[SamIn,inputps]=mapminmax(p);
MaxEpochs=50000; %最多训练次数为50000
lr=0.01; %学习速率
E0=0.65*10^(-3); %目标误差为0.65*10^(-3)
W1=0.5*rands(HiddenUnitNum,InDim);
B1=0.5*rands(HiddenUnitNum,1); %[Q,1],b1为innum行,1列的矩阵,为神经元阈值
W2=0.5*rands(OutDim,HiddenUnitNum); %[R S],w2为HiddenUnitNum行,outnum列的矩阵,为层权值
B2=0.5*rands(OutDim,1); %[S,1],b2为outnum行,1列的矩阵,为层权值
ErrHistory=[]; %给中间变量预先占据内存
for i=1:MaxEpochs
HiddenOut=logsig(W1*SamIn+repmat(B1,1,SamNum)); % 隐含层网络输出
NetworkOut=W2*HiddenOut+repmat(B2,1,SamNum); % 输出层网络输出
Error=t-NetworkOut; % 实际输出与网络输出之差
SSE=sumsqr(Error); %能量函数(误差平方和)
ErrHistory=[ErrHistory SSE];
if SSE
% 以下六行是BP网络最核心的程序
% 他们是权值(阈值)依据能量函数负梯度下降原理所作的每一步动态调整量
Delta2=Error;
Delta1=W2'*Delta2.*HiddenOut.*(1-HiddenOut);
dW2=Delta2*HiddenOut';
dB2=Delta2*ones(SamNum,1);
dW1=Delta1*SamIn';
dB1=Delta1*ones(SamNum,1);
%对输出层与隐含层之间的权值和阈值进行修正
W2=W2+lr*dW2;
B2=B2+lr*dB2;
%对输入层与隐含层之间的权值和阈值进行修正
W1=W1+lr*dW1;
B1=B1+lr*dB1;
end
HiddenOut=logsig(W1*SamIn+repmat(B1,1,TestSamNum)); % 隐含层输出最终结果
NetworkOut=W2*HiddenOut+repmat(B2,1,TestSamNum); % 输出层输出最终结果
plot(t);
hold on
plot(NetworkOut,'r')