1.基本概念
人工神經(jīng)網(wǎng)絡(luò)(Artificial Neutral Network,ANN)是由大量簡單的基本元件——神經(jīng)元魂贬,相互連接,通過模擬人的大腦神經(jīng)處理信息的方式衣陶,進行信息并行處理以及自學(xué)習(xí)能力溶浴。前向反饋網(wǎng)絡(luò)(Back Propagation,BP)和徑向基網(wǎng)絡(luò)(Radical Basis Function,RBF)是目前技術(shù)較為成熟、應(yīng)用較為廣泛的兩種網(wǎng)絡(luò)廷粒。
2.常用激活函數(shù)
3.BP網(wǎng)絡(luò)
BP網(wǎng)絡(luò)是一種多層前饋神經(jīng)網(wǎng)絡(luò),它的名字源于在網(wǎng)絡(luò)訓(xùn)練中红且,調(diào)整網(wǎng)絡(luò)權(quán)值的訓(xùn)練算法是反向傳播算法(即BP學(xué)習(xí)算法)。
下圖的BP網(wǎng)絡(luò)包括輸入層涤姊、中間層(隱藏層)暇番、輸出層,每一層之間實現(xiàn)全連接思喊,而同一層的神經(jīng)元之間無連接壁酬。
輸入層神經(jīng)元和隱含層神經(jīng)元之間的是網(wǎng)絡(luò)的權(quán)值,即兩個神經(jīng)元之間的連接強度恨课。
隱含層或輸出層任一神經(jīng)元將前一層所有神經(jīng)元傳來的信息進行整合舆乔,通常還會添加閾值,這主要是模仿生物學(xué)中神經(jīng)元必須達到一定的閾值才會觸發(fā)的原理剂公,然后將整合過的信息作為該層神經(jīng)元輸入希俩。
誤差反向傳播算法(BP算法):當(dāng)一對學(xué)習(xí)樣本提供給輸入神經(jīng)元后,該層神經(jīng)元的輸出值經(jīng)過各隱含層向輸出層傳播纲辽,而輸出層的神經(jīng)元會接收到這些輸入颜武,同時璃搜,為了減少網(wǎng)絡(luò)輸出與預(yù)期輸出值之間的誤差,該網(wǎng)絡(luò)會從輸出層反向經(jīng)過各隱藏層回到輸入層鳞上,從而逐步修正各連接權(quán)值这吻。隨著這種誤差逆向傳播修正的反復(fù)進行,網(wǎng)絡(luò)對輸入模式響應(yīng)的正確率也不斷上升篙议。
BP網(wǎng)絡(luò)求解過程
①原始數(shù)據(jù)的輸入
②數(shù)據(jù)歸一化
③網(wǎng)絡(luò)訓(xùn)練
④對原始數(shù)據(jù)進行仿真
⑤將原始數(shù)據(jù)仿真的結(jié)果與已知樣本進行對比
⑥對新數(shù)據(jù)進行仿真
4.BP網(wǎng)絡(luò)應(yīng)用實例
function main()
clc % 清屏
clear all; % 清除內(nèi)存以便加快運算速度
close all; % 關(guān)閉當(dāng)前所有figure圖像
SamNum=20; % 輸入樣本數(shù)量為20
TestSamNum=20; % 測試樣本數(shù)量也是20
ForcastSamNum=2; % 預(yù)測樣本數(shù)量為2
HiddenUnitNum=8; % 中間層隱節(jié)點數(shù)量取8,比工具箱程序多了1個
InDim=3; % 網(wǎng)絡(luò)輸入維度為3
OutDim=2; % 網(wǎng)絡(luò)輸出維度為2
% 原始數(shù)據(jù)
% 人數(shù)(單位:萬人)
sqrs=[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];
% 機動車數(shù)(單位:萬輛)
sqjdcs=[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];
% 公路面積(單位:萬平方公里)
sqglmj=[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];
% 公路客運量(單位:萬人)
glkyl=[5126 6217 7730 9145 10460 11387 12353 15750 18304 19836 21024 19490 20433 22598 25107 33442 36836 40548 42927 43462];
% 公路貨運量(單位:萬噸)
glhyl=[1237 1379 1385 1399 1663 1714 1834 4322 8132 8936 11099 11203 10524 11115 13320 16762 18673 20724 20803 21804];
p=[sqrs;sqjdcs;sqglmj]; % 輸入數(shù)據(jù)矩陣(3 x 20)
t=[glkyl;glhyl]; % 目標(biāo)數(shù)據(jù)矩陣(2 x 20)
% 原始數(shù)據(jù)歸一化處理唾糯,可能提高模型精度,也可能讓模型更快收斂(如果使用梯度下降法求解最優(yōu)解)
% mapminmax可將數(shù)據(jù)歸一化鬼贱,將數(shù)據(jù)映射到[-1,1]的范圍中
[SamIn,ps1]=mapminmax(p);
minp=ps1.xmin;
maxp=ps1.xmax;
[tn,ps2]=mapminmax(t);
mint=ps2.xmin; % ps2是結(jié)構(gòu)體移怯,蘊含原始數(shù)據(jù)中的最小值和最大值
maxt=ps2.xmax;
rng('shuffle','twister') % 依據(jù)系統(tǒng)時鐘種子產(chǎn)生隨機數(shù)
NoiseVar=0.01; % 噪聲強度為0.01(添加噪聲的目的是為了防止網(wǎng)絡(luò)過度擬合)
Noise=NoiseVar*randn(2,SamNum); % 生成噪聲
SamOut=tn + Noise; % 將噪聲添加到輸出樣本上
TestSamIn=SamIn; % 這里取輸入樣本與測試樣本相同因為樣本容量偏少
TestSamOut=SamOut; % 也取輸出樣本與測試樣本相同
MaxEpochs=50000; %最多訓(xùn)練次數(shù)為50000
lr=0.035; %學(xué)習(xí)速率為0.035
E0=0.65*10^(-3); %目標(biāo)誤差為0.65*10^(-3)
W1=0.5*rand(HiddenUnitNum,InDim)-0.1; %初始化輸入層與隱含層之間的權(quán)值,返回一個8x3隨機數(shù)矩陣
B1=0.5*rand(HiddenUnitNum,1)-0.1; %初始化輸入層與隱含層之間的閾值吩愧,返回一個8x1隨機數(shù)矩陣
W2=0.5*rand(OutDim,HiddenUnitNum)-0.1; %初始化輸出層與隱含層之間的權(quán)值芋酌,返回一個2x8隨機數(shù)矩陣
B2=0.5*rand(OutDim,1)-0.1; %初始化輸出層與隱含層之間的閾值,返回一個2x1隨機數(shù)矩陣
ErrHistory=[]; %給中間變量預(yù)先占據(jù)內(nèi)存
for i=1:MaxEpochs
HiddenOut=logsig(W1*SamIn+repmat(B1,1,SamNum)); % 隱含層網(wǎng)絡(luò)輸出雁佳,logsig表示Sigmoid激活函數(shù)
NetworkOut=W2*HiddenOut+repmat(B2,1,SamNum); % 輸出層網(wǎng)絡(luò)輸出
Error=SamOut-NetworkOut; % 實際輸出與網(wǎng)絡(luò)輸出之差
SSE = sumsqr(Error); % 能量函數(shù)(誤差平方和)
ErrHistory=[ErrHistory SSE];
if SSE<E0, break, end %如果達到誤差要求則跳出學(xué)習(xí)循環(huán)
% 以下六行是BP網(wǎng)絡(luò)最核心的程序
% 他們是權(quán)值(閾值)依據(jù)能量函數(shù)負梯度下降原理所作的每一步動態(tài)調(diào)整量
Delta2=Error;
Delta1=W2'*Delta2.*HiddenOut.*(1-HiddenOut);
dW2=Delta2*HiddenOut';
dB2=Delta2*ones(SamNum,1);
dW1=Delta1*SamIn';
dB1=Delta1*ones(SamNum,1);
%對輸出層與隱含層之間的權(quán)值和閾值進行修正
W2=W2+lr*dW2;
B2=B2+lr*dB2;
%對輸入層與隱含層之間的權(quán)值和閾值進行修正
W1=W1+lr*dW1;
B1=B1+lr*dB1;
end
HiddenOut=logsig(W1*SamIn+repmat(B1,1,TestSamNum)); % 隱含層輸出最終結(jié)果
NetworkOut=W2*HiddenOut+repmat(B2,1,TestSamNum); % 輸出層輸出最終結(jié)果
a=postmnmx(NetworkOut,mint,maxt); % 還原網(wǎng)絡(luò)輸出層的結(jié)果
x=1990:2009; % 時間軸刻度
newk=a(1,:); % 網(wǎng)絡(luò)輸出客運量
newh=a(2,:); % 網(wǎng)絡(luò)輸出貨運量
figure ;
subplot(2,1,1);plot(x,newk,'r-o',x,glkyl,'b--+') %繪值公路客運量對比圖脐帝;
legend('網(wǎng)絡(luò)輸出客運量','實際客運量');
xlabel('年份');ylabel('客運量/萬人');
subplot(2,1,2);plot(x,newh,'r-o',x,glhyl,'b--+') %繪制公路貨運量對比圖;
legend('網(wǎng)絡(luò)輸出貨運量','實際貨運量');
xlabel('年份');ylabel('貨運量/萬噸');
% 利用訓(xùn)練好的網(wǎng)絡(luò)進行預(yù)測
% 當(dāng)用訓(xùn)練好的網(wǎng)絡(luò)對新數(shù)據(jù)pnew進行預(yù)測時糖权,也應(yīng)作相應(yīng)的處理
pnew=[73.39 75.55
3.9635 4.0975
0.9880 1.0268]; %2010年和2011年的相關(guān)數(shù)據(jù)
pnewn=mapminmax('apply',pnew,ps1); %利用原始輸入數(shù)據(jù)的歸一化參數(shù)對新數(shù)據(jù)進行歸一化
HiddenOut=logsig(W1*pnewn+repmat(B1,1,ForcastSamNum)); % 隱含層輸出預(yù)測結(jié)果
anewn=W2*HiddenOut+repmat(B2,1,ForcastSamNum); % 輸出層輸出預(yù)測結(jié)果
%把網(wǎng)絡(luò)預(yù)測得到的數(shù)據(jù)還原為原始的數(shù)量級堵腹;
anew=postmnmx(anewn,mint,maxt)