RBF网络能够逼近任意的非线性函数,可以看作是一个高维空间中的曲面拟合(逼近)问题,可以处理系统内的难以解析的规律性,具有良好的泛化能力,并有很快的学习收敛速度,已成功应用于非线性函数逼近、时间序列分析、数据分类、模式识别、信息处理、图像处理、系统建模、控制和故障诊断等。
学习是为了在多维空间中寻找一个能够最佳匹配训练数据的曲面,然后来一批新的数据,用刚才训练的那个曲面来处理(比如分类、回归)。RBF的本质思想是反向传播学习算法应用递归技术,这种技术在统计学中被称为随机逼近。RBF里的basisfunction(径向基函数里的基函数)就是在神经网络的隐单元里提供了提供了一个函数集,该函数集在输入模式(向量)扩展至隐空间时,为其构建了一个任意的“基”。这个函数集中的函数就被称为径向基函数。
为什么RBF网络学习收敛得比较快?当网络的一个或多个可调参数(权值或阈值)对任何一个输出都有影响时,这样的网络称为全局逼近网络。由于对于每次输入,网络上的每一个权值都要调整,从而导致全局逼近网络的学习速度很慢。BP网络就是一个典型的例子。
如果对于输入空间的某个局部区域只有少数几个连接权值影响输出,则该网络称为局部逼近网络。常见的有RBF网络、小脑模型(CMAC)网络、B样条网络等。
具体介绍下这三层:
图1.神经网络示意图
输入层: 与外界环境连结起来。
隐层: 从输入空间到隐空间之间进行非线性变换;
输出层: 是线性的,为输入层的输入模式提供响应。
二、映射到高维空间:
非线性变换的基本理论(Cover,1965):1.模式分类问题映射到一个高维空间将会更可能实现线性可分;
2. 隐空间的维数越高,逼近就越精确。
三 :拟合问题
非常典型的解决方法就是插值,如牛顿插值、拉格朗日插值等等。现在的径向基函数就是要拟合出这样一个函数F(x),如图2所示:
图2. 要找的F(x)
其中,就是N个任意的函数(一般情况下,非线性)的集合,即所谓的径向基函数啊,||||表示范数。现在,就介绍下目前常用的三大径向基函数,如图3所示:
现在问题是,来了一批训练数据,怎么拟合出高维曲面函数F(x)呢?其实,当你选定基函数集合(可以是图3的三个之一)了,你要做的就是通过训练数据来求出权值W啊。比如,训练数据形如:(xi,di),其中di是值(即标注,分类标注),则有
F(xi)=di,其中,i=1,2,3...n
现在代入图2的公式,便有图4的推倒过程
图4.求权值推导过程
令表示元素为的N*N阶的矩阵,即,则图4中的矩阵表示可以用图5表示:
图5.差值矩阵
这样一来,如果 非奇异的话,就能解出W,即图6所示:
图6.权值的解
怎么保证插值矩阵非奇异呢,幸好,有Micchelli定理[2]做指导和保证,径向基函数非奇异,必须使所有的输入点互不相同。
这样,就相当于解决了拟合问题,即训练集里点互不相同即可。
一些程序
x = 0:0.1:5;
y = sqrt(x)
net = newrb(x, y, 0, 0.5, 20, 5);
t = sim(net, x);
plot(x, y-t, '*-')
*******************************************************************
clear all;clc;
X = [0:0.1:1];
T=sin(5*X)+X;
net = newrb(X,T);
x1 = [0.05:0.1:0.95];
Y1 = sim(net,x1);
T2 = sim(net,X);
figure(1);
plot(X,T,'b-',x1,Y1,'r+',X,T2,'g-');
% Title : 径向基函数网络应用实例
% Descript :BP网络用于函数逼近时,权值的调整采用的是梯度下降法,但存在着局部极小和收敛速度慢等缺点。而径向基函数网络,则是一种在逼近能力、分类能力和学习速度等方面均优于BP网络的网络。
clf reset
%setfsize(300,300);
echo on
clc
% INITFF -对前向网络进行初始化
% SIMUFF -对前向网络进行仿真
% TRAINLN -采用LM算法前向网络进行训练
pause
clc
% P 为输入向量
P=-1:.1:1;
% T 为目标向量
T = [-0.9602 -0.5770 -0.0729 0.3771 0.6405 0.6600 0.4609...
0.1336 -0.2013 -0.4344 -0.5000 -0.3930 -0.1647 0.0988...
0.3072 0.3960 0.3449 0.1816 -0.0312 -0.2189 -0.3201];
pause
clc
plot(P,T,'+');
title('训练向量');
xlabel('输入向量 P');
ylabel('目标向量 T');
pause
clc
df=10;%学习过程显示频率
me=8000; %最大训练步数
eg=0.00000002 %误差指标
sc=1 %径向基函数的分布常数
[w1,b1,w2,b2,nr,err]=solverb(P,T,[df me eg sc]);
ploterr(err,eg);
p=0.5;
a=simurb(p,w1,b1,w2,b2)
echo off
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%RBF网络用于函数逼近20051218
%%%% 神经网络工具箱
% clear all;clc;
%
% X = [0:0.1:1];
% T=sin(5*X)+X;
%
% net = newrb(X,T);
% x1 = [0.05:0.1:0.95];
% Y1 = sim(net,x1);
% T2 = sim(net,X);
%
% figure(1);
% plot(X,T,'b-',x1,Y1,'r+',X,T2,'g-');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%RBF网络用于函数逼近20051218
%%%% 未使用神经网络工具箱,离线算法
%%%%
% clear;clc;
%
% X = [0:0.05:1];
% N = length(X);
% Nr = 5;
% T = sin(5*X).^2+X.^2+cos(X);
%
% %%%% 计算中心矢量
% dc = 1;
% t = 0;
% c = randn(1,Nr);
% while dc>0.0001
%classNum = zeros(1,Nr);
%classSum = zeros(1,Nr);
%for k=1:N
%d = (X(k)*ones(1,Nr)-c).^2;
%[m,I] = min(d);
%classNum(I) = classNum(I)+1;
%classSum(I) = classSum(I)+X(k);
%end
%for i = 1:Nr
%if classNum(i)>0.5
%classSum(i) = classSum(i)/classNum(i);
%else
%classSum(i)=0;
%end
%end
%c1 = classSum;
%temp0 = sum((c1-c).^2);
%temp1 = sum(c1.^2);
%dc = temp0/temp1;
%t = t+1;
%c = c1;
% end
%
% %%%% 计算方差参数
% classVar = zeros(1,Nr);
% classNum = zeros(1,Nr);
% for k=1:N
%d = (X(k)*ones-c).^2;
%[m,I]=min(d);
%classNum(I) = classNum(I)+1;
%classVar(I) = classVar(I)+(X(k)-c(I))^2;
% end
% classVar = classVar./classNum;
% %classVar = 2;
% %%%% 学习输出层权植
% dww=1;
% a = 0.2;
% nn = 0;
% W0 = randn(1,Nr);
% while dww>0.01
% dww = 0;
% a = a/(1+nn/1000);
% W = W0;
% for k =1:N
%R = exp(-(X(k)*ones(1,Nr)-c).^2./classVar/2);
%y = W*R';
%dW = a*(T(k)-y)*R;
%W = W+dW;
% end
% dww = norm(W-W0);
% W0 = W;
% nn= nn+1;
% end
%
% %%%% 测试学习算法有效性
% t1 = [0:0.05:1];
% Yout1 =zeros(1,N);
% for i =1:N
%R = exp(-(t1(i)*ones(1,Nr)-c).^2./classVar/2);
%Yout1(i) = W*R';
% end
%
% t2 = [0.025:0.05:0.975];
% Yout2 =zeros(1,length(t2));
% for i =1:length(t2)
%R = exp(-(t2(i)*ones(1,Nr)-c).^2./classVar/2);
%Yout2(i) = W*R';
% end
% figure(1);
% plot(t1,Yout1,'b-',t2,Yout2,'r+');
% figure(2);
% plot(X,T,'b-');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%RBF网络用于函数逼近20051219
%%%% 未使用神经网络工具箱,且是实时的,在线算法
%%%%
clear;clc;
X = [0:0.1:1];
N = length(X);
Nr = 6;
T=exp(X)+X.^2+sin(X);
%%%% 计算中心矢量
a = 0.2;
c = randn(1,Nr);
for k =1:N
d = (X(k)*ones(1,Nr)-c).^2;
[m,I]=min(d);
c1 = c;
c1(I) = c(I)+a*[X(k)-c(I)];
c = c1;
a = a/(1+sqrt(k/Nr));
end
%%%% 计算方差
deta = zeros(1,Nr);
for k=1:N
deta = deta + (X(k)*ones(1,Nr)-c).^2;
end
deta = deta/N;
%%%% 权值迭代
R = zeros(1,Nr);
W0 = 0.2*randn(1,Nr);
dww = 1;
a2 = 0.4;
n2 = 0;
while dww>0.001
W = W0;
y = zeros(1,N);
for k =1:N
R = exp(-(X(k)*ones(1,Nr)-c).^2./(2*deta));
y(k) = W*R';%输出
dW = a2*(T(k)-y(k))*R;
W = W+dW; %更新权值
end
dww = norm(W-W0);
n2 = n2+1;
W0 = W;
dE = 0;
for k =1:N
dE = dE+1/2*(T(k)-y(k))^2;
end
E(n2) = dE;
end
%%%% 测试算法
t1 = [0:0.1:1];
Yout1 =zeros(1,N);
for i =1:N
R = exp(-(t1(i)*ones(1,Nr)-c).^2./(2*deta));
Yout1(i) = W*R';
end
t2 = [0:0.05:1];
Yout2 =zeros(1,length(t2));
for i =1:length(t2)
R = exp(-(t2(i)*ones(1,Nr)-c).^2./(2*deta));
Yout2(i) = W*R';
end
figure(1);
plot(t1,Yout1,'b-',t2,Yout2,'r+',X,T,'g-');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%
clear all
close all
s=1;
N=100;% Learning set will be 4*N
N=round(N/4);
% Generate a set of learning sample
% Class one
X00=1.5*[randn(N,1),randn(N,1)]+2*[ones(N,1),ones(N,1)];
X01=1.5*[randn(N,1),randn(N,1)]+2*[-ones(N,1),-ones(N,1)];
X0=[X00;X01];
% Class two
X10=[randn(N,1),randn(N,1)]+3*[-ones(N,1),ones(N,1)];
X11=[randn(N,1),randn(N,1)]+3*[ones(N,1),-ones(N,1)];
X1=[X10;X11];
% Plot double class by distinct colors
figure(1)
whitebg(1,'k');
hold on
plot(X0(:,1),X0(:,2),'ro','linewidth',5)
plot(X1(:,1),X1(:,2),'gs','linewidth',5)
figure(2) % Foranother lamda
whitebg(2,'k');
hold on
plot(X0(:,1),X0(:,2),'ro','linewidth',5)
plot(X1(:,1),X1(:,2),'gs','linewidth',5)
figure(3) % Dullone for depict
whitebg(3,'k');
hold on
plot(X0(:,1),X0(:,2),'ro','linewidth',5)
plot(X1(:,1),X1(:,2),'gs','linewidth',5)
input('anykey to continue')
% Concatenating two class
X=[X0;X1];
D=[ones(2*N,1);-ones(2*N,1)];
% Evaluating G matrix
for n=1:4*N
for m=1:4*N
u=norm(X(n,:)-X(m,:))*2/(2*s^2);
G(m,n)=exp(-u);
end
end
figure(1)
L=0.1;
W1=(inv(G-L.*diag(ones(1,4*N))))*D;
n=0;
for x=min(X(:,1))-1:0.25:max(X(:,1))+1
for y=min(X(:,2))-1:0.25:max(X(:,2))+1
Xin=[x,y];
F=0;
for k=1:4*N
u=-(norm(Xin-X(k,:))^2/(2*s^2));
F=F+W1(k)*exp(u);
end
if F>0.0,
plot(x,y,'c.')
end
end
end
axis([min(X(:,1))-1,max(X(:,1))+1,min(X(:,2))-1,max(X(:,2))+1]);
figure(2)
L=0.5;
W2=(inv(G-L.*diag(ones(1,4*N))))*D;
n=0;
for x=min(X(:,1))-1:0.25:max(X(:,1))+1
for y=min(X(:,2))-1:0.25:max(X(:,2))+1
Xin=[x,y];
F=0;
for k=1:4*N
u=-(norm(Xin-X(k,:))^2/(2*s^2));
F=F+W2(k)*exp(u);
end
if F>0.0,
plot(x,y,'c.')
end
end
end
axis([min(X(:,1))-1,max(X(:,1))+1,min(X(:,2))-1,max(X(:,2))+1]);