RBF神经网络及其应用神经网络

Posted 张叔zhangshu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RBF神经网络及其应用神经网络相关的知识,希望对你有一定的参考价值。

RBF神经网络典型案例分析

【例6-1】考虑具有3输入2输出的一组数据,如表6-1所示。

>> clear all;
xite=0.10;alfa=0.05;
W=rands(5,2);
W_1=W;W_2=W_1;
h=[0,0,0,0,0]';
c=2*[-0.5 -0.25 0 0.25 0.5;-0.5 -0.25 0 0.25 0.5;-0.5 -0.25 0 0.25 0.5]; 
b=10; 
xs=[1,0,0];				%样本输入
ys=[1,0];  				%样本输出
OUT=2;NS=1;
k=0;E=1.0;
while E>=1e-20
k=k+1;   
times(k)=k;
for s=1:1:NS   				%多输入多输出样本 
x=xs(s,:);

RBF神经网络的学习算法

RBF神经网络的函数

newrb函数设计的RBF神经网络net可以用于函数逼近。径向基函数的扩展速度的值需要根据具体问题灵活选择。对于变化较快的函数,如果spread的值取得过大就会使逼近结果过于粗糙;对于变化较慢的函数,如果spread的值取得过小就会使逼近结果不够光滑,网络的性能就会受到影响。
【例6-3】利用newrb函数创建一个近似RBF神经网络。
程序实现代码如下:

>> clear all;
 P = [1 2 3];
T = [2.0 4.1 5.9];
net = newrb(P,T);
P = 1.5;
Y = sim(net,P)

2)newrbe函数
newrbe函数用于设计一个准确的RBF神经网络,函数的调用格式如下:
net = newrbe(P,T,spread)
其中,输入参数P为输入向量;T为输出向量;spread为径向基函数的分布密度,spread的值越大,函数越平滑,默认值为1.0。
一般来讲,newrbe函数和newrb函数一样,神经元数目越大,函数的拟合效果就越平滑。但是,过多的神经元可能会导致计算困难。
【例6-4】利用newrbe函数创建一个RBF神经网络,注意与【例6-3】的区别。
程序实现代码如下:

>> clear all;
P = [1 2 3];
T = [2.0 4.1 5.9];
net = newrbe(P,T);
P = 1.5;

newpnn函数创建的是一个两层的神经网络:第一层是径向基神经元,用dist函数计算加权输入,用netprod函数计算网络输入;第二层是竞争神经元,用dotprod函数计算加权输入,用netsum函数计算网络输入。其中,只有第一层包含阈值。网络将第一层的值设置为P,第一层的阈值设置为0.8326/spread,并且当加权输入为±spread时,径向基函数取值恰好为0.5,第二层的权值被设置为T。
【例6-5】利用newpnn函数创建一个概率神经网络。
程序实现代码如下:

>> clear all;
P = [1 2 3 4 5 6 7];
Tc = [1 2 3 2 2 3 1];
T = ind2vec(Tc)  	                  %将数据索引转换为向量组
net = newpnn(P,T);
Y = sim(net,P)
Yc = vec2ind(Y)   	%将向量组转换为数据索引

newgrnn函数用于创建一个广义回归神经网络。广义回归神经网络是RBF神经网络的一种,通常用于函数逼近(请参考6.8节)。newgrnn函数的调用格式如下:
net = newgrnn(P,T,spread)
其中,输入参数P为输入向量;T为输出向量;spread为径向基函数的分布密度,spread的值对网络的逼近精度有很大的影响,需要不断地调整spread的值。spread的值越小,函数的比较越精确,但是逼近过程就越粗糙;spread的值越大,逼近过程越平滑,但是逼近的误差会比较大。
【例6-6】利用newgrnn函数创建一个广义回归网络。
程序实现代码如下:

>> clear all;
P = [1 2 3];
T = [2.0 4.1 5.9];
net = newgrnn(P,T);
P = 1.5;
Y = sim(net,P)

MATLAB神经网络工具箱中提供的radbas函数用于实现RBF神经网络的传递。radbas函数的调用格式如下:
A = radbas(N,FP)
其中,输入参数N为S×Q维的网络输入(列向量)矩阵;FP为性能参数(可以忽略),返回网络输入向量N的输出矩阵A。
【例6-7】计算向量的径向基函数及其微分。
程序实现代码如下:

>> clear all;
n=-6:0.1:6;
a=radbas(n-2);  		%中心位置向右平移2个单位
b=exp(-(n).^2/2); 	%除以2,曲线更加“矮胖”
figure;
subplot(121);plot(n,a);
hold on;
plot(n,b,'r:');
title('不同位置和形状的radbas函数');
c=diff(a);  			%计算a的微分
subplot(122);plot(c);
title('径向基函数的微分');


2)vec2ind函数
vec2ind函数用于将向量组转换为数据索引,与ind2vec函数是互逆的。vec2ind函数的调用格式如下:
[ind,n] = vec2ind(vec)
其中,vec为m×n的稀疏矩阵x,x中的每个向量i,除了包括1,其余元素均为0,得到的行向量包括这些非零元素的下标。
【例6-8】利用ind2vec函数与vec2ind函数实现网络的转换。
程序实现代码如下:

>> clear all;
ind = [1 3 2 3];  			%定义一个数据索引列向量
vec = ind2vec(ind)  		%将数据索引列向量转换为向量组
vec =
   (1,1)        1
   (3,2)        1
   (2,3)        1
   (3,4)        1
