BP 神經網路(MATLAB環境)
% matlab有關BP網路的模組:
% 1. mapminmax函式:用於歸一化或反歸一化資料
% (1) [Y,PS] = mapminmax(X)
% X:原矩陣
% Y:對矩陣X進行規範化得到的矩陣
% PS:存放關於原矩陣規範化過程中的相關對映資料的結構體
% (2) [Y,PS] = mapminmax(X,FP)
% X:原矩陣
% FP:含有欄位FP.ymin和FP.ymax的結構體
% Y:對矩陣X進行規範化得到的矩陣(使用在FP的ymin和ymax規定下的演算法)
% PS:存放關於原矩陣規範化過程中的相關對映資料的結構體
% (3) Y = mapminmax(‘apply’,X,PS)
% ’apply’:必寫
% X:原矩陣
% PS:存放關於某個矩陣規範化過程中的相關對映資料的結構體
% Y:對矩陣X進行規範化得到的矩陣(使用PS中的規範化方式)
% (4) X = mapminmax(‘reverse’,Y,PS)
% ’reverse’:必寫
% Y:某個矩陣
% PS:存放關於某個矩陣規範化過程中的相關對映資料的結構體
% X:將矩陣Y反規範化得到的矩陣(使用PS中的規範化方式,這裡指將矩陣X轉換為矩陣Y的規範化方式)
% 2. newff函式(新版本):建立一個前饋反向傳播(BP)網路
% (1) net=newff(P,T,S)
% P: 輸入資料矩陣。(RxQ1),其中Q1代表R元的輸入向量。其資料意義是矩陣P有Q1列,每一列都是一個樣本,而每個樣本有R個屬性(特徵)。一般矩陣P需要事先歸一化好,即P的每一行都歸一化到[0 1]或者[-1 1]。
% T:目標資料矩陣。(SNxQ2),其中Q2代表SN元的目標向量。資料意義參考上面,矩陣T也是事先歸一化好的。
% S:第i層的神經元個數。(新版本中可以省略輸出層的神經元個數不寫,因為輸出層的神經元個數已經取決於T)
% (2) net = newff(P,T,S,TF,BTF,BLF,PF,IPF,OPF,DDF)(提供了可選擇的引數)
% TF:相關層的傳遞函式,預設隱含層使用tansig函式,輸出層使用purelin函式。
% BTF:BP神經網路學習訓練函式,預設值為trainlm函式。
% BLF:權重學習函式,預設值為learngdm。
% PF:效能函式,預設值為mse。
% PF,OPF,DDF均為預設值即可。
% (3) 常用的傳遞函式:
% purelin:線性傳遞函式
% tansig:正切 S 型傳遞函式
% logsig: 對數 S 型傳遞函式
% (注意:隱含層和輸出層函式的選擇對BP神經網路預測精度有較大影響,一般隱含層節點傳遞函式選用tansig函式或logsig函式,輸出層節點轉移函式選用tansig函式或purelin函式。)
% 3. train函式:訓練一個神經網路
% (1) [NET2,TR] = train(NET1,X,T)(也可[NET2] = train(NET1,X,T) )
% NET1:待訓練的網路
% X: 輸入資料矩陣(已歸一化)
% T:目標資料矩陣(已歸一化)
% NET2:訓練得到的網路TR:存放有關訓練過程的資料的結構體
% 4. sim函式:模擬Simulink模型,進行資料模擬
% (1) SimOut = sim(‘MODEL’, PARAMETERS)
% (見名知意,不必再解釋)
% 5. 關於net.trainParam的常用屬性:(假定已經定義了一個BP網路net)
% (1)* net.trainParam.show: 兩次顯示之間的訓練次數
% (2)* net.trainParam.epochs: 最大訓練次數
% (3)* net.trainParam.lr: 網路的學習速率
% (4)* net.trainParam.goal: 訓練網路所要達到的目標誤差
% (5)* net.trainParam.time: 最長訓練時間(秒)
% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %
% matlab實現BP網路步驟(以"BP神經網路.docx"裡的公路運輸為例):
% BP網路建立:
% 1.準備好訓練集(以矩陣的方式儲存)
% 輸入層資料:p = [numberOfPeople; numberOfAutomobile; roadArea];
% 輸出資料:t = [passengerVolume; freightVolume];
% 2.對訓練集中的輸入資料矩陣和目標資料矩陣進行歸一化處理
% [pn, inputStr] = mapminmax(p);
% [tn, outputStr] = mapminmax(t);
% 3.建立BP神經網路
% net = newff(pn, tn, [3 7 2], {'purelin', 'logsig', 'purelin'});
% [3 7 2]:3為輸入層的節點個數,7為隱含層的“神經元”節點個數(可由l =
% sqrt(n+m)+a得出,具體可看“BP神經網路.docx”),2為輸出層的節點個數
% 4.神經網路引數設定
% net.trainParam.show = 10;%每10輪迴顯示一次結果
% net.trainParam.epochs = 5000;%最大訓練次數
% net.trainParam.lr = 0.05;%網路的學習速率
% net.trainParam.goal = 0.65 * 10^(-3);%訓練網路所要達到的目標誤差
% net.divideFcn = '';%網路誤差如果連續6次迭代都沒變化,則matlab會預設終止訓練。為了讓程式繼續執行,用以下命令取消這條設定
% 5.開始訓練網路
% net = train(net, pn, tn);
% 到此BP網路訓練完成!!!!!
%
%
% 使用BP網路進行預測:
% 1.新輸入要用於預測的資料
% newInput = [73.39 75.55; 3.9635 4.0975; 0.9880 1.0268];
%2.利用原始輸入資料(訓練集的輸入資料)的歸一化引數對新輸入資料進行歸一化
% newInput = mapminmax('apply', newInput, inputStr);
%3.進行模擬
% newOutput = sim(net, newInput);
%4.反歸一化得到結果
% newOutput = mapminmax('reverse',newOutput, outputStr);
% newOutput為預測的結果,以矩陣的方式儲存
% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %
clc
clear
%準備好訓練集
%人數(單位:萬人)
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 1], {'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;
%-----------------繪製測試樣本神經網路輸出和實際樣本輸出測試結束--------------------
%-----------------開始新輸入資料進行預測的對比圖(figure(2))--------------------
%使用訓練好的神經網路對新輸入資料進行預測
%新輸入資料(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;