RBF神经网络实验原理_神经网络多元拟合

RBF神经网络实验原理_神经网络多元拟合RBF神经网络及拟合实例RBF神经网络介绍RBF神经网络结构RBF神经网络算法RBF神经网络逼近算法采用RBF神经网络逼近非线性函数神经网络逼近结果代码如下RBF神经网络介绍RBF神经网络结构径向基函数(RadialBasisFunction,RBF)神经网络是一种单隐含层的三层前馈神经网络,网络结构如下图所示RBF神经网络模拟了人脑中局部调整,相互覆盖接受域(或者说感受域,ReceptiveField)的神经网络结构。与BP神经网络相同,研究人员已经证明RBF神经网络能够以任何精度逼近任

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

RBF神经网络介绍

RBF神经网络结构

径向基函数(Radial Basis Function, RBF)神经网络是一种单隐含层的三层前馈神经网络,网络结构如下图所示
在这里插入图片描述
RBF神经网络模拟了人脑中局部调整,相互覆盖接受域(或者说感受域,Receptive Field)的神经网络结构。与BP神经网络相同,研究人员已经证明RBF神经网络能够以任何精度逼近任意非线性函数。

RBF神经网络算法

便于分析,记RBF神经网络的输入为m维,隐含层有 s 1 s_1 s1个神经元,输出层有 s 2 s_2 s2个神经元。
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 hj=exp(2bj2xcj2),j=1,2,...,s1
其中, c j = [ c j 1 , c j 2 , . . . , c j m ] T \bm{c}_j=[c_{j1},c_{j2},…,c_{jm}]^T cj=[cj1,cj2,...,cjm]T为第j个隐含层神经元高斯基函数的中心向量, m m m表示网络输入 x \bm{x} x的维数, b j b_j bj为第j个隐含层神经元高斯基函数的宽度。与之前提及的BP神经网络中的sigmod函数不同,高斯基函数只在有限的范围内,输入是非零的,超过一定的范围,其输出则为零。
在一维情况下,不同的 c j \bm{c}_j cj b j b_j bj对高斯基函数的影响如下图所示
在这里插入图片描述
可以看到, b j b_j bj越大,高斯基函数的非零输出区域越大,表明对输入的映射能力越强。 c j \bm{c_j} cj表示非零输出区域的中心位置,输入离中心越近,其输出值会更大,表明高斯基函数对输入更加敏感。
RBF神经网络的输出为
y = W H \bm{y} = \bm{WH} y=WH
其中, W ∈ R s 2 × s 1 \bm{W}\in R^{s_2 \times {s_1}} WRs2×s1为RBF神经网络输出层权值矩阵, H ∈ R s 1 H \in R^{s_1} HRs1为隐含层输出, H = [ h 1 , h 2 , . . . , h s 1 ] T \bm{H} = [h_1,h_2,…,h_{s_1}]^T H=[h1,h2,...,hs1]T

RBF神经网络逼近算法

相较BP神经网络,RBF神经网络结构更加简单,同时需要调节的参数也更少,只有输出层的权值矩阵 W \bm{W} W需要在训练过程中调节。与BP神经网络类似,我们可以以采用梯度下降法来调节权值矩阵。
定义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=21i=1s2ei2=21i=1s2ydy2
其中, y d \bm{y_d} yd为期望输出。
对误差指标关于输出层权值矩阵 W \bm{W} W中元素进行求导得到
∂ 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 Wi0E=eiEyieiWi0yi=eihi
那么,权值可按如下方式调节
Δ 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)) ΔWi0=ηeihiWi0(k+1)=Wi0(k)+ΔWi0+α(Wi0(k1)Wi0(k2))
其中, η ∈ ( 0 , 1 ) \eta\in(0,1) η(0,1)为学习速度, α ∈ ( 0 , 1 ) \alpha \in(0,1) α(0,1)为动量因子。

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

