老饼讲解-神经网络
自实现-径向基神经网络
径向基一族
精确径向基-自实现代码
作者 : 老饼 日期 : 2022-06-09 04:47:20 更新 : 2022-06-29 01:26:44
本站原创文章,转载请说明来自《老饼讲解-BP神经网络》bp.bbbdata.com


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

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

通过本代码的学习,可以完全细节的了解精确径向基RBE的实现逻辑。

其中,RBE的原理可参考《精确径向基-思想与原理》

代码的逻辑解说可参考 本文"算法流程"部分


  01. 代码结构说明  

代码主要包含了三个函数:


testRbeNet:测试用例主函数,直接运行时就是执行该函数。


1、数据:生成一个2输入1输出的训练数据,
2、用自写的函数训练一个Rbe网络,与预测结果。
3、使用工具箱newrbe训练一个Rbe网络。比较自写函数与工具箱训练结果是否一致(比较测试数据的输出结果)


trainRbe:训练主函数。


训练一个精确径向基神经网络。


predictRbe:预测主函数。


传入需要预测的X,与网络的权重矩阵,即可得到预测结果。





  02. 代码运行结果解说 

运行代码,得到如下结果:



  
 

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





  03. 算法流程   


  ● 待求参数与所需输入  


待求网络参数:W21,W32,B2,B3
所需输入:spread  (用于生成隐层的阈值,即控制径向基肥瘦的参数)




  ● 算法流程  


●  求解W21,B2
W21:
样本即为W21.
B2:为常数,由输入参数spread得到:
 

● 求解W32,B3
由W21与B2,可以得到隐层激活值,与y联立,解出方程组即可得到。




  04. 具体代码  


matlab2014b亲测已跑通:

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

%----------调用自写Rbe函数获得精确径向基神经网络-----------------
[W1,B1,W2,B2] = trainRbe( X,Y,spread );

%----模型预测-----------------
tx = [2 3]';
simY = predictRbe(W1,B1,W2,B2,tx)

%使用matlab神经网络工具箱求tx的预测值并与自写模型预测结果对比
net = newrbe(X, Y, spread);
simYByBox = sim( net, tx)
testResult = isequal( simY, simYByBox)
% web('bp.bbbdata.com')
end

function [W1,B1,W2,B2] = trainRbe(X,Y,spread)
Q = size(X,2); %样本个数
%输入层到隐层的权值和阈值
W1 = X';  
B1 = ones( Q, 1)*sqrt( -log(.5))/spread;
%求隐节点的值.
h=zeros( Q, Q);
for i = 1: Q      
   for j = 1 : Q   
      %计算第i个样本,第j个隐节点的值
      h(i,j) = B1(j)*sqrt(sum((X(:,i)' -W1(j,:)).^2));
   end
end
%hRbf是每个节点经过径向基传递函数变换后的值
hRbf = exp( -h.*h) ;
%利用隐节点的值和输出的值,求解隐层到输出层的权值和阈值
hRbf = [ hRbf; ones( 1,size( hRbf,2))];
WB  = Y /hRbf;
W2 = WB( :, 1:end-1);
B2 = WB( :, end);
end
function y = predictRbe(W1,B1,W2,B2,xx)
hNode = length(B1); %样本个数
%求隐节点
h_xx = zeros(hNode,1);
for i = 1 : hNode
    h_xx(i) = B1(i) * sqrt(sum((xx' - W1(i,:)).^2));
end
hRbf_xx = exp( -h_xx .* h_xx );
%网络的输出
y = W2 * hRbf_xx + B2;
end






 End 







联系小饼