【MATLAB第57期】基于MATLAB的雙隱含層BP神經(jīng)網(wǎng)絡(luò)回歸預(yù)測模型(無工具箱版本及工具箱版本對比)
一、無工具箱版本
1.數(shù)據(jù)設(shè)置
數(shù)據(jù)為案例數(shù)據(jù) 。103行樣本,7輸入1輸出數(shù)據(jù)。
2.參數(shù)設(shè)置
訓(xùn)練函數(shù) 梯度下降
HiddenUnit1Num=10;%隱層1結(jié)點(diǎn)數(shù)
HiddenUnit2Num=10;%隱層2節(jié)點(diǎn)數(shù)
MaxEpochs=20000;%最大訓(xùn)練次數(shù)
TF1 = 'logsig';TF2 = 'logsig'; TF3 = 'purelin';%各層傳輸函數(shù),TF3為輸出層傳輸函數(shù)
lr=0.003;%學(xué)習(xí)率
E0=0.05;%目標(biāo)誤差
3.代碼展示
%--------------兩個隱層的BP算法-------------%
clear all;
%% 清空環(huán)境變量
warning off % 關(guān)閉報警信息
close all % 關(guān)閉開啟的圖窗
clear % 清空變量
clc % 清空命令行
%% 導(dǎo)入數(shù)據(jù)
res = xlsread('數(shù)據(jù)集.xlsx');
%% 劃分訓(xùn)練集和測試集
temp = randperm(103);
save temp temp
P_train = res(temp(1: 80), 1: 7)';
T_train = res(temp(1: 80), 8)';
M = size(P_train, 2);
P_test = res(temp(81: end), 1: 7)';
T_test = res(temp(81: end), 8)';
N = size(P_test, 2);
%% 數(shù)據(jù)歸一化
[p_train, ps_input] = mapminmax(P_train, 0, 1);
p_test = mapminmax('apply', P_test, ps_input);
[t_train, ps_output] = mapminmax(T_train, 0, 1);
t_test = mapminmax('apply', T_test, ps_output);
SamNum=size(p_train,2);%樣本數(shù)
TestSamNum=size(p_test,2);%測試樣本
HiddenUnit1Num=10;%隱層1結(jié)點(diǎn)數(shù)
HiddenUnit2Num=10;%隱層2節(jié)點(diǎn)數(shù)
InDim=size(p_train,1);%樣本輸入維數(shù)
OutDim=size(t_train,1);%樣本輸出維數(shù)
%根據(jù)目標(biāo)函數(shù)獲得樣本輸入輸出
MaxEpochs=20000;%最大訓(xùn)練次數(shù)
lr=0.003;%學(xué)習(xí)率
E0=0.05;%目標(biāo)誤差
%產(chǎn)生擴(kuò)展向量,及擴(kuò)展樣本輸入%
W1Ex=[W1 B1];
W2Ex=[W2 B2];
W3Ex=[W3 B3];
SamInEx=[p_train' ones(SamNum,1)]';
for i=1:MaxEpochs
%正向傳播時第一隱層,第二隱層,及網(wǎng)絡(luò)輸出值%
u=W1Ex*SamInEx;
Hidden1Out=1./(1+exp(-u));
Hidden1OutEx=[Hidden1Out' ones(SamNum,1)]'; %停止學(xué)習(xí)判斷條件
Error=t_train-NetworkOut;%是一個1*M的向量
SSE=sum(Error.^2);%所有樣本產(chǎn)生的誤差之和
if SSE<E0,break,end
%計(jì)算反向傳播誤差
Delta3=Error;%是一個橫向量,包含樣本的誤差
Dw3Ex=Delta3*Hidden2OutEx';
for n=1:SamNum %對每一個樣本分別計(jì)算
Delta2=(W3'*Delta3(n)).*Hidden2Out(:,n).*(1-Hidden2Out(:,n));
Delta2Store(:,n)=Delta2;
Dw2Ex=Dw2Ex+Delta2*Hidden1OutEx(:,n)';
end
%更新權(quán)值
end
%% 測試集預(yù)測
v=size(p_test);
TestSamInEx=[p_test' ones(v(2),1)]';
u=W1Ex*TestSamInEx;
Hidden1Out=1./(1+exp(-u));
Hidden1OutEx=[Hidden1Out' ones(v(2),1)]';
u=W2Ex*Hidden1OutEx;
Hidden2Out=1./(1+exp(-u));
Hidden2OutEx=[Hidden2Out' ones(v(2),1)]';
TestNetworkOut=W3Ex*Hidden2OutEx; %網(wǎng)絡(luò)輸出值
T_sim2 = mapminmax('reverse', TestNetworkOut, ps_output);
%% 均方根誤差
error1 = sqrt(sum((T_sim1 - T_train).^2) ./ M);
error2 = sqrt(sum((T_sim2 - T_test ).^2) ./ N);
%% 繪圖
figure
plot(1: M, T_train, 'r-*', 1: M, T_sim1, 'b-o', 'LineWidth', 1)
legend('真實(shí)值','預(yù)測值')
xlabel('預(yù)測樣本')
ylabel('預(yù)測結(jié)果')
string = {'訓(xùn)練集預(yù)測結(jié)果對比'; ['RMSE=' num2str(error1)]};
title(string)
xlim([1, M])
grid
figure
plot(1: N, T_test, 'r-*', 1: N, T_sim2, 'b-o', 'LineWidth', 1)
legend('真實(shí)值','預(yù)測值')
xlabel('預(yù)測樣本')
ylabel('預(yù)測結(jié)果')
string = {'測試集預(yù)測結(jié)果對比';['RMSE=' num2str(error2)]};
title(string)
xlim([1, N])
grid
%% 相關(guān)指標(biāo)計(jì)算
% 決定系數(shù) R2
R1 = 1 - norm(T_train - T_sim1)^2 / norm(T_train - mean(T_train))^2;
R2 = 1 - norm(T_test - T_sim2)^2 / norm(T_test - mean(T_test ))^2;
disp(['訓(xùn)練集數(shù)據(jù)的R2為:', num2str(R1)])
disp(['測試集數(shù)據(jù)的R2為:', num2str(R2)])
% 平均絕對誤差 MAE
mae1 = sum(abs(T_sim1 - T_train)) ./ M ;
mae2 = sum(abs(T_sim2 - T_test )) ./ N ;
disp(['訓(xùn)練集數(shù)據(jù)的MAE為:', num2str(mae1)])
disp(['測試集數(shù)據(jù)的MAE為:', num2str(mae2)])
% 平均相對誤差 MBE
mbe1 = sum(T_sim1 - T_train) ./ M ;
mbe2 = sum(T_sim2 - T_test ) ./ N ;
disp(['訓(xùn)練集數(shù)據(jù)的MBE為:', num2str(mbe1)])
disp(['測試集數(shù)據(jù)的MBE為:', num2str(mbe2)])
4.效果展示
訓(xùn)練集數(shù)據(jù)的R2為:0.9022
測試集數(shù)據(jù)的R2為:0.87266
訓(xùn)練集數(shù)據(jù)的MAE為:1.8189
測試集數(shù)據(jù)的MAE為:2.1658
訓(xùn)練集數(shù)據(jù)的MBE為:-0.00088469
測試集數(shù)據(jù)的MBE為:0.3059
二、有工具箱版本
1.數(shù)據(jù)設(shè)置
數(shù)據(jù)與無工具版本相同,數(shù)據(jù)順序也相同。
2.參數(shù)設(shè)置
訓(xùn)練函數(shù) trainlm
NodeNum1 = 10; % 隱層第一層節(jié)點(diǎn)數(shù)
NodeNum2=10; % 隱層第二層節(jié)點(diǎn)數(shù)
net.trainParam.epochs=20000;%訓(xùn)練次數(shù)設(shè)置
net.trainParam.goal=0.05;%訓(xùn)練目標(biāo)設(shè)置
net.trainParam.lr=0.003;%學(xué)習(xí)率設(shè)置,應(yīng)設(shè)置為較少值,太大雖然會在開始加快收斂速度,但臨近最佳點(diǎn)時,會產(chǎn)生動蕩,而致使無法收斂
TF1 = 'logsig';TF2 = 'logsig'; TF3 = 'purelin';%各層傳輸函數(shù),TF3為輸出層傳輸函數(shù)
%如果訓(xùn)練結(jié)果不理想,可以嘗試更改傳輸函數(shù),以下這些是各類傳輸函數(shù)
3.代碼展示
%--------------兩個隱層的BP算法-------------%
% BP 神經(jīng)網(wǎng)絡(luò)用于預(yù)測
%網(wǎng)絡(luò)為7輸入,1輸出
% 103組數(shù)據(jù),其中80組為正常訓(xùn)練數(shù)據(jù),23組為測試數(shù)據(jù)
clear all;
%% 清空環(huán)境變量
warning off % 關(guān)閉報警信息
close all % 關(guān)閉開啟的圖窗
clear % 清空變量
clc % 清空命令行
%% 導(dǎo)入數(shù)據(jù)
res = xlsread('數(shù)據(jù)集.xlsx');
%% 劃分訓(xùn)練集和測試集
temp = randperm(103);
load temp
P_train = res(temp(1: 80), 1: 7)';
T_train = res(temp(1: 80), 8)';
M = size(P_train, 2);
P_test = res(temp(81: end), 1: 7)';
T_test = res(temp(81: end), 8)';
N = size(P_test, 2);
%% 數(shù)據(jù)歸一化
[p_train, ps_input] = mapminmax(P_train, 0, 1);
p_test = mapminmax('apply', P_test, ps_input);
[t_train, ps_output] = mapminmax(T_train, 0, 1);
t_test = mapminmax('apply', T_test, ps_output);
%---------------------------------------------------
%數(shù)據(jù)歸一化處理
%mapminmax函數(shù)默認(rèn)將數(shù)據(jù)歸一化到[0,1],調(diào)用形式如下
%[y,ps] =%mapminmax(x,ymin,ymax)
%x需歸化的數(shù)據(jù)輸入
%ymin,ymax為需歸化到的范圍,不填默認(rèn)為歸化到[-1,1]
%y歸一化后的樣本數(shù)據(jù)
%ps處理設(shè)置,ps主要在結(jié)果反歸一化中需要調(diào)用,或者使用同樣的settings歸一化另外一組數(shù)據(jù)
%---------------------------------------------------
%---------------------------------------------------
% 設(shè)置網(wǎng)絡(luò)參數(shù)
%---------------------------------------------------
NodeNum1 = 10; % 隱層第一層節(jié)點(diǎn)數(shù)
NodeNum2=10; % 隱層第二層節(jié)點(diǎn)數(shù)
TypeNum = 1; % 輸出維數(shù)
TF1 = 'logsig';TF2 = 'logsig'; TF3 = 'purelin';%各層傳輸函數(shù),TF3為輸出層傳輸函數(shù)
%如果訓(xùn)練結(jié)果不理想,可以嘗試更改傳輸函數(shù),以下這些是各類傳輸函數(shù)
%TF1 = 'tansig';TF2 = 'logsig';
%TF1 = 'logsig';TF2 = 'purelin';
%TF1 = 'tansig';TF2 = 'tansig';
%TF1 = 'logsig';TF2 = 'logsig';
%TF1 = 'purelin';TF2 = 'purelin';
%注意創(chuàng)建BP網(wǎng)絡(luò)函數(shù)newff()的參數(shù)調(diào)用
%---------------------------------------------------
% 設(shè)置訓(xùn)練參數(shù)
%---------------------------------------------------
net.trainParam.epochs=20000;%訓(xùn)練次數(shù)設(shè)置
net.trainParam.goal=0.05;%訓(xùn)練目標(biāo)設(shè)置
net.trainParam.lr=0.003;%學(xué)習(xí)率設(shè)置,應(yīng)設(shè)置為較少值,太大雖然會在開始加快收斂速度,但臨近最佳點(diǎn)時,會產(chǎn)生動蕩,而致使無法收斂
%---------------------------------------------------
% 指定訓(xùn)練函數(shù)
%---------------------------------------------------
% net.trainFcn = 'traingd'; % 梯度下降算法
% net.trainFcn = 'traingdm'; % 動量梯度下降算法
%
% net.trainFcn = 'traingda'; % 變學(xué)習(xí)率梯度下降算法
% net.trainFcn = 'traingdx'; % 變學(xué)習(xí)率動量梯度下降算法
%
% (大型網(wǎng)絡(luò)的首選算法)
% net.trainFcn = 'trainrp'; % RPROP(彈性BP)算法,內(nèi)存需求最小
%
% (共軛梯度算法)
% net.trainFcn = 'traincgf'; % Fletcher-Reeves修正算法
% net.trainFcn = 'traincgp'; % Polak-Ribiere修正算法,內(nèi)存需求比Fletcher-Reeves修正算法略大
% net.trainFcn = 'traincgb'; % Powell-Beal復(fù)位算法,內(nèi)存需求比Polak-Ribiere修正算法略大
%
% (大型網(wǎng)絡(luò)的首選算法)
%net.trainFcn = 'trainscg'; % Scaled Conjugate Gradient算法,內(nèi)存需求與Fletcher-Reeves修正算法相同,計(jì)算量比上面三種算法都小很多
% net.trainFcn = 'trainbfg'; % Quasi-Newton Algorithms - BFGS Algorithm,計(jì)算量和內(nèi)存需求均比共軛梯度算法大,但收斂比較快
% net.trainFcn = 'trainoss'; % One Step Secant Algorithm,計(jì)算量和內(nèi)存需求均比BFGS算法小,比共軛梯度算法略大
%
% (中型網(wǎng)絡(luò)的首選算法)
%net.trainFcn = 'trainlm'; % Levenberg-Marquardt算法,內(nèi)存需求最大,收斂速度最快
% net.trainFcn = 'trainbr'; % 貝葉斯正則化算法
%
% 有代表性的五種算法為:'traingdx','trainrp','trainscg','trainoss', 'trainlm'
%% 訓(xùn)練網(wǎng)絡(luò)
net = train(net, p_train, t_train);
%% 仿真測試
t_sim1 = sim(net, p_train);
t_sim2 = sim(net, p_test);
%% 數(shù)據(jù)反歸一化
T_sim1 = mapminmax('reverse', t_sim1, ps_output);
T_sim2 = mapminmax('reverse', t_sim2, ps_output);
%% 均方根誤差
error1 = sqrt(sum((T_sim1 - T_train).^2) ./ M);
error2 = sqrt(sum((T_sim2 - T_test ).^2) ./ N);
%% 繪圖
figure
plot(1: M, T_train, 'r-*', 1: M, T_sim1, 'b-o', 'LineWidth', 1)
legend('真實(shí)值','預(yù)測值')
xlabel('預(yù)測樣本')
ylabel('預(yù)測結(jié)果')
string = {'訓(xùn)練集預(yù)測結(jié)果對比'; ['RMSE=' num2str(error1)]};
title(string)
xlim([1, M])
grid
figure
plot(1: N, T_test, 'r-*', 1: N, T_sim2, 'b-o', 'LineWidth', 1)
legend('真實(shí)值','預(yù)測值')
xlabel('預(yù)測樣本')
ylabel('預(yù)測結(jié)果')
string = {'測試集預(yù)測結(jié)果對比';['RMSE=' num2str(error2)]};
title(string)
xlim([1, N])
grid
%% 相關(guān)指標(biāo)計(jì)算
% 決定系數(shù) R2
R1 = 1 - norm(T_train - T_sim1)^2 / norm(T_train - mean(T_train))^2;
R2 = 1 - norm(T_test - T_sim2)^2 / norm(T_test - mean(T_test ))^2;
disp(['訓(xùn)練集數(shù)據(jù)的R2為:', num2str(R1)])
disp(['測試集數(shù)據(jù)的R2為:', num2str(R2)])
% 平均絕對誤差 MAE
mae1 = sum(abs(T_sim1 - T_train)) ./ M ;
mae2 = sum(abs(T_sim2 - T_test )) ./ N ;
disp(['訓(xùn)練集數(shù)據(jù)的MAE為:', num2str(mae1)])
disp(['測試集數(shù)據(jù)的MAE為:', num2str(mae2)])
% 平均相對誤差 MBE
mbe1 = sum(T_sim1 - T_train) ./ M ;
mbe2 = sum(T_sim2 - T_test ) ./ N ;
disp(['訓(xùn)練集數(shù)據(jù)的MBE為:', num2str(mbe1)])
disp(['測試集數(shù)據(jù)的MBE為:', num2str(mbe2)])
4.效果展示
訓(xùn)練集數(shù)據(jù)的R2為:1
測試集數(shù)據(jù)的R2為:0.94759
訓(xùn)練集數(shù)據(jù)的MAE為:3.6159e-07
測試集數(shù)據(jù)的MAE為:1.0637
訓(xùn)練集數(shù)據(jù)的MBE為:-2.0744e-07
測試集數(shù)據(jù)的MBE為:-0.43051
三、總結(jié)
因工具箱版本和無工具箱版本訓(xùn)練方法不同,以及有工具箱版本內(nèi)置默認(rèn)參數(shù)較為豐富 ,如連續(xù)驗(yàn)證最大失敗數(shù)量、訓(xùn)練集再劃分樣本等等參數(shù) ,且trainlm函數(shù)功能強(qiáng)大,用代碼編寫比較復(fù)雜 。故有工具版計(jì)算結(jié)果較好,收斂速度較快,使用方便,而無工具箱版本則更能直觀的觀察數(shù)據(jù)變化以及能夠更直觀體現(xiàn)BP神經(jīng)網(wǎng)絡(luò)計(jì)算原理。文章來源:http://www.zghlxwxcb.cn/news/detail-599856.html
四、代碼獲取
私信回復(fù)“57期”即可獲取下載鏈接。文章來源地址http://www.zghlxwxcb.cn/news/detail-599856.html
到了這里,關(guān)于【MATLAB第57期】基于MATLAB的雙隱含層BP神經(jīng)網(wǎng)絡(luò)回歸預(yù)測模型(無工具箱版本及工具箱版本對比)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!