使用MATLAB的神經網路工具箱簡易實現BP網路
阿新 • • 發佈:2019-01-04
%準備好訓練集 %人數(單位:萬人) numberOfPeople=[20.55 22.44 25.37 27.13 29.45 30.10 30.96 34.06 36.42 38.09 39.13 39.99 41.93 44.59 47.30 52.89 55.73 56.76 59.17 60.63]; %機動車數(單位:萬輛) numberOfAutomobile=[0.6 0.75 0.85 0.9 1.05 1.35 1.45 1.6 1.7 1.85 2.15 2.2 2.25 2.35 2.5 2.6 2.7 2.85 2.95 3.1]; %公路面積(單位:萬平方公里) roadArea=[0.09 0.11 0.11 0.14 0.20 0.23 0.23 0.32 0.32 0.34 0.36 0.36 0.38 0.49 0.56 0.59 0.59 0.67 0.69 0.79]; %公路客運量(單位:萬人) passengerVolume = [5126 6217 7730 9145 10460 11387 12353 15750 18304 19836 21024 19490 20433 22598 25107 33442 36836 40548 42927 43462]; %公路貨運量(單位:萬噸) freightVolume = [1237 1379 1385 1399 1663 1714 1834 4322 8132 8936 11099 11203 10524 11115 13320 16762 18673 20724 20803 21804]; %輸入資料矩陣 p = [numberOfPeople; numberOfAutomobile; roadArea]; %目標(輸出)資料矩陣 t = [passengerVolume; freightVolume]; %對訓練集中的輸入資料矩陣和目標資料矩陣進行歸一化處理 [pn, inputStr] = mapminmax(p); [tn, outputStr] = mapminmax(t); %建立BP神經網路 net = newff(pn, tn, [3 7 2], {'purelin', 'logsig', 'purelin'}); %每10輪迴顯示一次結果 net.trainParam.show = 10; %最大訓練次數 net.trainParam.epochs = 5000; %網路的學習速率 net.trainParam.lr = 0.05; %訓練網路所要達到的目標誤差 net.trainParam.goal = 0.65 * 10^(-3); %網路誤差如果連續6次迭代都沒變化,則matlab會預設終止訓練。為了讓程式繼續執行,用以下命令取消這條設定 net.divideFcn = ''; %開始訓練網路 net = train(net, pn, tn); %使用訓練好的網路,基於訓練集的資料對BP網路進行模擬得到網路輸出結果 %(因為輸入樣本(訓練集)容量較少,否則一般必須用新鮮資料進行模擬測試) answer = sim(net, pn); %反歸一化 answer1 = mapminmax('reverse', answer, outputStr); %繪製測試樣本神經網路輸出和實際樣本輸出的對比圖(figure(1))------------------------------------------- t = 1990:2009; %測試樣本網路輸出客運量 a1 = answer1(1,:); %測試樣本網路輸出貨運量 a2 = answer1(2,:); figure(1); subplot(2, 1, 1); plot(t, a1, 'ro', t, passengerVolume, 'b+'); legend('網路輸出客運量', '實際客運量'); xlabel('年份'); ylabel('客運量/萬人'); title('神經網路客運量學習與測試對比圖'); grid on; subplot(2, 1, 2); plot(t, a2, 'ro', t, freightVolume, 'b+'); legend('網路輸出貨運量', '實際貨運量'); xlabel('年份'); ylabel('貨運量/萬噸'); title('神經網路貨運量學習與測試對比圖'); grid on; %使用訓練好的神經網路對新輸入資料進行預測 %新輸入資料(2010年和2011年的相關資料) newInput = [73.39 75.55; 3.9635 4.0975; 0.9880 1.0268]; %利用原始輸入資料(訓練集的輸入資料)的歸一化引數對新輸入資料進行歸一化 newInput = mapminmax('apply', newInput, inputStr); %進行模擬 newOutput = sim(net, newInput); %反歸一化 newOutput = mapminmax('reverse',newOutput, outputStr); disp('預測2010和2011年的公路客運量分別為(單位:萬人):'); newOutput(1,:) disp('預測2010和2011年的公路貨運量分別為(單位:萬噸):'); newOutput(2,:) %在figure(1)的基礎上繪製2010和2011年的預測情況------------------------------------------------------- figure(2); t1 = 1990:2011; subplot(2, 1, 1); plot(t1, [a1 newOutput(1,:)], 'ro', t, passengerVolume, 'b+'); legend('網路輸出客運量', '實際客運量'); xlabel('年份'); ylabel('客運量/萬人'); title('神經網路客運量學習與測試對比圖(添加了預測資料)'); grid on; subplot(2, 1, 2); plot(t1, [a2 newOutput(2,:)], 'ro', t, freightVolume, 'b+'); legend('網路輸出貨運量', '實際貨運量'); xlabel('年份'); ylabel('貨運量/萬噸'); title('神經網路貨運量學習與測試對比圖(添加了預測資料)'); grid on;
5. 執行結果
預測2010和2011年的公路客運量分別為(單位:萬人):
ans =
1.0e+04 *
4.4384 4.4656
預測2010和2011年的公路貨運量分別為(單位:萬噸):
ans =
1.0e+04 *
2.1042 2.1139
6. 繪製的影象
- figure(1)
- figure(2)