elman神经网络matlab源码

clc
clear all
close all
%数据标准化,求均值mean,方差std.

x=[-0.4:0.04:5.6];
y=sin(x);%y=8+2*exp(1-x.^2).*cos(2*pi*x);
y2=[-0.389418342308651,-0.352274233275090,-0.314566560616118,-0.276355648564114,-0.237702626427135,-0.198669330795061,-0.159318206614246,-0.119712207288919,-0.0799146939691727,-0.0399893341866342,0,0.0399893341866341,0.0799146939691727,0.119712207288919,0.159318206614246,0.198669330795061,0.237702626427135,0.276355648564114,0.314566560616118,0.352274233275090,0.389418342308651,0.425939465066000,0.461779175541483,0.496880137843737,0.531186197920883,0.564642473395035,0.597195441362392,0.628793024018469,0.659384671971473,0.688921445110551,0.717356090899523,0.744643119970859,0.770738878898969,0.795601620036366,0.819191568300998,0.841470984807897,0.862404227243338,0.881957806884948,0.900100442176505,0.916803108771767,0.932039085967226,0.945783999449539,0.958015860289225,0.968715100118265,0.977864602435316,0.985449729988460,0.991458348191686,0.995880844537640,0.998710143975583,0.999941720229966,0.999573603041505,0.997606381319174,0.994043202198076,0.988889766004702,0.982154317137619,0.973847630878195,0.963982996152448,0.952576194271595,0.939645473685325,0.925211520788168,0.909297426825682,0.891928650953380,0.873132979507516,0.852940481552876,0.831383460778683,0.808496403819590,0.784315925084420,0.758880708180922,0.732231444030251,0.704410765770176,0.675463180551151,0.645434998334371,0.614374257805712,0.582330649524082,0.549355436427127,0.515501371821465,0.480822614988649,0.445374644541872,0.409214169672018,0.372399039425056,0.334988150155906,0.297041351306833,0.258619349661111,0.219783612225117,0.180596267894233,0.141120008059868,0.101417986316602,0.0615537174299136,0.0215909757260964,-0.0184063069330534,-0.0583741434275796,-0.0982485937451083,-0.137965867271227,-0.177462424840860,-0.216675080387379,-0.255541102026831,-0.293998312415567,-0.331985188220734,-0.369440958544477,-0.406305702144416,-0.442520443294852,-0.478027246135343,-0.512769307355724,-0.546691047069287,-0.579738197728743,-0.611857890942719,-0.642998742053909,-0.673110932343562,-0.702146288730805,-0.730058360839299,-0.756802495307928,-0.782335907226652,-0.806617748583241,-0.829609173611370,-0.851273400935575,-0.871575772413588,-0.890483808581988,-0.907967260616405,-0.923998158723188,-0.938550856885108,-0.951602073889516,-0.963130930573316,-0.973118983225174,-0.981550253091515,-0.988411251939131,-0.993691003633464,-0.997381061698093,-0.999475522827284,-0.999971036330025,-0.998866809490414,-0.996164608835841,-0.991868757310913,-0.985986127361670,-0.978526129941139,-0.969500699453809,-0.958924274663139,-0.946813775592609,-0.933188576457298,-0.918070474669267,-0.901483655966355,-0.883454655720154,-0.864012316485075,-0.843187741856417,-0.821014246711248,-0.797527303911705,-0.772764487555988,-0.746765412867813,-0.719571672820508,-0.691226771597127,-0.661776054993038,-0.631266637872322;];

HiddenUnitNum=15;    %隐节点数
InDim=1;             %输入样本维数
OutDim=1;            %输出样本维数%


MaxEpochs=20000;      %最大训练次数
Ir=0.006;             %学习率
E0=0;               %目标误差

W1=0.08*rand(HiddenUnitNum,InDim);       %输入层到隐层的初始权值
%B1=0.2*rand(HiddenUnitNum,1)-0.1;           %隐节点初始阈值
W2=0.08*rand(OutDim,HiddenUnitNum);      %隐层到输出层的初始权值
%B2=0.2*rand(OutDim,1)-0.1;                  %输出层初始阈值
W3=0.08*rand(HiddenUnitNum,HiddenUnitNum);
ErrHistory0=[];                              %记录权值调整后的训练误差
ErrHistory=[];
ErrHistory=[];
History=[]; 
Out=zeros(HiddenUnitNum,1);
tp=0;
a=0.4;
for i=1:MaxEpochs
   
    %正向计算网络各层输出
    for m=1:100 
      w=W1*x(m)+W3*Out ; 
    HiddenOut=logsig(w);
   
    NetWorkOut(m)=W2*HiddenOut;
     y1(m)=NetWorkOut(m);
    %判断训练是否停止, 
    Error=y(m)-NetWorkOut(m);
 
     %计算反向传播误差
    Delta2=Error;
    Delta1=W2'*Delta2.*HiddenOut.*(1-HiddenOut);
    %计算权值调整量
    dW1=Delta1*x(m)';
    dW2=Delta2*HiddenOut';
   dW3=Delta1*Out'+a*tp;
   
    %权值调整
    W1=W1+Ir*dW1;
    W2=W2+Ir*dW2;
    W3=W3+Ir*dW3;
     Out=HiddenOut+a*Out;
     tp=dW3;
  
    end
    SSE=sum(Error);
    if (mod(i,20)==0)
        pause(0.0001);
        plot(i,SSE,'b.-'),title('误差曲线图');
        hold on ;
        grid on;
    end
end
for i=1:100
   e0(i)=y1(i)-y2(i); %训练误差
end
figure (1) 
plot(x(1:100),y1(1:100),'r-',x(1:100),y(1:100),'b:')
legend('Elman拟合输出','函数实际输出','Location','NortheastOutside')
xlabel('输入值'),ylabel('输出')
figure (2) 
plot (x(1:100),e0,'r-')
ylabel('输出误差')


for m=101:151 
        w=W1*x(m)+W3*Out;
        HiddenOut=logsig(w);
    Out=HiddenOut+a*Out;
    NetWorkOut(m)=W2*HiddenOut;
     y3(m)= NetWorkOut(m);
    
end
    figure (3) 
plot(x(101:151),y3(101:151),'r-',x(101:151),y(101:151),'b:')
legend('Elman预测输出','函数实际输出','Location','NortheastOutside')
xlabel('输入值'),ylabel('输出')

for i=101:151
   e1(i)=-(y3(i)-y2(i))/y2(i); %实际误差
end
figure(4)
plot (e1,'r-')
ylabel('输出误差');

See Also