本站原创文章,转载请说明来自《老饼讲解-BP神经网络》www.bbbdata.com
本文是笔者细扒matlab神经网络工具箱newrbe的源码后,
去除冗余代码,重现的简版newrbe代码,代码与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