RBF神经网络

【代码】RBF神经网络-自实现代码-精确求解

作者 : 老饼 发表日期 : 2022-06-09 04:47:20 更新日期 : 2023-12-25 19:07:51
本站原创文章,转载请说明来自《老饼讲解-BP神经网络》www.bbbdata.com


本文是笔者细扒matlab神经网络工具箱newrbe的源码后,

去除冗余代码,重现的简版newrbe代码,代码与newrbe的结果完全一致。

通过本代码的学习,可以完全细节的了解径向基神经网络精确求解的实现逻辑





  01. RBF神经网络-newrbe自实现代码  



本节展示如何不依赖软件包自实现RBF径向基神经网络的代码

即自写代码重现matlab中的newrbe函数




    自写newrbe-代码结构说明    


本文代码包含了三个函数
  具体如下
 
  👉1.testRbeNet:测试用例主函数,直接运行时就是执行该函数   
 
1、数据:生成一个2输入1输出的训练数据             
2、用自写的函数训练一个Rbe网络,与预测结果       
3、使用工具箱newrbe训练一个Rbe网络               
4、通过比较测试数据的输出结果                    
确认自写函数与工具箱训练结果是否一致       


  👉2.trainRBE:训练主函数                                                        
 
训练一个精确径向基神经网络                        

  👉3.predictRBE:预测主函数                                                    
 
传入需要预测的X与网络的权重矩阵,即可得到预测结果





    精确径向基newrbe-自实现代码    


function testRbeNet()
% 本代码来自www.bbbdata.com
% 本代码模仿matlab神经网络工具箱的newrbe神经网络,用于训练《精确径向基神经网络》,
% 代码主旨用于教学,供大家学习理解newrbe神经网络原理
%--------生成训练数据-------------------
x1 = 1:0.4:10;  
x2 = x1;
X  = [x1; x2];                                          % 训练样本的X 
Y  = sin(X(1, :)) + X( 2, :);                           % 训练样本的Y
tx = [2 3]';                                            % 测试样本
%---------参数预设----------------------
spread = 2;                                             % 扩展系数

%-----调用自写RBE函数训练精确径向基神经网络----
[W2,B2,W3,B3] = trainRBE( X,Y,spread );                 % 训练精确径向基网络
simY = predictRbe(W2,B2,W3,B3,tx)                       % 对测试样本进行预测

%------调用工具箱训练精确径向基神经网络-------
net       = newrbe(X, Y, spread);                       % 训练精确径向基网络
simYByBox = sim( net, tx)                               % 对测试样本进行预测

 % ----比较工具箱与自写REB的结果是否一致-----
testResult = isequal( simY, simYByBox)   

end

%训练一个精确径向基神经网络
function [W2,B2,W3,B3] = trainRBE(X,Y,spread)
Q = size(X,2);                                           % 样本个数

%-----输入层到隐层的权值和阈值-------
W2 = X';                                                 % 输入层到隐层的权重 
B2 = ones( Q, 1)*sqrt( -log(.5))/spread;                 % 隐层的阈值

%----求隐节点的激活值-------------
h = zeros( Q, Q);
for i = 1: Q      
   for j = 1 : Q   
      h(i,j) = B2(j)*sqrt(sum((X(:,i)' -W2(j,:)).^2));   % 计算第i个样本,第j个隐节点的神经元值
   end
end
A = exp( -h.*h) ;                                        % 计算隐节点的激活值

% -----求解隐层到输出层的权值和阈值-------
C  = [ A; ones( 1,size( A,2))];                          % 将激活值加上一行1,组成方程组的系数矩阵
WB = Y /C;                                               % 求解线性方程组      
W3 = WB( :, 1:end-1);                                    % 提取出输出层权重 
B3 = WB( :, end);                                        % 提取出输出层阈值
end

% 精确径向基神经网络的预测模型
function y = predictRbe(W2,B2,W3,B3,x)
n = length(B2);                                          % 样本个数
h = zeros(n,1);                                          % 初始化隐节点的神经元值
for i = 1 : n                                            
    h(i) = B2(i) * sqrt(sum((x' - W2(i,:)).^2));         % 计算隐节点的神经元值
end                                                      
A = exp( -h .* h );                                      % 计算隐节点的激活值
y = W3 * A + B3;                                         % 网络的输出                
end

版本:matlab 2014b




     代码运行结果  


代码运行结果如下   
 

从结果中可以看到,
自写代码完美重现matlab工具箱newrbe的结果











 End 





联系老饼