RBF网络的逼近实例详解

题目

采用RBF网络对如下模型进行逼近
G(s)= 133/(s^2+25s)
网络结构为2-5-1结构取x(1) = u(t),x(2) = 3(t-1),η=0.50,α=0.05,网络的初始权值取0到1之间的随机值。考虑到网络的第一个输入范围为[0,1],离线测试可得第二个输入范围为[0,10],取高斯基函数的参数取值为
在这里插入图片描述b_j = 1.5,j =1,2,3,4,5.
网络的第一个输入为u(k) = sint。仿真中,只调节权值w,取固定的c_j和b

解题思路

用于逼近的RBP网络如下图所示
在这里插入图片描述本题的模型结构
在这里插入图片描述通过这两张图我们可以得到权值为
w_j (t)=w_j (t-1) +Δw_j(t)+α(w_j (t-1)-w_j (t-2))

代码

chap_5.m(RBF网络程序)

function [sys,x0,str,ts] = s_function(t,x,u,flag)
switch flag,
case 0,
    [sys,x0,str,ts] = mdlInitializeSizes
case 3,
    sys = mdlOutputs(t,x,u);
case{2,4,9}
    sys = [];
otherwise
    error(['Unhandled flag = ',num2str(flag)]);
end
function [sys,x0,str,ts] = mdlInitializeSizes
sizes = simsizes;  %设置模块参数结构体
sizes.NumContStates =0;               %模块连续变量个数
sizes.NumDiscStates =0;      		  %模块离散变量个数
sizes.NumOutputs    =1;      		  %模块输出变量个数
sizes.NumInputs     =2;      		  %模块输入变量个数
sizes.DirFeedthrough=1;      		  %模块是否前后贯通,输入是否能直接控制输出
sizes.NumSampleTimes=0;      		  %模块采样时间
sys=simsizes(sizes);      		      %模块设置完成后传递给sys参数
x0 = [];
str = [];
ts = [];
function sys = mdlOutputs(t,x,u)
persistent  w w_1 w_2 b ci
xite = 0.50;
alfa = 0.05;
if t == 0
    b =1.5;
    ci = [-1 -0.5 0 0.5 1;
        -10 -5 0 5 10];
    w = rands(5,1);
    w_1 = w;
	w_2=w_1;
end
ut = u(1);
yout = u(2);
xi = [ut yout]';
for j = 1:1:5
    h(j) = exp(-norm(xi-ci(:,j))^2/(2*b^2));
end
ymout = w' * h';
d_w = 0*w;
for j = 1:1:5
    d_w(j) = xite *(yout - ymout)*h(j);
end
w = w_1 + d_w +alfa *(w_1 - w_2);
w_2 = w_1;
w_1 = w;
sys(1)=ymout;

chap_5b.m(逼近对象程序)

function [sys,x0,str,ts] = s_function(t,x,u,flag)
switch flag,
case 0,
    [sys,x0,str,ts] = mdlInitializeSizes
case 1,
    sys = mdlDerivatives(t,x,u);
case 3,
    sys=mdlOutputs(t,x,u);
case{2,4,9}
    sys = [];
otherwise
    error(['Unhandled flag = ',num2str(flag)]);
end
function[sys,x0,str,ts] = mdlInitializeSizes
sizes = simsizes;  %设置模块参数结构体
sizes.NumContStates =2;               %模块连续变量个数
sizes.NumDiscStates =0;      		  %模块离散变量个数
sizes.NumOutputs    =1;      		  %模块输出变量个数
sizes.NumInputs     =1;      		  %模块输入变量个数
sizes.DirFeedthrough=0;      		  %模块是否前后贯通,输入是否能直接控制输出
sizes.NumSampleTimes=0;      		  %模块采样时间
sys=simsizes(sizes);      		      %模块设置完成后传递给sys参数
x0 = [0,0];
str = [];
ts = [];
function sys = mdlDerivatives(t,x,u)
sys(1) = x(2);
sys(2) = -25*x(2) +133*u;
function sys=mdlOutputs(t,x,u)
sys(1) = x(1);

画图

close all;
figure(1);
plot(t,y(:,1),'r',t,y(:,2),'k:','linewidth',2);
xlabel('time(s)');ylabel('y and ym');
legend('ideal signal','signal approximation');

运行结果

在这里插入图片描述

代码详解

初始化

function [sys,x0,str,ts] = mdlInitializeSizes
sizes = simsizes;  %设置模块参数结构体
sizes.NumContStates =0;               %模块连续变量个数
sizes.NumDiscStates =0;      		  %模块离散变量个数
sizes.NumOutputs    =1;      		  %模块输出变量个数
sizes.NumInputs     =2;      		  %模块输入变量个数
sizes.DirFeedthrough=1;      		  %模块是否前后贯通,输入是否能直接控制输出
sizes.NumSampleTimes=0;      		  %模块采样时间
sys=simsizes(sizes);      		      %模块设置完成后传递给sys参数
x0 = [];
str = [];
ts = [];

初始时的权值等数据

if t == 0
    b =1.5;
    ci = [-1 -0.5 0 0.5 1;
        -10 -5 0 5 10];
    w = rands(5,1);
    w_1 = w;
	w_2=w_1;
end
 `隐藏层的输出````javascript
for j = 1:1:5
    h(j) = exp(-norm(xi-ci(:,j))^2/(2*b^2));
end

RBF网络的输出(理想输出)

ymout = w' * h';

调节权值

d_w = 0*w;
for j = 1:1:5
    d_w(j) = xite *(yout - ymout)*h(j);
end
w = w_1 + d_w +alfa *(w_1 - w_2);
w_2 = w_1;

一般情况RBF Network只有三层,其中从输入层到隐层之间并没有权重连接,而是直接将用隐层的RBF计算与不同的中心(隐层神经元)的距离或者相似度,距离越远,相似度越低,神经元的激活程度就越小,作用也就越不明显,此外这个过程也可以以Kernel SVM的角度理解: 把原始低维的数据进行转换到高维空间中(高斯核对应无穷维)的特征转换。因而RBF Network的隐层激活函数可以说就是径向基函数,而一般Neural Network的激活函数则是一些如sigmod, tanh等非线性函数。当然很明显,RBF Network由于只有隐层到输出层的权重连接,因而训练速度会大大加快。

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值