天天看點

數學模組化學習(44):BP神經網絡經典應用,詳細講解配matlab代碼

文章目錄

要求設計一個BP網絡,逼近函數g(x)=1+sin(kpi/2x),實作對該非線性函數的逼近。其中,分别令k=2,3,6進行仿真,通過調用參數得出信号的頻率與隐含層借點之間,隐含層節點與函數逼近能力之間的關系。

假設頻率參數k=2,繪制逼近的非線性函數的目标函數。

matlab代碼如下:

clear all
clc
k=2;
p=[-1:0.5:8];
g=1+sin(k*pi/2*p);
plot(p,g,'-');
title('要逼近的非線性函數');
xlabel('時間');
ylabel('非線性函數');      

運作後得到目标函數圖形:

數學模組化學習(44):BP神經網絡經典應用,詳細講解配matlab代碼

用newff函數獎勵BP網絡結構。隐含層神經元數目n可以改變,暫定n=5,輸出層有一個神經元。選擇隐含層和輸出層神經元傳遞函數分别為tansing函數和purelin函數,網絡訓練的算法采用Levenberg-Marquardt算法trainlm。

n=5;
net=newff(minmax(p),[n,1],{'tansig','purelin'},'trainlm');
%對于初始網絡,可以應用sim()函數觀察網絡輸出
y1=sim(net,p);
figure;
plot(p,g,'-',p,y1,':')
title('為訓練網絡的輸出結果')
xlabel('時間')
ylabel('仿真輸出--原函數--')      

運作上述代碼可以得到網絡輸出曲線與原函數的比較圖:

數學模組化學習(44):BP神經網絡經典應用,詳細講解配matlab代碼

因為使用newff函數獎勵函數網絡時,權值和阙值的初始化是随機的,是以網絡輸出結構很差,根本達不到畢竟函數的目的,每次運作的結果有時也不同。

應用train()函數對網絡進行訓練前,需要預先設定網絡訓練參數。将訓練時間設定為200,訓練精度設定為0.2,其餘參數使用預設值。訓練神經網絡的matlab代碼如下:

net.trainParam.epochs=200;%網絡訓練時間設定為200
net.trainParam.goal=0.2;%網絡訓練精度為0.2
net=train(net,p,g);%開始訓練網絡      

運作後得到的誤差變化過程如下:

數學模組化學習(44):BP神經網絡經典應用,詳細講解配matlab代碼

對于訓練好的網絡進行仿真:

y2=sim(net,p);
figure;
plot(p,g,'-',p,y1,':',p,y2,'--')
title('訓練後網絡的輸出結果');
xlabel('時間');
ylabel('仿真輸出');      

繪制網絡輸出曲線,并與原始非線性函數曲線以及未訓練網絡的輸出結果曲線相比較,如圖:

數學模組化學習(44):BP神經網絡經典應用,詳細講解配matlab代碼

從圖可以看出,相對于沒有訓練的曲線,經過訓練之後的曲線和原始的目标曲線更接近。這說明經過訓練後,BP網絡對非線性函數的逼近效果更好。

改變非線性函數的頻率和BP函數銀行層神經元的數目,對于函數逼近的效果要更差一些;隐含層神經元的數目對于網絡逼近效果頁有一定影響,一般來說,隐含層神經元數目多,則BP網絡逼近非線性函數的能力越強。

(暫時寫到這,晚上繼續編輯本文,做更多的分析)

繼續閱讀