【預(yù)測(cè)模型】基于差分進(jìn)化算法優(yōu)化BP神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)數(shù)據(jù)預(yù)測(cè)matlab源碼
1 算法介紹
說(shuō)明:1.1節(jié)主要是概括和幫助理解考慮影響因素的BP神經(jīng)網(wǎng)絡(luò)算法原理,即常規(guī)的BP模型訓(xùn)練原理講解(可根據(jù)自身掌握的知識(shí)是否跳過(guò))。1.2節(jié)開(kāi)始講基于歷史值影響的BP神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)模型。
使用BP神經(jīng)網(wǎng)絡(luò)進(jìn)行預(yù)測(cè)時(shí),從考慮的輸入指標(biāo)角度,主要有兩類(lèi)模型:
1.1 受相關(guān)指標(biāo)影響的BP神經(jīng)網(wǎng)絡(luò)算法原理
如圖一所示,使用MATLAB的newff函數(shù)訓(xùn)練BP時(shí),可以看到大部分情況是三層的神經(jīng)網(wǎng)絡(luò)(即輸入層,隱含層,輸出層)。這里幫助理解下神經(jīng)網(wǎng)絡(luò)原理:
1)輸入層:相當(dāng)于人的五官,五官獲取外部信息,對(duì)應(yīng)神經(jīng)網(wǎng)絡(luò)模型input端口接收輸入數(shù)據(jù)的過(guò)程。
2)隱含層:對(duì)應(yīng)人的大腦,大腦對(duì)五官傳遞來(lái)的數(shù)據(jù)進(jìn)行分析和思考,神經(jīng)網(wǎng)絡(luò)的隱含層hidden Layer對(duì)輸入層傳來(lái)的數(shù)據(jù)x進(jìn)行映射,簡(jiǎn)單理解為一個(gè)公式hiddenLayer_output=F(w*x+b)。其中,w、b叫做權(quán)重、閾值參數(shù),F(xiàn)()為映射規(guī)則,也叫激活函數(shù),hiddenLayer_output是隱含層對(duì)于傳來(lái)的數(shù)據(jù)映射的輸出值。換句話說(shuō),隱含層對(duì)于輸入的影響因素?cái)?shù)據(jù)x進(jìn)行了映射,產(chǎn)生了映射值。
3)輸出層:可以對(duì)應(yīng)為人的四肢,大腦對(duì)五官傳來(lái)的信息經(jīng)過(guò)思考(隱含層映射)之后,再控制四肢執(zhí)行動(dòng)作(向外部作出響應(yīng))。類(lèi)似地,BP神經(jīng)網(wǎng)絡(luò)的輸出層對(duì)hiddenLayer_output再次進(jìn)行映射,outputLayer_output=w *hiddenLayer_output+b。其中,w、b為權(quán)重、閾值參數(shù),outputLayer_output是神經(jīng)網(wǎng)絡(luò)輸出層的輸出值(也叫仿真值、預(yù)測(cè)值)(理解為,人腦對(duì)外的執(zhí)行動(dòng)作,比如嬰兒拍打桌子)。
4)梯度下降算法:通過(guò)計(jì)算outputLayer_output和神經(jīng)網(wǎng)絡(luò)模型傳入的y值之間的偏差,使用算法來(lái)相應(yīng)調(diào)整權(quán)重和閾值等參數(shù)。這個(gè)過(guò)程,可以理解為嬰兒拍打桌子,打偏了,根據(jù)偏離的距離遠(yuǎn)近,來(lái)調(diào)整身體使得再次揮動(dòng)的胳膊不斷靠近桌子,最終打中。
再舉個(gè)例子來(lái)加深理解:
圖一所示BP神經(jīng)網(wǎng)絡(luò),具備輸入層、隱含層和輸出層。BP是如何通過(guò)這三層結(jié)構(gòu)來(lái)實(shí)現(xiàn)輸出層的輸出值outputLayer_output,不斷逼近給定的y值,從而訓(xùn)練得到一個(gè)精準(zhǔn)的模型的呢?
從圖中串起來(lái)的端口,可以想到一個(gè)過(guò)程:坐地鐵,將圖一想象為一條地鐵線路。王某某坐地鐵回家的一天:在input起點(diǎn)站上車(chē),中途經(jīng)過(guò)了很多站(hiddenLayer),然后發(fā)現(xiàn)坐過(guò)頭了(outputLayer對(duì)應(yīng)現(xiàn)在的位置),那么王某某將會(huì)根據(jù)現(xiàn)在的位置離家(目標(biāo)Target)的距離(誤差Error),返回到中途的地鐵站(hiddenLayer)重新坐地鐵(誤差反向傳遞,使用梯度下降算法更新w和b),如果王某某又一次發(fā)生失誤,那么將再次進(jìn)行這個(gè)調(diào)整的過(guò)程。
從在嬰兒拍打桌子和王某某坐地鐵的例子中,思考問(wèn)題:BP的完整訓(xùn)練,需要先傳入數(shù)據(jù)給input,再經(jīng)過(guò)隱含層的映射,輸出層得到BP仿真值,根據(jù)仿真值與目標(biāo)值的誤差,來(lái)調(diào)整參數(shù),使得仿真值不斷逼近目標(biāo)值。比如(1)嬰兒受到了外界的干擾因素(x),從而作出反應(yīng)拍桌(predict),大腦不斷的調(diào)整胳膊位置,控制四肢拍準(zhǔn)(y、Target)。(2)王某某上車(chē)點(diǎn)(x),過(guò)站點(diǎn)(predict),不斷返回中途站來(lái)調(diào)整位置,到家(y、Target)。
在這些環(huán)節(jié)中,涉及了影響因素?cái)?shù)據(jù)x,目標(biāo)值數(shù)據(jù)y(Target)。根據(jù)x,y,使用BP算法來(lái)尋求x與y之間存在的規(guī)律,實(shí)現(xiàn)由x來(lái)映射逼近y,這就是BP神經(jīng)網(wǎng)絡(luò)算法的作用。再多說(shuō)一句,上述講的過(guò)程,都是BP模型訓(xùn)練,那么最終得到的模型雖然訓(xùn)練準(zhǔn)確,但是找到的規(guī)律(bp network)是否準(zhǔn)確與可靠呢。于是,我們?cè)俳ox1到訓(xùn)練好的bp network中,得到相應(yīng)的BP輸出值(預(yù)測(cè)值)predict1,通過(guò)作圖,計(jì)算Mse,Mape,R方等指標(biāo),來(lái)對(duì)比predict1和y1的接近程度,就可以知道模型是否預(yù)測(cè)準(zhǔn)確。這是BP模型的測(cè)試過(guò)程,即實(shí)現(xiàn)對(duì)數(shù)據(jù)的預(yù)測(cè),并且對(duì)比實(shí)際值檢驗(yàn)預(yù)測(cè)是否準(zhǔn)確。

