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神经网络及其应用神经网络的主要内容,如果未能解决你的问题,请参考以下文章