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神經網路預測函式輸出,預測結果和預測輸出和期望輸出之間的誤差如下圖所示。