m基于RBF神经网络的数据预测matlab仿真,测试数据分别采用趋势型数据,周期型数据以及混乱型数据

1.算法描述

1985年,Powell提出了多变量插值的径向基函数(RBF)方法。径向基函数是一个取值仅仅依赖于离原点距离的实值函数,也可以是到任意一点c的距离,c点称为中心点。任意满足上述特性的函数,都可以叫做径向基函数。一般使用欧氏距离计算距离中心点的距离(欧式径向基函数)。最常用的径向基函数是高斯核函数。RBF神经网络只有三层,即输入层、隐藏层、输出层。



用RBF作为隐藏层单元的激活函数,将输入数据映射到高维隐藏空间,不需要通过权值连接,当RBF的中心点确定后,映射关系也就确定了。比如图2中的隐藏层c1-ch,需要确定h个中心点。


隐藏层到输出层的映射是线性的,即网络的输出是隐藏单元输出的线性加权求和,这里的权重(w)即为网络的可调参数。


注意:隐含层的作用是把向量从低维度的p映射到高维度的h,这样低维度线性不可分的情况到高维度就可以变得线性可分了,主要就是核函数的思想。这样,网络由输入到输出的映射是非线性的;而网络输出对可调参数而言却又是线性的,网络的权就可由线性方程组直接解出,从而大大加快学习速度并避免局部极小问题。


径向基神经网络的激活函数可表示为:



其中xp为第p个输入样本,ci为第i个中心点,h为隐含层的结点数,n是输出的样本数或分类数。径向基神经网络的结构可得到网络的输出为:



RBF神经网络的隐节点采用输入模式与中心向量的距离(如欧式距离)作为函数的自变量,并使用径向基函数(如Gaussian函数)作为激活函数。神经元的输入离径向基函数中心越远,神经元的激活程度就越低(高斯函数)。


2.仿真效果预览

matlab2022a仿真结果如下:




3.MATLAB核心程序

load data3.mat

%%

%选择100个数据作为输入

Data = data3(1:100);

%%

%选择20个训练数据

t11         = 1:10;

Train_data1 = Data(1:10);

t12         = 1:10;

spread = 1;

goal   = 0.01;

df     = 1;

mn     = length(t11);

net    = newrb(t11,Train_data1,goal,spread,mn,df);


yc1    = sim(net,t12);

%%

%选择70个训练数据

t21         = 1:60;

Train_data2 = Data(1:60);

t22         = 1:60;


spread = 1;

goal   = 0.01;

df     = 1;

mn     = length(t21);

net    = newrb(t22,Train_data2,goal,spread,mn,df);

yc2    = sim(net,t22);


figure;

plot(t21,Train_data2,'b-o');

hold on;

plot(t22,yc2,'r-*');

hold off;

grid on;




%%

%%对比计算结果

mser11 = func_mse(Train_data1);

mser12 = func_mse(yc1);

sder1  = func_sd(yc1);

sdrer1 = func_sdr(yc1,Train_data1);

coeff1 = func_pcc(yc1,Train_data1);


fprintf('Inputs    Train data points    MSE training    MSE testing     PCC         SDR         SD\n');

%%

%下面的程序是画图

cnt = 0;

for i = 10:2:60

i

cnt         = cnt + 1;

t01         = 1:i;

Train_data0 = Data(1:i);

t02         = 1:i;

spread      = 1;

goal        = 0.01;

df          = 1;

mn          = length(t01);

net         = newrb(t02,Train_data0,goal,spread,mn,df);

yc0         = sim(net,t02);

%%

%%对比计算结果

mser01(cnt) = func_mse(Train_data0);

mser02(cnt) = func_mse(yc0);

sder0(cnt)  = func_sd(yc0);

sdrer0(cnt) = func_sdr(yc0,Train_data0);   

end

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容