采用RBF神经网络,逼近简单的正弦函数
y = s i n ( t ) y=sin(t) y=sin(t)
可知,采用的RBF神经网络输入和输出层神经元数量都为1,设置隐含层神经元数量为10个。
由于RBF神经网络采用的激活函数在有限区域内输出为非零,因此在设计RBF神经网络的时候,需要根据网络的输入来确定每个隐含层神经元激活函数的参数,即 c j c_j cj b j b_j bj。合适的网络参数能够提升网络的逼近效果和性能,而不合适的参数会导致神经网络训练失败,或者达不到想要的效果。
通常来说, c j c_j cj参数需要与网络的输入相匹配,要保证输入在高斯基函数的有效映射区域内;同样的,根据输入的范围和高斯基函数的中心,来设置一个合适的宽度参数 b j b_j bj
在本例中,神经网络的输入为时间 t ∈ [ 0 , 10 ] t \in[0,10] t[0,10],因此取径向基函数中心和宽度为
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 C=[1,2,3,4,5,6,7,8,9,10]TB=[bj]10×1,bj=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

Jetbrains全家桶1年46,售后保障稳定

检验训练结果

%% 检验训练结果
idx_vad = (1:20:1000);
u_test = u(idx_vad);
for i = 1:length(idx_vad)
    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 
    y_vad2(i) = W*H;
end
figure(3)
plot(u_test2,y_vad2,'r','LineWidth',0.75);
hold on
plot(u_test2,y_test2,'b--','LineWidth',1)
grid on
legend('estimation','reference')
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/234530.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 数据结构教程 视频_神谷哲史男巫教程视频

    数据结构教程 视频_神谷哲史男巫教程视频史上最全的数据结构视频教程打包下载地址本文出自出自我是码农,转载请注明出处,谢谢!以下数据结构视频教程是我多年收集的,因为在百度网盘上分享整个教程很快就会被delete,所以我只好花费大量功夫对单个视频进行一个一个的分享,这样才能长时间保留下来,为了学习,麻烦些也值得了!现在毫无保留的免费共享给大家,与君共勉!个人认为数据结构这门课程比较难,看视频学习是最好的方式。当年我就是看了多个视频,然…

    2022年10月12日
    0
  • jsp out.print报错_idea代码错误但不提示

    jsp out.print报错_idea代码错误但不提示昨晚从网上copy一份代码到IDEA时,发现其中IDEA中的JSP文件在写入out.println时会报错,如图所示上网查阅资料发现有如下说法A、新建Java工程时,应选择JavaEnterprise而非Java里的webapplication(JavaEnterprise会自动关联Tomcat到Dependencies)B、应将Tomcat关联到File-&gt;ProjectStruct…

    2022年10月2日
    0
  • 扩展卡尔曼滤波算法及仿真实例[通俗易懂]

    扩展卡尔曼滤波算法及仿真实例[通俗易懂]在阅读本篇博客之前希望读者已经具备线性卡尔曼滤波器的基础,或者提前研读我的前一篇关于线性卡尔曼滤波器的文章:线性卡尔曼滤波算法及示例。下面不说废话,直奔主题了。一、扩展卡尔曼滤波器(EKF)理论基础扩展Kalman滤波器算法实质上是一种在线线性化技术,即安装估计轨道进行线性化处理—-泰勒级数展开,再进行线性的Kalman滤波。实际非线性滤波处理,通常对过程噪声和观测噪声近似为高斯分布,…

    2022年6月22日
    98
  • redis设置过期时间后再set还用设置时间吗_redis setnx 过期时间

    redis设置过期时间后再set还用设置时间吗_redis setnx 过期时间​​​​​​​java操作Redis缓存设置z过期时间转载:java操作Redis缓存设置过期时间-liuminchao-博客园关于Redis的概念和应用本文就不再详解了,说一下怎么在java应用中设置过期时间。在应用中我们会需要使用redis设置过期时间,比如单点登录中我们需要随机生成一个token作为key,将用户的信息转为json串作为value保存在redis中,通常做法是://生成tokenStringtoken=UUID.randomUUID().t..

    2022年9月26日
    1
  • jetbrain 激活码【最新永久激活】

    (jetbrain 激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月30日
    705
  • strstr(str1,str2)函数使用时注意事项

    strstr(str1,str2)函数使用时注意事项可能有的人还没听过strstr函数,个人认为这个一个很实用的函数,strstr(str1,str2)函数是字符串处理函数之一,位于头文件“string.h”中。对于处理字符串的一些问题有很大的帮助。定义:strstr(str1,str2)函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL。定义说的有点羞涩难懂。举个例子就…

    2022年6月25日
    33

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号