圖一 3層BP神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)圖
1.2 基于歷史值影響的BP神經(jīng)網(wǎng)絡(luò)
以電力負(fù)荷預(yù)測(cè)問(wèn)題為例,進(jìn)行兩種模型的區(qū)分。在預(yù)測(cè)某個(gè)時(shí)間段內(nèi)的電力負(fù)荷時(shí):
一種做法,是考慮?t?時(shí)刻的氣候因素指標(biāo),比如該時(shí)刻的空氣濕度x1,溫度x2,以及節(jié)假日x3等的影響,對(duì)?t?時(shí)刻的負(fù)荷值進(jìn)行預(yù)測(cè)。這是前面1.1所說(shuō)的模型。
另一種做法,是認(rèn)為電力負(fù)荷值的變化,與時(shí)間相關(guān),比如認(rèn)為t-1,t-2,t-3時(shí)刻的電力負(fù)荷值與t時(shí)刻的負(fù)荷值有關(guān)系,即滿足公式y(tǒng)(t)=F(y(t-1),y(t-2),y(t-3))。采用BP神經(jīng)網(wǎng)絡(luò)進(jìn)行訓(xùn)練模型時(shí),則輸入到神經(jīng)網(wǎng)絡(luò)的影響因素值為歷史負(fù)荷值y(t-1),y(t-2),y(t-3),特別地,3叫做自回歸階數(shù)或者延遲。給到神經(jīng)網(wǎng)絡(luò)中的目標(biāo)輸出值為y(t)。
?1.3 差分進(jìn)化算法
Differential Evolution(DE)是由Storn等人于1995年提出的,和其它
一樣,DE是一種模擬生物進(jìn)化的 ,通過(guò)反復(fù) ,使得那些適應(yīng)環(huán)境的個(gè)體被保存了下來(lái)。但相比于進(jìn)化算法,DE保留了基于種群的全局搜索策略,采用實(shí)數(shù)編碼、基于差分的簡(jiǎn)單變異操作和一對(duì)一的競(jìng)爭(zhēng)生存策略,降低了遺傳操作的復(fù)雜性。同時(shí),DE特有的記憶能力使其可以動(dòng)態(tài)跟蹤當(dāng)前的搜索情況,以調(diào)整其搜索策略,具有較強(qiáng)的全局收斂能力和 ,且不需要借助問(wèn)題的特征信息,適于求解一些利用常規(guī)的數(shù)學(xué)規(guī)劃方法所無(wú)法求解的復(fù)雜環(huán)境中的優(yōu)化問(wèn)題。目前,DE已經(jīng)在許多領(lǐng)域得到了應(yīng)用,譬如人工 網(wǎng)絡(luò)、化工、電力、機(jī)械設(shè)計(jì)、機(jī)器人、信號(hào)處理、生物信息、經(jīng)濟(jì)學(xué)、現(xiàn)代農(nóng)業(yè)、食品安全、環(huán)境保護(hù)和運(yùn)籌學(xué)等。DE 算法主要用于求解
的全局優(yōu)化問(wèn)題,其主要工作步驟與其他 基本一致,主要包括變異(Mutation)、交叉(Crossover)、選擇(Selection)三種操作。算法的基本思想是從某一隨機(jī)產(chǎn)生的初始群體開(kāi)始,利用從種群中隨機(jī)選取的兩個(gè)個(gè)體的差向量作為第三個(gè)個(gè)體的隨機(jī)變化源,將差向量加權(quán)后按照一定的規(guī)則與第三個(gè)個(gè)體求和而產(chǎn)生變異個(gè)體,該操作稱(chēng)為變異。然后,變異個(gè)體與某個(gè)預(yù)先決定的目標(biāo)個(gè)體進(jìn)行參數(shù)混合,生成試驗(yàn)個(gè)體,這一過(guò)程稱(chēng)之為交叉。如果試驗(yàn)個(gè)體的適應(yīng)度值優(yōu)于目標(biāo)個(gè)體的適應(yīng)度值,則在下一代中試驗(yàn)個(gè)體取代目標(biāo)個(gè)體,否則目標(biāo)個(gè)體仍保存下來(lái),該操作稱(chēng)為選擇。在每一代的進(jìn)化過(guò)程中,每一個(gè)體矢量作為目標(biāo)個(gè)體一次,算法通過(guò)不斷地迭代計(jì)算,保留優(yōu)良個(gè)體,淘汰劣質(zhì)個(gè)體,引導(dǎo)搜索過(guò)程向全局 逼近。算法圖解:


