1. 程式人生 > >matlab與BP神經網路擬合非線性函式

matlab與BP神經網路擬合非線性函式

背景介紹

在實際工程應用中會遇到一些複雜的非線性系統,這些系統方程複雜,難以用數學方法建模。在這種情況下,可以使用BP神經網路表達這些非線性系統。該方法把位置系統看成是一個黑箱,首先用系統輸入輸出資料訓練BP神經網路,使網路能夠表達該未知函式,然後用訓練好的BP神經網路預測系統輸出。

本屆擬合的非線性函式為

影象如下


計算過程

       基於BP神經網路的非線性函式擬合算法流程可以分為BP神經網路構建、BP神經網路訓練和BP神經網路預測三步。

       BP神經網路構建根據擬合非線性函式特點確定BP神經網路結構,由於該非線性函式有兩個輸入引數,一個輸出引數,所以BP神經網路結構為2-5-1,即輸入層有兩個節點,隱含層有5個節點,輸出層有1個節點。

BP神經網路訓練用非線性函式輸入輸出資料訓練神經網路,使訓練後的網路能夠預測非線性函式輸出。從非線性函式中隨機得到2000組輸入輸出資料,從中隨機選擇1900組作為訓練資料,用於網路訓練,100組作為測試資料,用於測試網路的訓練效能。

       神經網路預測用訓練好的網路預測函式輸出,並對預測結果進行分析。

       根據非線性函式方程隨機得到該函式的2000組輸入輸出資料,將資料儲存在data.mat檔案中,input是函式輸入資料,output是函式輸出資料。從輸入輸出資料中隨機選取1900組資料作為網路訓練資料,100組資料作為網路測試資料,並對訓練資料進行歸一化處理。

程式碼如下:

%% 該程式碼為基於BP神經網路的預測演算法

%% 清空環境變數

clc

clear

%% 訓練資料預測資料提取及歸一化

%下載輸入輸出資料

load data input output

%從1到2000間隨機排序

k=rand(1,2000);

[m,n]=sort(k);

%找出訓練資料和預測資料

input_train=input(n(1:1900),:)';

output_train=output(n(1:1900));

input_test=input(n(1901:2000),:)';

output_test=output(n(1901:2000));

%選連樣本輸入輸出資料歸一化

[inputn,inputps]=mapminmax(input_train);

[outputn,outputps]=mapminmax(output_train);

%% BP網路訓練

% %初始化網路結構

net=newff(inputn,outputn,5);

net.trainParam.epochs=100;

net.trainParam.lr=0.1;

net.trainParam.goal=0.00004;

%網路訓練

net=train(net,inputn,outputn);

%% BP網路預測

%預測資料歸一化

inputn_test=mapminmax('apply',input_test,inputps);

%網路預測輸出

an=sim(net,inputn_test);

%網路輸出反歸一化

BPoutput=mapminmax('reverse',an,outputps);

%% 結果分析

figure(1)

plot(BPoutput,':og')

hold on

plot(output_test,'-*');

legend('預測輸出','期望輸出')

title('BP網路預測輸出','fontsize',12)

ylabel('函式輸出','fontsize',12)

xlabel('樣本','fontsize',12)

%預測誤差

error=BPoutput-output_test;

figure(2)

plot(error,'-*')

title('BP網路預測誤差','fontsize',12)

ylabel('誤差','fontsize',12)

xlabel('樣本','fontsize',12)

figure(3)

plot((output_test-BPoutput)./BPoutput,'-*');

title('神經網路預測誤差百分比')

errorsum=sum(abs(error));

       用訓練好的BP神經網路預測函式輸出,預測結果和預測輸出和期望輸出之間的誤差如下圖所示。

從上圖可以看出,雖然BP神經網路具有較高的擬合能力,但是網路預測結果仍有一定的誤差,某些樣本點的預測誤差較大

多隱含層BP神經網路

BP 神經網路由輸入層、隱含層和輸出層組成,隱含層根據層數又可以分為單隱含層和多隱含層。多隱含層由多個單隱含層組成,同單隱含層相比,多隱含層泛化能力強、預測精度高,但是訓練時間較長。隱含層層數的選擇要從網路精度和訓練時間上綜合考慮,對於較簡單的對映關係,在網路精度達到要求的情況下,可以選擇單隱含層,以求加快速度;對於複雜的對映關係,則可以選擇多隱含層,以期提高網路的預測精度。

程式碼如下:

%% 該程式碼為基於雙隱含層BP神經網路的預測

%% 清空環境變數

clc

clear

%% 訓練資料預測資料提取及歸一化

%下載輸入輸出資料

load data input output

%從1到2000間隨機排序

k=rand(1,2000);

[m,n]=sort(k);

%找出訓練資料和預測資料

input_train=input(n(1:1900),:)';

output_train=output(n(1:1900));

input_test=input(n(1901:2000),:)';

output_test=output(n(1901:2000));

%選連樣本輸入輸出資料歸一化

[inputn,inputps]=mapminmax(input_train);

[outputn,outputps]=mapminmax(output_train);

%% BP網路訓練

% %初始化網路結構

net=newff(inputn,outputn,[5 5]);

net.trainParam.epochs=100;

net.trainParam.lr=0.1;

net.trainParam.goal=0.00004;

%網路訓練

net=train(net,inputn,outputn);

%% BP網路預測

%預測資料歸一化

inputn_test=mapminmax('apply',input_test,inputps);

%網路預測輸出

an=sim(net,inputn_test);

%網路輸出反歸一化

BPoutput=mapminmax('reverse',an,outputps);

%% 結果分析

figure(1)

plot(BPoutput,':og')

hold on

plot(output_test,'-*');

legend('預測輸出','期望輸出')

title('BP網路預測輸出','fontsize',12)

ylabel('函式輸出','fontsize',12)

xlabel('樣本','fontsize',12)

%預測誤差

error=BPoutput-output_test;

figure(2)

plot(error,'-*')

title('BP網路預測誤差','fontsize',12)

ylabel('誤差','fontsize',12)

xlabel('樣本','fontsize',12)

figure(3)

plot((output_test-BPoutput)./BPoutput,'-*');

title('神經網路預測誤差百分比')

errorsum=sum(abs(error));

用訓練好的雙隱含層BP神經網路預測函式輸出,預測結果和預測輸出和期望輸出之間的誤差如下圖所示。