冰冰点灯,照亮我家门前~
欢迎进入nnetinfo
用户名:
密码:
深圳学习数据分析,数据挖掘,请联系yahushuxue@163.com~
nnetinfo : 本网发布神经网络相关的学习与研讨内容。
当前位置:教学区
精确径向基myNewrbe(动手写自己的代码)
作者:梁小h   日期:2015-11-04 10:39:26.0

         本文主要介绍了精确径向基神经网络的代码实现方式,对于理论知识,这里不再作详细描述如有不明,请先通过以下两篇文章

理解精确径向基神经网络的原理.

一篇文章读懂径向基神经网络原理(上)

一篇文章读懂径向基神经网络原理(下)

 

我们知道,精确径向基的模型如下:

                                  

要求的参数是:

输入到隐层的权重 W1
隐层阈值 B1
隐层到输出层的权重 W2
输出层阈值 B2

分析:

          W1就是训练样本的输入.

           B1则按spread/sqrt(ln(0.5))生成即可.

            根据W1和B1计算隐节点与输出组成的线性方程组,就可以求得W2和B2

代码实现如下,在matlab2012b上能正确运行:

function testNewrbe()
%本代码来自www.nnetinfo.com
%本代码模仿matlab神经网络工具箱的newrbe神经网络,
%代码主旨用于教学,供大家学习理解newrbe神经网络原理

%%生成训练数据
x1 = 1:0.4:10;   
x2 = x1;
X  = [ x1; x2];    
Y  = sin (X(1, :)) + X( 2, :);
spread = 2;  %扩展系数

[W1,B1,W2,B2] = myNewrbe( X,Y,spread );

%模型验证
xx = [2 3]';

simY = mySim(W1,B1,W2,B2,xx)

%使用matlab神经网络工具箱求xx的预测值
net = newrbe(X, Y, spread);
simYByBox = sim( net, xx)

testResult = isequal( simY, simYByBox);  
disp(['testResult = ',num2str(testResult)]);

web('www.nnetinfo.com')
end


function [W1,B1,W2,B2] = myNewrbe(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 = mySim(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