m基于ESN+BP神经网络的数据预测算法matlab仿真,测试数据为太阳黑子变化数据
目錄
1.算法描述
2.仿真效果預覽
3.MATLAB核心程序
4.完整MATLAB
1.算法描述
? ? ? ?在人工神經網絡的發展歷史上,感知機(Multilayer Perceptron,MLP)網絡曾對人工神經網絡的發展發揮了極大的作用,也被認為是一種真正能夠使用的人工神經網絡模型,它的出現曾掀起了人們研究人工神經元網絡的熱潮。單層感知網絡(M-P模型)做為最初的神經網絡,具有模型清晰、結構簡單、計算量小等優點。但是,隨著研究工作的深入,人們發現它還存在不足,例如無法處理非線性問題,即使計算單元的作用函數不用閥函數而用其他較復雜的非線性函數,仍然只能解決線性可分問題.不能實現某些基本功能,從而限制了它的應用。增強網絡的分類和識別能力、解決非線性問題的唯一途徑是采用多層前饋網絡,即在輸入層和輸出層之間加上隱含層。構成多層前饋感知器網絡。
? ? ? ?BP神經網絡具有任意復雜的模式分類能力和優良的多維函數映射能力,解決了簡單感知器不能解決的異或(Exclusive OR,XOR)和一些其他問題。從結構上講,BP網絡具有輸入層、隱藏層和輸出層;從本質上講,BP算法就是以網絡誤差平方為目標函數、采用梯度下降法來計算目標函數的最小值。
? ? ? ?神經網絡主要由處理單元、網絡拓撲結構、訓練規則組成。處理單元是神經網絡的基本操作單元,用以模擬人腦神經元的功能。一個處理單元有多個輸入、輸出,輸入端模擬腦神經的樹突功能,起信息傳遞作用;輸出端模擬腦神經的軸突功能,將處理后的信息傳給下一個處理單元,如圖1.1所示。
基本的神經處理單元其等效于人體的神經元,如圖2所示,
?
? ? ? ? ESN是Jaeger于2001年提出一種新型遞歸神經網絡,ESN一經提出便成為學術界的熱點,并被大量地應用到各種不同的領域中,包括動態模式分類、機器人控制、對象跟蹤核運動目標檢測、事件監測等,尤其是在時間序列預測問題上,取得了較為突出的貢獻。Jaeger本人在提出這種神經網絡的第二年便在國際知名期刊上發表了關于將ESN網絡用于時間序列預測的文章,為后來其發展做出了巨大的貢獻。另外,國內大連理工大學的韓敏等人在ESN的使用方面也做出了突出的貢獻。
ESN具有以下特點:
- 大且稀疏生物連接,RNN被當做一個動態水庫
- 動態水庫可以由輸入或/和輸出的反饋激活
- 水庫的連接權值不會被訓練改變?
- 只有水庫的輸出單元的權值隨訓練改變,因此訓練是一個線性回歸任務
假設有ESN是一個可調諧的sin波生成器:
- 黑色箭頭是指固定的輸入和反饋連接
- 紅色箭頭指可訓練的輸出連接
- 灰色表示循環內連接的動態水庫
? ? ? ? 在原始的ESN中,權值的計算是通過pseudoinverse.m這個函數進行計算的,其內容就是:
??????
即:
?? ???
??????? 這里,我們的主要方法為:
??????? 將計算得到的權值作為bp神經網絡迭代的初始值,然后以這個初始值為迭代過程的第一個值,不斷的訓練迭代,最后得到ESN-BP輸出的權值,然后進行測試。
下面給出整個算法的流程框圖:
2.仿真效果預覽
matlab2022a仿真結果如下:
?
?
3.MATLAB核心程序
function esn = generate_esn(nInputUnits, nInternalUnits, nOutputUnits, varargin)%%%% set the number of units esn.nInternalUnits = nInternalUnits; esn.nInputUnits = nInputUnits; esn.nOutputUnits = nOutputUnits; connectivity = min([10/nInternalUnits 1]); nTotalUnits = nInternalUnits + nInputUnits + nOutputUnits; esn.internalWeights_UnitSR = generate_internal_weights(nInternalUnits,connectivity);esn.nTotalUnits = nTotalUnits; % input weight matrix has weight vectors per input unit in colums esn.inputWeights = 2.0 * rand(nInternalUnits, nInputUnits)- 1.0;% output weight matrix has weights for output units in rows % includes weights for input-to-output connections esn.outputWeights = zeros(nOutputUnits, nInternalUnits + nInputUnits);%output feedback weight matrix has weights in columns esn.feedbackWeights = (2.0 * rand(nInternalUnits, nOutputUnits)- 1.0);%init default parameters esn.inputScaling = ones(nInputUnits, 1); esn.inputShift = zeros(nInputUnits, 1); esn.teacherScaling= ones(nOutputUnits, 1); esn.teacherShift = zeros(nOutputUnits, 1); esn.noiseLevel = 0.0 ; esn.reservoirActivationFunction = 'tanh'; esn.outputActivationFunction = 'identity' ; % options: identity or tanh or sigmoid01 esn.methodWeightCompute = 'pseudoinverse' ; % options: pseudoinverse and wiener_hopf esn.inverseOutputActivationFunction = 'identity' ; esn.spectralRadius = 1 ; esn.feedbackScaling = zeros(nOutputUnits, 1); esn.trained = 0 ; esn.type = 'plain_esn' ; esn.timeConstants = ones(esn.nInternalUnits,1); esn.leakage = 0.5; esn.learningMode = 'offline_singleTimeSeries' ; esn.RLS_lambda = 1 ; args = varargin; nargs= length(args); for i=1:2:nargsswitch args{i},case 'inputScaling', esn.inputScaling = args{i+1} ; case 'inputShift', esn.inputShift= args{i+1} ; case 'teacherScaling', esn.teacherScaling = args{i+1} ; case 'teacherShift', esn.teacherShift = args{i+1} ; case 'noiseLevel', esn.noiseLevel = args{i+1} ; case 'learningMode', esn.learningMode = args{i+1} ; case 'reservoirActivationFunction',esn.reservoirActivationFunction=args{i+1};case 'outputActivationFunction',esn.outputActivationFunction= args{i+1}; case 'inverseOutputActivationFunction', esn.inverseOutputActivationFunction=args{i+1}; case 'methodWeightCompute', esn.methodWeightCompute = args{i+1} ; case 'spectralRadius', esn.spectralRadius = args{i+1} ; case 'feedbackScaling', esn.feedbackScaling = args{i+1} ; case 'type' , esn.type = args{i+1} ; case 'timeConstants' , esn.timeConstants = args{i+1} ; case 'leakage' , esn.leakage = args{i+1} ; case 'RLS_lambda' , esn.RLS_lambda = args{i+1};case 'RLS_delta' , esn.RLS_delta = args{i+1};otherwise error('the option does not exist'); end end 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 global nInputUnits; global nInternalUnits; global nOutputUnits; nInputUnits = 2; nInternalUnits = 8; 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+1:end),'b'); hold on plot(predictedTestOutput,'r'); legend('原數據','預測數據'); title('ESN-BP:測試數據的預測');05_022_m4.完整MATLAB
V
總結
以上是生活随笔為你收集整理的m基于ESN+BP神经网络的数据预测算法matlab仿真,测试数据为太阳黑子变化数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 与java类似的电脑程序语言_2018十
- 下一篇: 如何将KUX格式转换为MP4格式