算法偽代碼:


2 部分代碼
%% 差分進(jìn)化算法應(yīng)用于優(yōu)化BP神經(jīng)網(wǎng)絡(luò)的初始權(quán)值和閾值
%% 清空環(huán)境變量
clear all;
clc;
warning off
load v357;
load y357;
Pn_train=v;
Tn_train=y;
Pn_test=v;
Tn_test=y;
P_train=v;
T_train=y;
% P_train=[0 25.27 44 62.72 81.4 100.2;
% ? ? 290.5 268.8 247.2 224.5 206 184.4;
% ? ? 0 16.12 33.25 50.42 67.62 84.73;
% ? ? 542.5 517.8 493 465.3 435.6 410.8;
% ? ? 0 11.1 28.1 44.93 61.38 78.57;
% ? ? 826.1 800.2 769.1 740.0 706.2 669.3];
% T_train=[0 1 2 3 4 5];%以上是未處理的數(shù)據(jù)
% ?P_test=[0 25.25 43 62.75 81.6 100.7;
% ? ? 290.3 268.4 247.5 224.6 206 184.2;
% ? ? 0 16.14 33.26 50.47 67.68 84.79;
% ? ? 542.7 517.9 495 465.8 435.6 410.9;
% ? ? 0 11.4 28.6 44.94 61.36 78.59;
% ? ? 826.3 800.7 769.8 740.5 706.7 669.3];
% T_test=[0 1 2 3 4 5];
% Pn_train=[0 0.252 0.439 0.626 0.813 1 0 0.19 0.392 0.595 0.798 1 0 0.141 0.358 0.572 0.781 1;
% ? ? ? ? ? 1 0.795 0.592 0.378 0.204 0 1 0.815 0.626 0.415 0.189 0 1 0.835 0.637 0.451 0.235 0];
% %T 為目標(biāo)矢量 ,歸一化后的數(shù)據(jù)
% Tn_train=[0.05,0.23,0.41,0.59,0.77,0.95,0.05,0.23,0.41,0.59,0.77,0.95,0.05,0.23,0.41,0.59,0.77,0.95];
% Pn_test=[ 0 0.17 0.39 0.595 0.798 1 0 0.141 0.358 0.572 0.781 1 0 0.258 0.439 0.626 0.813 1;
% ? ? ? ? ?1 0.815 0.625 0.415 0.189 0 1 0.835 0.635 0.451 0.235 0 1 0.795 0.599 0.378 0.204 0 ];
% Tn_test=[0.05,0.23,0.41,0.59,0.77,0.95,0.05,0.23,0.41,0.59,0.77,0.95,0.05,0.23,0.41,0.59,0.77,0.95];
%% 參數(shù)設(shè)置
S1 = size(Pn_train,1); ? ? ? ? ? ? ?% 輸入層神經(jīng)元個(gè)數(shù)
S2 = 6; ? ? ? ? ? ? ? ? ? ? ? ? ? ?% 隱含層神經(jīng)元個(gè)數(shù)
S3 = size(Tn_train,1); ? ? ? ? ? ? ?% 輸出層神經(jīng)元個(gè)數(shù)
Gm=10; ? ?%最大迭代次數(shù)
F0=0.5; ? ? ?%F為縮放因子
Np=5; %種群規(guī)模
CR=0.5; ?%雜交參數(shù)
G=1;%初始化代數(shù)
N=S1*S2 + S2*S3 + S2 + S3;%所求問(wèn)題的維數(shù)
% 設(shè)置網(wǎng)絡(luò)初始權(quán)值和閾值
net_optimized.IW{1,1} = W1;
net_optimized.LW{2,1} = W2;
net_optimized.b{1} = B1;
net_optimized.b{2} = B2;
% 設(shè)置訓(xùn)練參數(shù)
net_optimized.trainParam.epochs = 3000;
net_optimized.trainParam.show = 100;
net_optimized.trainParam.goal = 0.001;
net_optimized.trainParam.lr = 0.1;
% 利用新的權(quán)值和閾值進(jìn)行訓(xùn)練
net_optimized = train(net_optimized,Pn_train,Tn_train);
%% 仿真測(cè)試
Tn_sim_optimized = sim(net_optimized,Pn_test); ? ?
% 結(jié)果對(duì)比
result_optimized = [Tn_test' Tn_sim_optimized'];
%均方誤差
E_optimized = mse(Tn_sim_optimized - Tn_test)
MAPE_optimized = mean(abs(Tn_sim_optimized-Tn_test)./Tn_sim_optimized)*100
% figure(1)
%
% plot(T_train,P_train(1,:),'r')
% hold on
% plot(T_train,P_train(3,:),'y')
% hold on
% plot(T_train,P_train(5,:),'b')
% hold on
% grid on
% xlabel('標(biāo)準(zhǔn)設(shè)備的約定真值(10KP)');
% ?ylabel('壓力傳感器的輸出(mv)');
% ?title('壓力傳感器的工作曲線');
% ?legend('t=22','t=44','t=70');
figure(2)
plot(Tn_train(1:6),Pn_train(1,1:6),'r')
hold on
plot(Tn_train(7:12),Pn_train(1,7:12),'y')
hold on
plot(Tn_train(13:18),Pn_train(1,13:18),'b')
hold on
grid on
xlabel('設(shè)備約定真值(10KP)');
ylabel('壓力傳感器的輸出(mv)');
title('歸一化后的訓(xùn)練樣本壓力傳感器的工作曲線');
legend('t=22','t=44','t=70');
figure(3)
plot(Tn_test(1:6),Pn_test(1,1:6),'r')
hold on
plot(Tn_test(7:12),Pn_test(1,7:12),'y')
hold on
plot(Tn_test(13:18),Pn_test(1,13:18),'b')
hold on
grid on
xlabel('設(shè)備約定真值(10KP)');
ylabel('壓力傳感器的輸出(mv)');
title('歸一化后的測(cè)試樣本壓力傳感器的工作曲線');
legend('t=22','t=44','t=70');
figure(4)
plot(Tn_test(1:6),Tn_sim_optimized(1:6),'r')%輸出DE-BP仿真結(jié)果的曲線
hold on
plot(Tn_test(7:12),Tn_sim_optimized(7:12),'y')
hold on
plot(Tn_test(13:18),Tn_sim_optimized(13:18),'b')
hold on
xlabel('約定真值(10KP)');
ylabel('壓力傳感器的輸出(mv)');
title('DE-BP的壓力傳感器的工作曲線');
legend('t=22','t=44','t=70');
grid on
%% 未優(yōu)化的BP神經(jīng)網(wǎng)絡(luò)
%net = newff(Pn_train,Tn_train,S2);
net=newff(minmax(Pn_train),[6,1],{'logsig','purelin'},'traingdm');%隱含層神經(jīng)元S型正切,輸出層S型對(duì)數(shù),動(dòng)量梯度下降法訓(xùn)練BP網(wǎng)絡(luò),
% 設(shè)置訓(xùn)練參數(shù)
net.trainParam.epochs = 3000;
net.trainParam.show = 100;
net.trainParam.goal = 0.001;
net.trainParam.lr = 0.1;
net=init(net);
inputWeights=net.IW{1,1};% 當(dāng)前輸入層權(quán)值和閾值
inputbias=net.b{1};
layerWeights=net.LW{2,1};% 當(dāng)前網(wǎng)絡(luò)層權(quán)值和閾值
layerbias=net.b{2}
% 利用新的權(quán)值和閾值進(jìn)行訓(xùn)練
net = train(net,Pn_train,Tn_train);
%% 仿真測(cè)試
Tn_sim = sim(net,Pn_test); ? ?
%% 結(jié)果對(duì)比
result = [Tn_test' Tn_sim'];
% 均方誤差
E1 = mse(Tn_sim - Tn_test)
MAPE1= mean(abs(Tn_sim-Tn_test)./Tn_sim)*100
% end
% figure(4)
% plot(T_train,P_train(1,:),'r')
% hold on
% plot(T_train,P_train(3,:),'y')
% hold on
% plot(T_train,P_train(5,:),'b')
% hold on
% grid on
% xlabel('標(biāo)準(zhǔn)設(shè)備的約定真值(10KP)');
% ?ylabel('壓力傳感器的輸出(mv)');
% ?title('壓力傳感器的工作曲線');
% ?legend('t=22','t=44','t=70');
figure(5)
plot(Tn_test(1:6),Tn_sim(1:6),'r')%輸出BP仿真結(jié)果的曲線
hold on
plot(Tn_test(7:12),Tn_sim(7:12),'y')
hold on
plot(Tn_test(13:18),Tn_sim(13:18),'b')
hold on
xlabel('約定真值(10KP)');
ylabel('壓力傳感器的輸出(mv)');
title('BP的壓力傳感器的工作曲線');
legend('t=22','t=44','t=70');
grid on
3 仿真結(jié)果


?
4 參考文獻(xiàn)
[1]牛慶,曹愛(ài)民,陳瀟一,周冬.基于花朵授粉算法和BP神經(jīng)網(wǎng)絡(luò)的短期負(fù)荷預(yù)測(cè)[J].電網(wǎng)與清潔能源,2020,36(10):28-32.
