# RBF神经网络和拟合实例

2 篇文章 0 订阅

## RBF神经网络介绍

### RBF神经网络结构

RBF神经网络模拟了人脑中局部调整，相互覆盖接受域（或者说感受域，Receptive Field）的神经网络结构。与BP神经网络相同，研究人员已经证明RBF神经网络能够以任何精度逼近任意非线性函数。

### RBF神经网络算法

RBF神经网络隐含层神经元的激活函数为如下所示的高斯基函数
h j = exp ⁡ ( − ∣ ∣ x − c j ∣ ∣ 2 2 b j 2 ) , j = 1 , 2 , . . . , s 1 h_j = \exp(-\frac{||\bm{x}-\bm{c}_j||^2}{2b_j^2}),j=1,2,...,s_1

RBF神经网络的输出为
y = W H \bm{y} = \bm{WH}

### RBF神经网络逼近算法

E = 1 2 ∑ i = 1 s 2 ∣ ∣ e i ∣ ∣ 2 = 1 2 ∑ i = 1 s 2 ∣ ∣ y d − y ∣ ∣ 2 E =\frac{1}{2}\sum_{i=1}^{s_2}||e_i||^2= \frac{1}{2} \sum_{i=1}^{s_2}|| \bm{y_d}-\bm{y}||^2

∂ E ∂ W i 0 = ∂ E ∂ e i ∂ e i ∂ y i ∂ y i ∂ W i 0 = − e i h i \frac{\partial E}{\partial W_{i0}}=\frac{\partial E}{\partial e_i} \frac{\partial e_i}{\partial y_i} \frac{\partial y_i}{\partial W_{i0}}=-e_ih_i

Δ W i 0 = − η e i h i W i 0 ( k + 1 ) = W i 0 ( k ) + Δ W i 0 + α ( W i 0 ( k − 1 ) − W i 0 ( k − 2 ) ) \Delta W_{i0} = -\eta e_ih_i \\ W_{i0}(k+1) = W_{i0}(k)+\Delta W_{i0} + \alpha (W_{i0}(k-1)-W_{i0}(k-2))

## 采用RBF神经网络逼近非线性函数

y = s i n ( t ) y=sin(t)

C = [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ] T B = [ b j ] 10 × 1 , b j = 1 , j = 1 , 2 , . . . 10 \bm{C} = [1,2,3,4,5,6,7,8,9,10] ^T \\ \bm{B} = [b_j]_{10\times 1},b_j = 1,j=1,2,...10

### 代码如下

%训练简单的RBF神经网络来拟合非线性函数
clear,clc
%% 生成训练数据
ts = 0.01;
u1 = 0;
y1 = 0;

for k=1:1000
u(k) = k*ts;
y(k) = sin(u(k));
end
len = length(u);
%% RBFNN初始设置
% RBFNN结构为1-10-1
n = 1;
s1 = 10;
s2 = 1;
c = (1:1:10);    %高斯基函数中心
b = ones(s1,1).*2;    %高斯基函数宽度
W = rand(s2,s1);   %输出权值矩阵
DW = zeros(s2,s1);
Wt1 = zeros(s2,s1); %上一时刻权值阵
Wt2 = zeros(s2,s1); %上上时刻权值阵
H = zeros(s1,1);    %隐含层输出
m = 500;
Error = zeros(m,s2);
%% 训练算法
e_tol = 1e-4;
irt_max = 20000;
e = ones(irt_max,1);
eta = 0.3;
alpha = 0.1;
for cnt = 1:irt_max
idx_rand = randperm(1000);
u_train = u(idx_rand);
y_train = y(idx_rand);
% 前向计算
for i = 1:m
x = u_train(i);
for j = 1:s1
H(j) = exp(-(x-c(j))^2/(2*b(j)^2));    %隐含层计算
end
y_etm = dot(W,H);     %神经网络预测值
Error(i) = y_train(i) - y_etm;
% 权值更新
Wt = W;  %当前时刻W
for j = 1:s1
DW(j) = eta*Error(i)*H(j);
W(j) = Wt(j) + DW(j) + alpha.*(Wt1(j)-Wt2(j));  %W update
end
Wt2 = Wt1;
Wt1 = Wt;
end
% 检测是否达到误差要求
e(cnt) = (norm(Error))^2/2/len;
if e(cnt) < e_tol
break;
end
end


%% 检验训练结果
x = u_test(i);
for j = 1:s1
H(j) = exp(-(x-c(j))^2/(2*b(j)^2));    %隐含层计算
end
y_test(i) = W*H;     %神经网络预测值
end
figure(1)
plot(u,y,'b--','LineWidth',1);
hold on
plot(u_test,y_test,'r-*');
legend('reference','estimation')
grid on
figure(2)
plot(e(1:cnt));
grid on
legend('error')
%% 检验2
for i = 1:1000
u_test2(i) = i*ts*5;
y_test2(i) = sin(u_test2(i));
x = u_test2(i);
for j = 1:s1
H(j) = exp(-(x-c(j))^2/(2*b(j)^2));    %隐含层计算
end
end
figure(3)
hold on
plot(u_test2,y_test2,'b--','LineWidth',1)
grid on
legend('estimation','reference')

• 23
点赞
• 153
收藏
觉得还不错? 一键收藏
• 8
评论
03-01 367

### “相关推荐”对你有帮助么？

• 非常没帮助
• 没帮助
• 一般
• 有帮助
• 非常有帮助

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