>> %最后一行中具有全零的向量被转换为索引并返回,同时保留行数
vec = [0 0 1 0; 1 0 0 0; 0 1 0 0]'

权函数

info = dist(‘code’)
根据code值的不同,返回有关函数的信息。当code=deriv时,返回导函数名称;当code=pfullderiv时,返回输入向量;当code=wfullderiv时,返回权值;当code=name时,返回函数的全称;当code=fpnames时,返回函数参数的名称;当code=fpdefaults时,返回默认的函数参数。
【例6-9】利用dist函数计算两个随机矩阵的欧几里得距离。
程序实现代码如下:

>> clear all;
>> W = rand(4,3);  	%4×3矩阵
>> P = rand(3,2);  	%3×2矩阵
>> Z = dist(W,P)   	%得到的结果为4×2矩阵
Z =
    0.7063    0.4456
    0.8313    0.9227
    0.7717    1.0744
    0.7835    0.5330
>> D=dist(Z)  		%只有一个输入,计算Z中每行与其他行的距离

2)normprod函数
normprod为规范点的权函数,函数的调用格式为:
Z = normprod(W,P,FP)
dim = normprod(‘size’,S,R,FP)
dw = normprod(‘dz_dw’,W,P,Z,FP)
其输入参数的含义与dist函数参数的含义类似。其中,Z为返回的规范点积权。
【例6-10】利用normprod函数计算随机矩阵的规范点积权。
程序实现代码如下:

>>clear all;
W = rand(4,3);
P = rand(3,1);
Z = normprod(W,P)

3)netprod函数
netprod为乘积网络输入函数,函数的调用格式如下:
N = netprod({Z1,Z2,…,Zn})
其中,输入参数Zi为S×Q维的矩阵;Z为从Z1到Zn的组合;输出参数N为从Z1到Zn的积。
info = netprod(‘code’)
根据code值的不同,返回有关函数的信息。当code=name时,返回传递函数的全称;当code=deriv时,返回导函数名称;当code=fullderiv时,返回导数的次数;当code=fpnames时,返回函数参数的名称;当code=fpdefaults时,返回默认的函数参数。
【例6-11】利用netprod函数计算几个矩阵中相应元素的积。
程序实现代码如下:

>> clear all;
>> Z1 = [1 2 4;3 4 1];
Z2 = [-1 2 2; -5 -6 1];
Z = {Z1,Z2};
N = netprod({Z})

4)dotprod函数
dotprod为矩阵的内权积函数,函数的调用格式如下:
Z = dotprod(W,P,FP)
dim = dotprod(‘size’,S,R,FP)
dw = dotprod(‘dw’,W,P,Z,FP)
info = dotprod(‘code’)
其输入参数的含义与dist函数参数的含义类似。其中,Z为返回矩阵的内权积。
【例6-12】利用dotprod函数计算矩阵之间的内权积。

>> W = rand(4,3);  	%4*3矩阵
P = rand(3,2);   		%3*2矩阵
Z = dotprod(W,P)  	%计算矩阵的内权积

输入函数

MATLAB神经网络工具箱中提供的netsum函数用于计算网络输入,它可以将加权输入与偏置相结合,求出输入矩阵元素的和。netsum函数的调用格式如下:
N = netsum({Z1,Z2,…,Zn},FP)
其中,Z1,Z2,…,Zn等输入参数是S×Q同型矩阵,函数将返回它们对应位置元素的和;N为与输入矩阵同型的矩阵。
info = netsum(‘code’)
根据code值的不同,返回有关函数的信息。当code=name时,返回函数的全称;当code=type时,返回函数的类型;当code=fpnames时,返回函数参数的名称;当code=fpdefaults时,返回默认的函数参数;当code=fullderiv时,返回0或1,这取决于S×Q矩阵。
【例6-13】利用netsum函数计算网络输入函数和。
程序实现代码如下:

>> clear all;
z1 = [1, 2, 4; 3, 4, 1];
z2 = [-1, 2, 2; -5, -6, 1];
b = [0; -1]
n = netsum({z1, z2, concur(b, 3)})

竞争传递函数

compet为神经网络的竞争传递函数,传递函数用于从网络中求得网络输出。compet函数的调用格式如下:
A = compet(N,FP)
其中,N为S×Q维矩阵,包含Q个长度为S的列向量,对每个列向量分别求最大值,返回同型矩阵A,在每列的最大值对应位置,A中的元素为1,其余元素为0,A的每列中有且仅有一个元素等于1;FP为返回函数参数的结构。
可以用n给网络的第i层设置传递函数,下面举例说明。
【例6-14】计算一个向量的网络输出。
程序实现代码如下:

>> clear all;
n = [0; 1; -0.5; 0.5];
a = compet(n);
subplot(2,1,1), bar(n), ylabel('n')
subplot(2,1,2), bar(a), ylabel('a')

以上是关于RBF神经网络及其应用神经网络的主要内容,如果未能解决你的问题,请参考以下文章

Matlab RBF神经网络及其实例

Matlab RBF神经网络及其实例

RBF神经网络在化工方面的应用神经网络七

RBF神经网络在化工方面的应用神经网络七

BP神经网络及其应用神经网络四

BP神经网络及其应用神经网络四