基于RBF神经网络的函数曲线拟合

上次的微信小文中,我们通过在MATLAB中导入libsvm工具包,进行了函数拟合的实验。本次仿真实验中,我们使用RBF神经网络进行函数拟合。

1、RBF网络简介

径向基函数(Radical Basis Function, RBF)是多维空间插值的传统技术,是一种高效的前馈式神经网络,它具有其他前向网络所不具有的最佳逼近性能和全局最优特性,并且结构简单,训练速度快。其结构与多层前向网络类似,是一种三层的前向网络。第一层为输入层,由信号源结点组成;第二层为隐藏层,隐藏层节点数视所描述问题的需要而定,隐藏层中神经元的变换函数(径向基函数)是对中心点径向对称且衰减的非负非线性函数,该函数是局部响应函数;第三层为输出层,它对输入模式作出响应。

2、所用函数介绍

(1) newrb()

该函数可以用来设计一个近似(approximate)径向基网络。其调用格式为:

[net,tr]=newrb(P,T,GOAL,SPREAD,MN,DF)

其中,P为Q组输入向量组成的R*Q维矩阵;T为Q组目标分类向量组成的S*Q 维矩阵;GOAL为均方误差目标(Mean Squared Error Goal),默认为0.0;SPREAD为径向基函数的扩展速度,默认为l;MN为神经元的最大数目,默认为Q;DF为两次显示之间所添加的神经元数目,默认为25;net与tr是该函数的返回值,前者为RBF网络,后者为训练记录。

(2)newrbe()

该函数用于设计一个精确径向基网络。其调用格式为:

net=newrbe(P,T,SPREAD)

其中,P为Q组输入向量组成的R*Q维矩阵;T为Q组目标分类向量组成的S*Q维矩阵;SPREAD为径向基函数的扩展速度,默认为1。

newrb()不同,newrbe()能够基于设计向量快速、无误差地设计一个径向基网络。

(3) radbas()

该函数为径向基传递函数。其调用格式为:

A=radbas(N)

info=radbas(code)

其中,N为输入(列)向量的S*Q维矩阵;A为函数返回矩阵,与N一一对应,即N中的每个元素通过径向基函数得到A; info=radbas(code)表示根据code值的不同返回有关函数的不同信息。包括

derive——返回导函数的名称。

name——返回函数全称。

output——返回输入范围。

active——返回可用输入范围。

3、仿真结果

在仿真实验中,所使用的待拟合函数为:

F=20+x12-10*cos(2*Π*x1)+x22-10*cos(2*Π*x2);

图片

图1 实验结果及误差

从实验结果来看,RBF神经网络拟合图像与原始的函数图像基本相同,将它们两者相减得到的结果作为误差,由误差图像可看出,RBF对非线性函数的拟合效果很好。


孙宁,重庆大学无线通信技术实验室硕士研究生,主研方向为AI在无线通信中的应用。


附:代码及注释

%%MATLAB标准三连

clc;clear;clear all

%%产生训练样本(训练输入,训练输出)

ld= 400;%ld 为样本例数

x = rand(2,ld);%产生2 *ld 的矩阵

x= (x - 0.5)*1.5 *2;%将x 转换到[-1.5 1.5]之间

x1 = x(1,:);%x 的第一行为x1,第二行为x2

x2 = x(2 ,:);

F=20+x1.^2-10*cos(2*pi*x1)+x2.^2-10*cos(2*pi*x2);%构建需要拟合的函数

%%建立RBF 神经网络

net=newrb(x, F);%采用approximate RBF神经网络。spread为默认值

%%产生测试样本

interval=0.1 ;%步长,用于产生样本

[i, j] = meshgrid( - 1.5:interval:1.5);

row= size( i);

tx1 = i(:);

tx1 = tx1';

tx2 = j(:);

tx2 = tx2';

tx=[tx1; tx2];

ty = sim(net, tx);

%%画出函数三维图

interval = 0.1 ;

[x1, x2]=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([0, 60] )

title('函数图像')

%%画出拟合的函数图像

v= reshape(ty, row);

subplot(1, 3, 2)

mesh(i,j,v);

zlim([0,60])

title('RBF拟合结果')

%%误差图像

subplot(1, 3, 3)

mesh(x1, x2, F-v);

zlim( [ 0,60])

title ('误差图像')

set(gcf, 'position', [300, 250, 900,400])



猜你喜欢

转载自blog.51cto.com/15127585/2670713