RBF神经网络
RBF网络视频:链接:http://pan.baidu.com/s/1bpzy7Zx 密码:iiosRBF视频资料:链接:http://pan.baidu.com/s/1bOSOu6 密码:d8lb
RBF网络
径向基函数(RBF-Radial Basis Function)神经网络是由J. Moody和C. Darken在80年代末提出的一种神经网络,它是具有单隐层的三层前馈网络。由于它模拟了人脑中局部调整、相互覆盖接收域(或称感受野-Receptive Field)的神经网络结构,因此,RBF网络是一种局部逼近网络,已证明它能任意精度逼近任意连续函数。
RBF网络的学习过程与BP网络的学习过程类似,两者的主要区别在于各使用不同的作用函数。BP网络中隐层使用的是Sigmoid函数,其值在输入空间中无限大的范围内为非零值,因而是一种全局逼近的神经网络;而RBF网络中的作用函数是高斯基函数,其值在输入空间中有限范围内为非零值,因为RBF网络是局部逼近的神经网络。
理论上,3层以上的BP网络能够逼近任何一个非线性函数,但由于BP网络是全局逼近网络,每一次样本学习都要重新调整网络的所有犬只,收敛速度慢,易于陷入局部最小,很难满足控制系统的高度实时性要求。RBF网络是一种3层前向网络,由输入到输出的映射是非线性的,而隐层空间到输出空间的映射是线性的,而且RBF网络局部逼近的神经网络,因而采用RBF网络大大加快学习速度并避免局部极小问题,适合于实时控制的要求。采用RBF网络构成神经网络控制方案,可有效提高系统的精度、鲁棒性和自适应性。
RBF网络特点
(1) RBF网络的作用函数为高斯函数,是局部的,BP网络的作用函数为S函数,是全局的;
(2) 如何确定RBF网络隐层节点的中心及基宽度参数是一个困难的问题;
(3) 已证明RBF网络具有唯一最佳逼近的特性,且无局部极小
RBF网络结构
RBF网络是一种三层前向网络,由于输入到输出的映射是非线性的,而隐含层空间到输出空间的映射是线性的,从而可以大大加快学习速度并避免局部极小问题。多输入单输出的RBF网络结构如图1所示。
具体原理参考
刘金琨.智能控制,北京:电子工业出版社,2008. 刘金琨.先进PID控制MATLAB仿真(第3版),北京:电子工业出版社,2011. 余胜威. MATLAB优化算法案例分析与应用.清华大学出版社,2014.rbf底层代码:http://cn.mathworks.com/matlabcentral/fileexchange/22173-radial-basis-function-network RBF网络
clc,clear,close all % 清理命令区、清理工作区、关闭显示图形
warning off % 消除警告
feature jit off % 加速代码运行
format long % 数据类型
tic % 运算计时
global wd sd fs md sj nh inputnum hiddennum outputnum net
load('librarydata.mat'); % 加载参数
wd = data(:,1); % 温度
sd = data(:,2); % 湿度
fs = data(:,3); % 辐射
md = data(:,4); % 密度
sj = data(:,5); % 时间
nh = data(:,6); % 能耗
% 训练数据和预测数据
n=size(data); % 矩阵维数
input=data(:,1:5); % 作为输入
output=; % 作为目标向量输出
input_train=input(1:n(1,1)-10,:)'; % 训练数据
input_test=input(n(1,1)-10+1:end,:)'; % 测试数据,6组测试数据
output_train=output(1:n(1,1)-10,:)'; % 训练数据输出量
output_test=output(n(1,1)-10+1:end,:)'; % 测试数据输出量
% 选连样本输入输出数据归一化
=mapminmax(input_train);
=mapminmax(output_train);
p = inputn; % 网络输入
t = outputn; % 网络输出
% 节点个数
inputnum = 5; % 输入节点
hiddennum = size(p,2); % 隐藏节点
outputnum = 1; % 输出节点
%% RBF
% Dimensions
= size(p);
= size(t);
% Architecture
net = network(1,2,,,,);
% Simulation
net.inputs{1}.size = R;
net.layers{1}.size = Q;
net.inputWeights{1,1}.weightFcn = 'dist';
net.layers{1}.netInputFcn = 'netprod';
net.layers{1}.transferFcn = 'radbas';
net.layers{2}.size = S;
net.outputs{2}.exampleOutput = t;
= size(p);
= size(t);
% 权值和阈值
w1 = p'; % 权值
b1 = ones(q,1)*sqrt(-log(.5)); % 阈值
a1 = radbas(dist(w1,p).*(b1*ones(1,q)));
x = t/;
w2 = x(:,1:q);
b2 = x(:,q+1);
net.b{1} = b1;
net.iw{1,1} = w1;
net.b{2} = b2;
net.lw{2,1} = w2;
%% 结果预测
% 优化的网络进行预测 -- 训练数据
ty=sim(net,p); % 预测值
err = t-ty; % 误差
figure(2) % 误差曲线
plot(err,'bo-','linewidth',2);title('训练数据误差曲线');
figure(3) % 训练数据 实际值与预测值
plot(output_train,'bo-','linewidth',2);
train_simu=mapminmax('reverse',ty,outputps);% 训练数据预测值
hold on;plot(train_simu,'ro-','linewidth',2);
legend('训练数据实际值','训练数据预测值');
train_RMSE = mse(abs(err)) % RMSE 均方根误差
train_R2 = corr(t',ty').^2 % R2 样本决定系数 % 改进的粒子群算法
clc,clear,close all % 清理命令区、清理工作区、关闭显示图形
warning off % 消除警告
feature jit off % 加速代码运行
format long % 数据类型
tic % 运算计时
global ani bni hni dni eni fni gnj si Dij Wnmax Mnmax Fnmax e b r alpha
parameters; % 加载参数
%% PSO算法参数初始化
% PSO粒子群算法中的两个参数
c1 = 2; % 学习因子1
c2 = 2; % 学习因子2
w0 = 0.5; % 惯性权重
iter = 30; % 进化次数
sizepop = 1000; % 精英种群
Vmax = 20; % 粒子速度上限
Vmin = -20; % 粒子速度下限
% P O H v Y
minbound = ; % 粒子取值范围下限
maxbound = ;% 粒子取值范围上限
%% 产生初始粒子和速度
for i=1:sizepop
% 随机产生一个种群
for j=1:length(minbound)
pop(i,j) = round( minbound(j) + (maxbound(j)-minbound(j))*rand );
end
= PSO_fitness(pop(i,:)); % 适应度值
end
V = Vmax*rands(size(pop,1),size(pop,2)); % 初始化速度
%% 找最好的粒子种群
= min(fitness);% 最小适应度值
zbest = pop(best_index,:); % 全局最佳
fitnesszbest = bestfitness;% 全局最佳适应度值
gbest = pop; % 个体最佳
fitnessgbest = fitness; % 个体最佳适应度值
%% 迭代寻优
wmax = w0; % 最大权值
wmin = 0.05; % 最小权值
w = wmin:(wmax-wmin)/(sizepop-1):wmax;% 权重线性递增
for i=1:iter
disp(['当前迭代次数:',num2str(i)]) % 迭代次数
for j=1:sizepop
% 速度更新
V(j,:) = w(j)*V(j,:) + c1*rand*(gbest(j,:) - pop(j,:)) + c2*rand*(zbest - pop(j,:));
V(j,find(V(j,:)>Vmax))=Vmax;% 上限
V(j,find(V(j,:)<Vmin))=Vmin;% 下限
% 种群更新
pop(j,:) = round( (pop(j,:)+0.5*V(j,:)) ); % 取整
% pop个体取值范围约束
for np = 1:size(pop,2)
if pop(j,np)>maxbound(1,np) % 上限
pop(j,np)=maxbound(1,np);
elseif pop(j,np)<minbound(1,np) % 下限
pop(j,np)=minbound(1,np);
end
end
% 适应度值更新
= PSO_fitness(pop(j,:));
% 个体最优更新
if fitness(j) < fitnessgbest(j)
gbest(j,:) = pop(j,:);
fitnessgbest(j) = fitness(j);
end
% 群体最优更新
if fitness(j) < fitnesszbest
zbest = pop(j,:);
fitnesszbest = fitness(j);
end
end
M(i)=fitnesszbest; % 最优适应度值
end
% 结果分析
=funy(zbest)
figure('color',)
plot(M,'Linewidth',2)
title(['适应度曲线' '终止代数=' num2str(iter)]);
grid on
xlabel('进化代数');ylabel('适应度值Fit');
% 结果
% RBF网络逼近函数程序
function =PSO_RBF(p)
global cy mc mj ql jb
% 网络学习参数
alfa=0.08;% 动量因子
xite=0.7; % 学习因子
x=';
% 节点个数
inputnum = 4; % 输入节点
hiddennum = 3; % 隐藏节点
outputnum = 1; % 输出节点
% b=1.5*ones(hiddennum,1);
% c=0.5*ones(inputnum,hiddennum);
% w=rands(hiddennum,outputnum);
b=;
c=[p(4),p(5),p(6);
p(7),p(8),p(9);
p(10),p(11),p(12);
p(13),p(14),p(15)];
w=;
w_1=w;w_2=w_1;
c_1=c;c_2=c_1;
b_1=b;b_2=b_1;
y_1=0;
for k=1:1:length(jb)
x(1)=cy(k);% 4个输入值
x(2)=mc(k);
x(3)=mj(k);
x(4)=ql(k);
y(k)=jb(k);% 输出值
for j=1:1:hiddennum
h(j)=exp(-norm(x-c(:,j))^2/(2*b(j)*b(j)));% 高斯基函数
end
ym(k)=w'*h';
em(k)=y(k)-ym(k);
dd_w=0*w; d_b=0*b; d_c=0*c;
for j=1:1:hiddennum
d_w(j,1)=xite*em(k)*h(j);
d_b(j,1)=xite*em(k)*w(j)*h(j)*(b(j)^-3)*norm(x-c(:,j))^2;
for i=1:1:inputnum
d_c(i,j)=xite*em(k)*w(j)*h(j)*(x(i)-c(i,j))*(b(j)^-2);
end
end
w=w_1+ d_w+alfa*(w_1-w_2);
b=b_1+d_b+alfa*(b_1-b_2);
c=c_1+d_c+alfa*(c_1-c_2);
y_1=y(k);
w_2=w_1; w_1=w;
c_2=c_1; c_1=c;
b_2=b_1; b_1=b;
end
fitness = sum(sum( abs(em) ));
RBF也可以简单的采用MATLAB工具箱函数:
clc;
clear;
close all;
%???????, generate the learing data
ld=400; %???????
x=rand(2,ld); %0-1
x=(x-0.5)*1.5*2; %-1.5, 1.5
x1=x(1,:);
x2=x(2,:);
F=20+x1.^2-10*cos(2*pi*x1)+x2.^2-10*cos(2*pi*x2);
%???????
net=newrb(x,F);
%generate the testing data
interval=0.1;
=meshgrid(-1.5:interval:1.5);
row=size(i);
tx1=i(:);
tx1=tx1';
tx2=j(:);
tx2=tx2';
tx=;
%testing
ty=sim(net,tx);
v=reshape(ty,row);
figure
subplot(1,3,2)
mesh(i,j,v);
zlim()
%plot the original function
interval=0.1;
=meshgrid(-1.5:interval:1.5);
F = 20+x1.^2-10*cos(2*pi*x1)+x2.^2-10*cos(2*pi*x2);
subplot(1,3,1)
mesh(x1,x2,F);
zlim()
%plot the error
subplot(1,3,3)
mesh(x1,x2,F-v);
zlim()%Generate some training data
clc;
clear;
interval=0.01;
x1=-1.5:interval:1.5;
x2=-1.5:interval:1.5;
F = 20+x1.^2-10*cos(2*pi*x1)+x2.^2-10*cos(2*pi*x2);
net=newrbe(,F)
ty=sim(net,);
figure
plot3(x1,x2,F,'g');
figure
plot3(x1,x2,ty,'b');
Neural Network RBF Regression:
clc,clear,close all;
warning off;
n1 = 1:2:200;
x1 = sin(n1*0.1);
n2 = 2:2:200;
x2 = sin(n2*0.1);
xn_train = n1;
dn_train = x1;
xn_test = n2;
dn_test = x2;
%---------------------------------------------------
switch 1
case 1
P = xn_train;
T = dn_train;
spread = 40;
net = newrbe(P,T,spread);
case 2
P = xn_train;
T = dn_train;
goal = 1e-12;
spread = 40;
MN = size(xn_train,2);
DF = 1;
net = newrb(P,T,goal,spread,MN,DF);
case 3
P = xn_train;
T = dn_train;
spread = 0.5;
net = newgrnn(P,T,spread);
end
err1 = sum((dn_train-sim(net,xn_train)).^2)
X = sim(net,xn_test);
err2 = sum((dn_test-X).^2)
%---------------------------------------------------
plot(1:length(n2),x2,'r+:',1:length(n2),X,'bo:')
页:
[1]