本篇博客为书籍:《MATLAB R2015b 神经网络技术》的读书摘要,侵权请联系作者删除。
转载请注明地址:http://blog.sina.com.cn/s/blog_a36a563e0102ywli.html
第七章 径向基神经网络(RBF)
7.8 径向基神经网络的函数(MATLAB代码实现)
本节内容:
- 7.8.1 径向基神经网络的创建函数
- 7.8.2 径向基神经网络的传递函数
- 7.8.3 径向基神经网络的转换函数
- 7.8.4 径向基神经网络的权函数
- 7.8.5 竞争性传输
7.8.1 径向基神经网络的创建函数
在MATLAB中,提供了newrb、newbe、newpnn、及newgrnn函数用于创建径向基神经网络,下面分别给予介绍。
1. newrb函数
该函数用于设计一个径向基网络。函数的调用格式为:
[net,tr] = newrb(P,T,goal,spread,MN,DF)
其中,P为Q组输入向量;T为Q组目标分类向量;goal为均方误差,默认为0;spread为径向基函数的粉扑,默认值为1;MN为神经元的最大数目,默认值为Q;DF为两次显示之间所添加的神经元数目,默认为25;net为生成的径向基网络;tr为生成的训练记录。
2. newrbe函数
该函数用于设计一个准确的径向基网络。函数的调用格式为:
net = newrbe(P,T,spread)
其中,P为Q组输入向量;T为Q组目标分类向量;spread为径向基函数的分布,默认值为1。
一般来讲,newrbe与newrb一样,神经元数目越大,对函数的拟合就越平滑。但是,过多的神经元可能会导致计算困难。
3. newpnn函数
该函数可用于创建概率神经网络,概率神经网络是一种适用于分类问题的径向基函数。函数的调用格式为:
net = newpnn(P,T,spread)
其中,输入参数P为输入向量;T为输出向量;spread为径向函数的分布密度,参数spread的大小对网络的逼近精度有很大的影响,需要不断地调整spread的值。
spread越小,函数的逼近越精确,但是逼近的过程就越粗糙;spread越大,逼近过程就比较平滑,单是逼近的误差会比较大。
newpnn创建的是一个两层的神经网络:
第一层的神经元是径向基神经元,用dist函数计算加权输入,用netprod计算网络输入;
第二层的神经元是竞争神经元,用dotprod函数计算加权输入,用netsum函数计算网络输入。
其中只有第一层包含阈值。网络将第一层的权值设置为P,第一层的阈值设置为0.8326/spread,且加权输入为±spread时,径向基函数取值恰好为0.5,第二层的权值被设置为T。
4. newgrnn函数
该函数可用于设计一个广义的回归神经网络。广义回归神经网络是径向基函数神经网络的一种,通常用于函数逼近。函数的调用格式为:
net = newgrnn(P,T,spread)
其中,输入参数P为输入向量;T为输出向量;spread为径向基函数的分布密度,参数spread的大小对网络的逼近精度有很大的影响,需要不断地调整spread的值。spread越小,函数的逼近越精确,但是逼近的过程就越粗糙;spread越大,逼近过程就比较平滑,单是逼近的误差会比较大。
【例7-1:使用newrb函数】 生成正弦函数,加入均匀分布的噪声,再用newrb建立径向基函数进行拟合。
【MATLAB代码:】
P = 1:0.5:10;
randn('state',pi); % same as RNG
T = sin(2 * P) + randn(1,length(P)); % add noise
plot(P,T,'ro');
net = newrb(P,T,0,0.6); % design net
test = 1:.2:10;
out = sim(net,test);
hold on; plot(test,out,'b-');
legend('input data','fit data');
【运行结果:】
在以上代码中,可自行修改spread参数的值,观察结果有何不同,假如用代码net=newrb(P,T,0,0.6)替换为new=newrb(P,T),可以将spread参数从默认值1改为0.6,使拟合曲线更加精密。
【例7-2:使用newrbe函数】 利用newrbe函数创建一个准确的径向基网络
【MATLAB代码:】
P=[1 2 3 4 5];
T=[0.5 2.3 3.2 4.6 6.7];
sprs=1;
net=newrbe(P,T,sprs); %创建准确径向基网络
A=sim(net,P) %仿真
postreg(A,T); %绘制目标向量的回归曲线
p=3.5;
a=sim(net,P) %测试样本输出
【例7-3:使用newpnn函数】 利用newpnn函数创建概率神经网络
【MATLAB代码:】
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) %将数组矢量转换成数据索引
【例7-4:使用newgrnn函数】使用newgrnn函数创建广义回归网络,对非线性曲线:y=2x^6+3x^5+3x^3-2x^2进行逼近。
【MATLAB代码:】
x=-2:0.01:1;
y=2*x.^6+3*x.^5+3*x.^3-2*x.^2;
P=x(1:15:end);
T=y(1:15:end);
%实现不同的spread下广义回归神经网络函数逼近效果
spread=[0.05 0.2 0.4 0.6 0.8 1]; %3组不同的spread值
line_style={'k.-.','r*:','mo-.','bo--','k^-','bx-'};
for i=1:length(spread)
net=newgrnn(P,T,spread(i)); %创建广义回归神经网络
A=sim(net,P);
plot(P,A,line_style{i}); %创建逼近曲线
hold on;
end
plot(P,T,'o');
legend('spread=0.05','spread=0.2','spread=0.4','spread=0.6','spread=0.8','spread=1','训练数据');
【运行结果:】
从上图可以看出,不同spread值下广义回归神经网络曲线逼近效果差异较大,当spread=0.5时,曲线逼近效果最好,与原曲线基本重合,而随着spread数值的增大,逼近曲线误差增大。
7.8.2 径向基神经网络的传递函数
在MATLAB神经网络工具箱中,提供了radbas(高斯函数)函数用于实现径向基函数网络的传递。函数的调用格式为:
A = radbas(N,FP)
其中,输入参数N为SxQ维的网络输入(列)向量矩阵;FP为性能参数(可忽略),返回网络输入向量N的输入矩阵A。
radbas函数采用的算法为:
a = radbas(n) = exp{-n^2 }
7.8.3 径向基神经网络的转换函数
在MATLAB神经网络工具箱中提供了ind2vec和vec2ind两种函数用于进行数据间的转换,下面予以介绍。
1.ind2vec函数
该函数用于将数据索引转换为向量组。调用格式为:
ind2vec(ind)
其中,ind2vec函数输入为包含n个下标的行向量ind,调用后可以得到m行n列的向量组矩阵,结果是矩阵中的每个向量I,除了ind中第I个元素指定位置为1外,其余元素为0,结果矩阵的行数等于ind中最大的下标值。
2.ver2ind函数
改函数的功能是将单值向量变换成下标向量。调用格式为:
ver2ind(vec)
其中,ver2ind和ind2vec函数互为逆变换,ver2ind函数输入为一个m行n列向量矩阵vec,调用后可以得到n个下标值大于等于0的行向量,x中的每个向量I除包含一个1外,其余均为0,得到的行向量包含这些非0元素的下标。
(PS:类似于数值与one-hot之间的转换,请看例子)
【例子:转换函数的使用】
>>ind = [1 2 3 4]; vec = ind2vec(ind)
【输出:】
vec =
(1,1) 1
(2,2) 1
(3,3) 1
(4,4) 1
>> vec2 = [1 0 0 0;0 1 0 0;0 0 1 0 ]' , [ind,n] = vec2ind(vec2)
【输出:】
vec2 =
1 0 0
0 1 0
0 0 1
0 0 0
ind =
1 2 3
n =
4
7.8.4 径向基神经网络的权函数
在MATLAB神经网络工具箱中提供了dist及normprod两种类型的权函数。
1.dist函数
dist函数用于计算欧几里得距离,调用格式为:
Z = dist(W,P,FP)
其中,输入参数W为SxR权值矩阵,P为RxQ输入矩阵;FP为性能参数;输出参数Z为SxQ的输出距离矩阵。
向量的欧几里得距离就是两个向量之间的2-范数。
dim = dist( 'size' , S , R , FP ):其中含有W的权值(行)向量和P的输入(列)向量的向量距离;S为层的维数;R为输入的维数;输出参数dim为权值的大小。
dp = dist( ' dw ', W , P , Z , FP):输出参数dp为Z对P的导数;输入参数dw为Z对W的导数。
D = dist(pos):输入参数pos为神经元位置的NxS维矩阵;输出参数D为SxS维的距离矩阵。
2.normprod函数
normp函数用于实现规范点积权函数,调用格式为:
Z = normprod(W,P,FP)
其中,参数W为SxR权值矩阵;P为RxQ输入矩阵;FP为函数的参数结构(可忽略);返回参数Z为规范点积权。
dim = norm('size' , S , R , FP):参数S为层的维数;R为输入的维数,dim为权值的大小。
dw = normprod('dz_dw' , W , P , Z , FP):返回参数dw为Z对W的导数。
7.8.5 竞争性传输函数
在MATLAB中,提供了compet函数实现径向基网络的竞争性传输功能,其调用格式为:
A = compet(N,FP)
其中,compet是神经网络的传输函数u,传输函数用于从网络输入中求得网络输出。N为SxQ,包含Q个长度为S的列向量,对每个列向量分别求最大值对应位置,A中的元素为1,其余元素为0,A的每一列中有且仅有一个元素等于1。
可用如下代码给网络第i层设置传输函数:
net.layers{i}.transferFcn = 'compet';