⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hm02_a.m

📁 神经网络学习算法代码。Matlab 程序用于训练神经网络来预估系统下一步的输出值。
💻 M
字号:
% 文件名: hm02_a.m

% Matlab 程序用于训练神经网络来预估系统下一步的输出值
% 任务:
% (1) 训练 NN
% (2) 预估系统下一步的输出值.
% (3) 保证训练后NN达到质量要求.
% 求出给定系统的真实输出值.




% 定义已知系统参数

a1=0.8;
a2=0.5;
a3=1.0;
b1=0.5;
b2=-0.5;

% 设定输入输出初始值.

yt1=1.0;
ut1=1.0;

% 对所有的连接权设置初始值.

ww1=0.95;%%%%%%%%%%%%%%%%%%%%%%%%    连接权初始值
ww2=0.95;
ww3=0.95;
ww4=0.95;
ww5=0.95;
ww6=0.95;
% 选择学习率和Sigmoid函数(双曲正切函数)的常数.

c=0.85;  %%%%%%%%%%%%%%%%%%%    学习率

k1=1;
k2=1;
k3=1;

d1=1;
d2=1;
d3=1;

% 循环用来创建数据.

for t=1:500;
    u(t)=1.0954*(rand(1)-0.5);  % 建立输入数据

    e(t)=0.2*randn(1);          % 建立误差数据

 % 相对应的输出数据

    y(t)=( (a1+b1*ut1*ut1)*yt1 + ut1*ut1*ut1 +a2*(a2+b2*ut1*ut1)*e(t) )/(a3+ut1+ut1*ut1) + e(t);

% 对于隐藏层的作用函数.

    h1(t)=yt1*ww3 + ut1*ww6;
    h2(t)=ut1*ww4 + yt1*ww5;

% Sigmoid 双曲正切函数.

    sh1(t)=k1*( 2.0/( 1.0 + exp( -d1*h1(t) ) ) - 1.0 );
    sh2(t)=k2*( 2.0/( 1.0 + exp( -d2*h2(t) ) ) - 1.0 );

% 由 sh1(t) 和 sh2(t) 分别对 h1(t) 和 h2(t) 求导.

    dsh1(t)=-k1*2.0*d1*exp( -d1*h1(t) ) / ( 1.0 + exp( -d1*h1(t) ) )^2;
    dsh2(t)=-k2*2.0*d2*exp( -d2*h2(t) ) / ( 1.0 + exp( -d2*h2(t) ) )^2;

% 输出层的输出.

    y1(t)=sh1(t)*ww1 + sh2(t)*ww2;
    sy1(t)=k3*( 2.0/(1.0 + exp(-d3*y1(t)) ) - 1.0 );

% 由 sy1(t) 对 y1(t) 求导.

    dsy1(t)=-k3*2.0*d3*exp( -d3*y1(t) ) / ( 1.0+exp( -d3*y1(t) ) )^2;

% 基于上次值, 更新6个连接权值, 即实现BP算法.

    w1(t)=ww1 + c*( y(t)-sy1(t) )*dsy1(t)*sh1(t);
    w2(t)=ww2 + c*( y(t)-sy1(t) )*dsy1(t)*sh2(t);

    w3(t)=ww3 + c*( y(t)-sy1(t) )*dsy1(t)*ww1*dsh1(t)*yt1;
    w4(t)=ww4 + c*( y(t)-sy1(t) )*dsy1(t)*ww2*dsh2(t)*ut1;

    w5(t)=ww5 + c*( y(t)-sy1(t) )*dsy1(t)*ww2*dsh2(t)*yt1;
    w6(t)=ww6 + c*( y(t)-sy1(t) )*dsy1(t)*ww1*dsh1(t)*ut1;

% 更新输入输出, 以及6个连接权.

    ut1=u(t);
    yt1=y(t);

    if (t==500)  % 500次循环时, 显示连接权变化.
        delta_ww1=w1(t)-ww1
        delta_ww2=w2(t)-ww2
        delta_ww3=w3(t)-ww3
        delta_ww4=w4(t)-ww4
        delta_ww5=w5(t)-ww5
        delta_ww6=w6(t)-ww6


    end;

   ww1=w1(t);
   ww2=w2(t);
    ww3=w3(t);
    ww4=w4(t);
    ww5=w5(t);
    ww6=w6(t);


end; % 结束 for=1:500 循环.

ww1
ww2
ww3
ww4
ww5
ww6

figure(1);

t=1:500;
plot (t,y(t),t,sy1(t),':')
title ('Comparison between y(t) and sy1(t) during training')
xlabel ('Iteration t')
ylabel ('y(t), sy1(t)')

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -