Halcom 发表于 2016-12-4 20:59:46

RBF神经网络

RBF网络视频:链接:http://pan.baidu.com/s/1bpzy7Zx 密码:iios
RBF视频资料:链接: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

Halcom 发表于 2016-12-31 18:50:46

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   样本决定系数

Halcom 发表于 2016-12-31 18:52:52

% 改进的粒子群算法
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) ));

Halcom 发表于 2016-12-31 19:04:47

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');





Halcom 发表于 2017-12-16 21:21:14

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]
查看完整版本: RBF神经网络