BP神經網絡是1986年由Rumelhart和McClelland為首的科學家提出的概念,是一種按照誤差逆向傳播算法訓練的多層前饋神經網絡,是應用最廣泛的神經網絡。它的基本思想是梯度下降法,利用梯度搜索技術,以期使網絡的實際輸出值和期望輸出值的誤差均方差為最小。
BP神經網絡由輸入層、隱含層、輸出層三大層組成,其中隱含層可以為一層或多層。隱含層內的神經元與外界沒有直接的聯繫,但其狀態的改變能影響輸入和輸出之間的關係。
MATLAB中可以實現BP神經網絡預測,只要通過輸入輸入層神經元,及設定隱含層層數、節點數及預測精度的控制要求就可以實現預測。它的原理實際上是分析輸入神經元與輸出神經元的非線性關係,這就要求輸出項參數實際上是與輸入項參數需要具有一定的關聯性。
PR:由R維的輸入樣本最小最大值構成的R*2維矩陣。
[S1S2...SN]:各層的神經元個數。
{TF1 TF2 ...TFN}:各層的神經元傳遞函數。
BTF:訓練用函數的名稱。
(2)網絡訓練
舉例1
雙輸入單輸出五組樣本 網絡結構是2-5-1
%traingd
clear;
clc;
P=[-1 -1 2 2 4;0 5 0 5 7];
T=[-1 -1 1 1 -1];
%利用minmax函數求輸入樣本範圍
net = newff(minmax(P),[5,1],{'tansig','purelin'},'trainrp');
net.trainParam.show=50;%
net.trainParam.lr=0.05;
net.trainParam.epochs=300;
net.trainParam.goal=1e-5;
[net,tr]=train(net,P,T);
net.iw{1,1}%隱層權值
net.b{1}%隱層閾值
net.lw{2,1}%輸出層權值
net.b{2}%輸出層閾值
sim(net,P)%網絡輸出
舉例2
利用三層BP神經網絡來完成非線性函數的逼近任務,其中隱層神經元個數為五個。
樣本數據:
解:
看到期望輸出的範圍是(-1.1),所以利用雙極性Sigmoid函數作為轉移函數。
程序如下:
clear;
clc;
X=-1:0.1:1;
D=[-0.9602 -0.5770 -0.0729 0.3771 0.6405 0.6600 0.4609...
0.1336 -0.2013 -0.4344 -0.5000 -0.3930 -0.1647 -.0988...
0.3072 0.3960 0.3449 0.1816 -0.312 -0.2189 -0.3201];
figure;
plot(X,D,'*'); %繪製原始數據分布圖(附錄:1-1)
net = newff([-1 1],[5 1],{'tansig','tansig'});
net.trainParam.epochs = 100; %訓練的最大次數
net.trainParam.goal = 0.005; %全局最小誤差
net = train(net,X,D);
O = sim(net,X);
figure;
plot(X,D,'*',X,O); %繪製訓練後得到的結果和誤差曲線(附錄:1-2、1-3)
V = net.iw{1,1}%輸入層到中間層權值
theta1 = net.b{1}%中間層各神經元閾值
W = net.lw{2,1}%中間層到輸出層權值
theta2 = net.b{2}%輸出層各神經元閾值
所得結果如下:
輸入層到中間層的權值:
權值直接確定法:
format long
clc;
clear;
xi=-1:0.1:1;xi=xi';
yi=[-0.9602 -0.5770 -0.0729 0.3771 0.6405 0.6600 0.4609...
0.1336 -0.2013 -0.4344 -0.5000 -0.3930 -0.1647 -.0988...
0.3072 0.3960 0.3449 0.1816 -0.312 -0.2189 -0.3201];
numSMP=length(yi); %樣本個數
numW=25; %隱層神經元個數
xiM=[];
for jj=0:1:(numW-1)
xiM=[xiM,xi.^jj]; %
end
W=pinv(xiM)*yi'; %隱層最優權值
figure;
plot(xi,yi,'k*',xi,xiM*W,'r:')
舉例3
利用三層BP神經網絡來完成非線性函數的逼近任務,其中隱層神經元個數為五個。
樣本數據:
解:
看到期望輸出的範圍超出(-1,1),所以輸出層神經元利用線性函數作為轉移函數。
程序如下:
clear;
clc;
X = [0 1 2 3 4 5 6 7 8 9 10];
D = [0 1 2 3 4 3 2 1 2 3 4];
figure;
plot(X,D,'*'); %繪製原始數據分布圖
net = newff([0 10],[5 1],{'tansig','purelin'})
net.trainParam.epochs = 100;
net.trainParam.goal=0.005;
net=train(net,X,D);
O=sim(net,X);
figure;
plot(X,D,'*',X,O); %繪製訓練後得到的結果和誤差曲線(附錄:2-2、2-3)
V = net.iw{1,1}%輸入層到中間層權值
theta1 = net.b{1}%中間層各神經元閾值
W = net.lw{2,1}%中間層到輸出層權值
theta2 = net.b{2}%輸出層各神經元閾值
所得結果如下:
輸入層到中間層的權值:
模友們可能已經發現:現在公眾號推送文章的順序,已經不會按時間排列了。這種變化,可能會讓各位模友錯過我們每天的推送。
所以,如果你還想像往常一樣,聚焦數模樂園,就需要將「數模樂園」標為星標公眾號,同時在閱讀完文章後,別忘了給一個「在看」哦。
(1)點擊頁面最上方「數模樂園」,進入公眾號主頁
(2)點擊右上角的小點點,在彈出頁面點擊「設為星標」,就可以啦。