單獨的ESN仿真:
ESN的運作結果如下所示:
這個部分的誤差為:
0.0435
ESN部分就不多做介紹了,你應該了解的,下面我們對ESN和BP改進和極限學習改進分别進行修改和說明,并進行仿真。
ESN+BP的仿真:
首先,在原始的ESN中,權值的計算是通過pseudoinverse.m這個函數進行計算的,其主要内容就是:
即:
這裡,我們的主要方法為:
将
計算得到的權值作為bp神經網絡疊代的初始值,然後以這個初始值為疊代過程的第一個值,不斷的訓練疊代,最後得到ESN-BP輸出的權值,然後進行測試。
是以,其基本思路就是通過B-1T得到初始權值,然後通過bp網絡進行疊代,得到最後優化後的值。
計算後的誤差為0.0427
從上面的對比可知,采用BP神經網絡進行權值系數的非線性更新之後,其誤差可以進一步降低。但提升性能有限。
ESN+極限學習算法的仿真:
這個部分的原理和上面的相同,不同的是,我們需要使用極限學習方法對ESN網絡的中的權值進行更新。
誤差為:0.1050
下面給出整個算法的流程框圖:
2.部分核心代碼
clc;
clear;
close all;
warning off;
RandStream.setDefaultStream(RandStream('mt19937ar','seed',1));
addpath 'func\data_process\'
addpath 'func\Initial_ESN\'
addpath 'func\train_esn\'
addpath 'func\test_esn\'
load data.mat
%資料分割
train_fraction = 0.5;
[trainInputSequence, testInputSequence] = split_train_test(inputSequence,train_fraction);
[trainOutputSequence,testOutputSequence] = split_train_test(outputSequence,train_fraction);
%generate an esn
nInputUnits = 2;
nInternalUnits = 32;
nOutputUnits = 1;
esn = generate_esn(nInputUnits,nInternalUnits,nOutputUnits,'spectralRadius',0.5,'inputScaling',[0.1;0.1],'inputShift',[0;0],'teacherScaling',[0.3],'teacherShift',[-0.2],'feedbackScaling',0,'type','plain_esn');
esn.internalWeights = esn.spectralRadius * esn.internalWeights_UnitSR;
%train the ESN
%discard the first 100 points
nForgetPoints = 100;
%這裡,就固定設定一種預設的學習方式,其他的就注釋掉了
[trainedEsn,stateMatrix] = train_esn(trainInputSequence,trainOutputSequence,esn,nForgetPoints) ;
%test the ESN
nForgetPoints = 100 ;
predictedTrainOutput = test_esn(trainInputSequence, trainedEsn, nForgetPoints);
predictedTestOutput = test_esn(testInputSequence, trainedEsn, nForgetPoints) ;
figure;
plot(testOutputSequence(nForgetPoints+4:end),'b');
hold on
plot(predictedTestOutput,'r');
legend('原資料','預測資料');
title('ESN-ELM:測試資料的預測');
%計算測試資料的預測結果:
estimatedOutput = predictedTestOutput(1:end-3);
correctOutput = testOutputSequence(nForgetPoints+4:end);
nEstimatePoints = length(estimatedOutput) ;
nForgetPoints = length(correctOutput) - nEstimatePoints ;
correctVariance = 1;
meanerror = sum((estimatedOutput - correctOutput).^2)/nEstimatePoints ;
err =(sqrt(meanerror./correctVariance));
err
3.參考文獻
A05-22