基於matlab實現BP算法的神經網絡


本文是學習B站老哥數學建模課程之后的一點筆記。

 

BP(back propagation)算法神經網絡的簡單原理

BP神經網絡是一種采用BP學習算法(按照誤差逆向傳播訓練)的多層前饋神經網絡,是應用最廣泛的神經網絡。

神經網絡基本結構如下:

 

 共分為三層,可以理解為一組輸入數據,在隱藏層中進行各種復雜的處理,然后在輸出層輸出,生成輸出數據。

 輸入神經元的個數為因子個數(指標個數),隱藏神經元的個數一般為因子的2~3倍,輸出神經元的個數根據實際需輸出情況來定。

 如上圖三層之間的連線箭頭都代表着權重,不論是線性或者非線性,還是其他什么復雜的關系,各層間的數據都由權重來搭建關系網絡,目的是模擬大腦對信息的處理過程。

 

   神經網絡的本質就是進行數據的擬合,工作狀態分為學習和工作兩種狀態,即訓練仿真兩個步驟。

在訓練階段,給出輸入數據與正確的輸出數據,神經網絡根據輸入數據進行復雜的運算得出實際的輸出數據,實際的輸出數據與正確的輸出數據之間的差別就叫做誤差

而BP算法就是會反向傳播誤差一層一層不斷修正各層神經元之間的連接權值,正所謂信號的正向傳播和誤差的反向傳播,直到誤差在規定的范圍內或運行次數達到規定的學習次數,

此時結束算法,否則選取下一個學習樣本及對應的期望輸出,返回進入下一輪學習。

仿真階段,在經過訓練階段的大量樣本數據訓練之后,神經網絡已經較為准確,輸入數據,運行得出輸出數據,此即為預測過程。

BP網絡的訓練就是通過應用誤差反傳原理不斷調整網絡權值,使網絡模型輸出值與已知的訓練樣本輸出值之間的誤差平方和達到最小或小於某一期望值的過程。

 

基本運用

1.擬合——>進行數據的預測

2.分類(包含評價)——>聚類分析

注意:運用神經網絡的場景一定要樣本數量很多的,不然訓練會不准確,以下代碼只是為了展示效果。

編程步驟
(1)尋找對結果產生影響的各種指標,假設有m個。
(2)尋找樣本n個,構造矩陣m*n,其對應的標准輸出是n*1。
  (3)  將上述m*n與n*1分別帶入網絡中訓練,類似於下列代碼中的P與T。
(4)輸入新的數據進行仿真,類似於下列代碼中的P2。

代碼示例

clear; clc; P=[-1 -1 2 2 4;0 5 0 5 7];%兩個指標,五個樣本數 T=[-1 -1 1 1 -1]; %利用minmax函數求輸入樣本范圍,歸一化數據很重要,也可以用premnmx函數如[P,minp,maxp,T,mint,maxt]=premnmx(P,T);  net = newff(minmax(P),[7,1],{'tansig','purelin'},'trainlm'); %newff為創建網絡函數
% [7 1]為隱層神經元個數和輸出神經元個數,后面為各層之間的傳輸函數,以及修正神經網絡的方法(反向傳播的訓練函數 
net.trainParam.show=50;%顯示的間隔次數 
net.trainParam.lr=0.05;%學習率設置,應設為較少值 net.trainParam.epochs=1000;%訓練次數設置 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}%輸出層閾值 P2=[-1;2];%輸入一個樣本 y3=sim(net,P2);%計算仿真,根據輸入數據預測輸出數據

運行結果如圖(R2017b),主要關注精度時間訓練次數 的變化。

 

 

 

 

 

 

 

 

 

若訓練結果不夠准確,可更改傳輸函數和訓練函數,以下為各訓練函數,傳輸函數可自行百度

 

普通的神經網絡算法有個最大的弊端,就是很有可能陷於局部最小值點,所以后來很多人提出了修正的神經網絡算法(可跳過局部最小值點,找到真正的全局最小值點)。

更改上述訓練函數即是修正了神經網絡,在論文中如果對不同的修正神經網絡算法進行比對,或者提到這一點可能會給論文增加優勢。

 

原始數據與神經網絡預測數據繪制曲線圖進行比對,紅色為預測數據,若不夠准確可進行修正。

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,'*'); %繪制原始數據分布圖
net = newff(minmax(X),[5 1],{'tansig','tansig'}, 'trainlm');%生成BP網絡
net.trainParam.epochs = 100; %訓練的最大次數
net.trainParam.goal = 0.005; %全局最小誤差
net = train(net,X,D); %網絡訓練
O = sim(net,X); %網絡仿真
plot(X,D,X,O,'r'); %繪制訓練后得到的結果和誤差曲線
V = net.iw{1,1}%輸入層到中間層權值
theta1 = net.b{1}%中間層各神經元閾值
W = net.lw{2,1}%中間層到輸出層權值
theta2 = net.b{2}%輸出層各神經元閾值
View Code

 

運行結果如圖:

                                

 

 

 

 當然神經網絡還可以用神經網絡工具箱來運算,如圖

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  若是多指標輸入以及輸出,可用BP神經網絡算法來擬合它們之間的關系。

神經網絡的應用很廣泛,絕不止上面所提到的一點點內容,既然可以用它來預測數據,那么經過訓練肯定也可以用來預測出不同的類別或者屬性。

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM