m分别使用ESN网络,ESN+RBF神经网络以及ESN+Volterra网络进行数据预测对比仿真
1.算法描述
ESN是Jaeger于2001年提出一种新型递归神经网络,ESN一经提出便成为学术界的热点,并被大量地应用到各种不同的领域中,包括动态模式分类、机器人控制、对象跟踪核运动目标检测、事件监测等,尤其是在时间序列预测问题上,取得了较为突出的贡献。Jaeger本人在提出这种神经网络的第二年便在国际知名期刊上发表了关于将ESN网络用于时间序列预测的文章,为后来其发展做出了巨大的贡献。另外,国内大连理工大学的韩敏等人在ESN的使用方面也做出了突出的贡献。
ESN具有以下特点:
大且稀疏生物连接,RNN被当做一个动态水库
动态水库可以由输入或/和输出的反馈激活
水库的连接权值不会被训练改变?
只有水库的输出单元的权值随训练改变,因此训练是一个线性回归任务
假设有ESN是一个可调谐的sin波生成器:
黑色箭头是指固定的输入和反馈连接
红色箭头指可训练的输出连接
灰色表示循环内连接的动态水库
Volterra滤波器的基本结构如下所示:
使用RBF网络,对ESN得到的W权值进行迭代跟新,我这里,使用的方法为是将RBF网络构架整合到ESN中,使得ESN的权值输出为非线性模型,从而提升性能。其基本原理如下所示:
对于RBF神经网络的学习算法,关键问题是隐层神经元中心参数的合理确定。在已有的常用学习算法中,中心参数要么是从给定的训练集样本中按照某种方法直接选取,要么采用聚类的方法进行确定。实际应用表明,这些学习算法均有不足之处,使之应用范围受到限制。如正交优选法,其缺点是隐层神经元中心的取值是训练集样本中的数据,这在多数情况下难以反映系统的真正映射关系,且在中心点的优选过程中会出现病态现象,导致训练失败。再如Moody和Darken算法,其缺点是无法合理地确定隐层神经元的数目,所得到的中心值也未必是合理的。
最基本的RBF神经网络的构成包括三层,分别为输入层、隐层(中间层)和输出层。其中输入层由一些源点(感知单元)组成,它们将网络与外部环境连接起来,仅起到数据信息的传递作用,对输入信息不进行任何变换;隐层神经元的核函数(或称作用函数)取为径向基函数,对输入信息到隐层空间之间进行非线性变换,通常具有较高的维数;输出层是线性的,为输入层的激活模式提供响应。
RBF神经网络的参数在此主要是指网络的中心、宽度、和调节权重。
2.仿真效果预览
matlab2022a仿真结果如下:
3.MATLAB核心程序
%lorenz_series sequenceLength = 2100; load data.mat %每个变量需提取的数目 ext = 2; inputSequence = zeros(2098,2*ext); outputSequence = zeros(2098,1) ; for i=ext+1:2100 outputSequence(i-ext,1)=lorenz_series(i,1); for j=1:ext inputSequence(i-ext,j)=lorenz_series(i-j,1); end Ystart=ext+1; Yend=2*ext; for k=Ystart:Yend neednum=k-ext; inputSequence(i-ext,k)=lorenz_series(i-neednum,2); end end %ESN %split the data into train and test train_fraction = 0.5 ; % use 50% in training and 50% in testing [trainInputSequence, testInputSequence] = split_train_test(inputSequence,train_fraction); [trainOutputSequence,testOutputSequence] = split_train_test(outputSequence,train_fraction); %generate an esn nInputUnits = 4; nInternalUnits = 100; nOutputUnits = 1; esn = generate_esn(nInputUnits,nInternalUnits,nOutputUnits, ... 'spectralRadius',0.9,... 'inputScaling',[0.1;0.1;0.1;0.1],... 'inputShift',[0;0;0;0],... 'teacherScaling',0.3,... 'teacherShift',-0.2,... 'feedbackScaling',0,... 'type', 'plain_esn'); esn.internalWeights = esn.spectralRadius * esn.internalWeights_UnitSR; %train the ESN nForgetPoints = 100 ; % discard the first 100 points [trainedEsn,stateMatrix] = train_esn(trainInputSequence, trainOutputSequence, esn, nForgetPoints) ; predictedTrainOutput = test_esn(trainInputSequence, trainedEsn, nForgetPoints); predictedTestOutput = test_esn(testInputSequence, trainedEsn, nForgetPoints) ; nPlotPoints = length(predictedTestOutput);