1. BP神經網路介紹

神經網路是機器學習中一種常見的數學模型,通過構建類似於大腦神經突觸聯接的結構,來進行資訊處理。在應用神經網路的過程中,處理資訊的單元一般分為三類:輸入單元、輸出單元和隱含單元。 顧名思義:輸入單元接受外部給的訊號與資料;輸出單元實現系統處理結果的輸出;隱含單元處在輸入和輸出單元之間,從網路系統外部是無法觀測到隱含單元的結構的。除了上述三個處理資訊的單元之外,神經元間的連線強度大小由權值等引數來決定。

  • 圖為BP神經網路結構:(圖片均為截圖來的筆記,蒟蒻手動狗頭)

  • 單個神經元的工作原理:

需要特別注意的是,f(.)是一個關於net的函式,即f(net),而net是一個由各個輸入變數線性加權求和之後的變數。

  • 另外是幾個需要補充的疑問:

  • 還有Matlab中各個引數對應的含義補充:

模型評價:R^2越接近1,預測模型越準確(決定了預測和結果的貼合程度)

BP神經網路是前向神經網路,但是改變權值係數是個反向調整

常用的啟用函式:線性函式,斜坡函式,閾值函式,S型函式(0-1),雙極性S型函式(-1,1)(輸入輸出範圍)

因為BP神經網路輸出結果參與建模,所以屬於有導師學習神經網路。

輸入、輸出歸一化:

  1. S:y=(x-min)/(max-min)
  2. 雙s y=2*(x-min)/(max-min)-1

    資料結果反歸一化

連線權值:4019+91+9+1

2. Matlab實現

%% 初始化
clear
close all
clc
format short
%% 讀取讀取
data=xlsread('資料.xlsx','Sheet1','A1:N252'); %%使用xlsread函式讀取EXCEL中對應範圍的資料即可 %輸入輸出資料
input=data(:,1:end-1); %data的第一列-倒數第二列為特徵指標
output=data(:,end); %data的最後面一列為輸出的指標值 N=length(output); %全部樣本數目
testNum=50; %設定測試樣本數目
trainNum=N-testNum; %計算訓練樣本數目 %% 劃分訓練集、測試集
input_train = input(1:trainNum,:)';
output_train =output(1:trainNum)';
input_test =input(trainNum+1:trainNum+testNum,:)';
output_test =output(trainNum+1:trainNum+testNum)'; %% 資料歸一化(輸入、輸出)
[inputn,inputps]=mapminmax(input_train,0,1);
[outputn,outputps]=mapminmax(output_train);
inputn_test=mapminmax('apply',input_test,inputps);%%50個測試集 %% 獲取輸入層節點、輸出層節點個數
inputnum=size(input,2);
outputnum=size(output,2);
disp('/////////////////////////////////')
disp('神經網路結構...')
disp(['輸入層的節點數為:',num2str(inputnum)])
disp(['輸出層的節點數為:',num2str(outputnum)])
disp(' ')
disp('隱含層節點的確定過程...') %確定隱含層節點個數
%採用經驗公式hiddennum=sqrt(m+n)+a,m為輸入層節點個數,n為輸出層節點個數,a一般取為1-10之間的整數
MSE=1e+5; %初始化最小誤差
transform_func={'tansig','purelin'}; %啟用函式
train_func='trainlm'; %訓練演算法
for hiddennum=fix(sqrt(inputnum+outputnum))+1:fix(sqrt(inputnum+outputnum))+10 %構建網路
net=newff(inputn,outputn,hiddennum,transform_func,train_func);
% 網路引數
net.trainParam.epochs=1000; % 訓練次數
net.trainParam.lr=0.01; % 學習速率
net.trainParam.goal=0.000001; % 訓練目標最小誤差
% 網路訓練
net=train(net,inputn,outputn);
an0=sim(net,inputn); %模擬結果
mse0=mse(outputn,an0); %模擬的均方誤差
disp(['隱含層節點數為',num2str(hiddennum),'時,訓練集的均方誤差為:',num2str(mse0)]) %更新最佳的隱含層節點
if mse0<MSE %%保證了不會“過擬合”
MSE=mse0;
hiddennum_best=hiddennum;
end
end
disp(['最佳的隱含層節點數為:',num2str(hiddennum_best),',相應的均方誤差為:',num2str(MSE)]) %% 構建最佳隱含層節點的BP神經網路
net=newff(inputn,outputn,hiddennum_best,transform_func,train_func); % 網路引數
net.trainParam.epochs=1000; % 訓練次數
net.trainParam.lr=0.01; % 學習速率
net.trainParam.goal=0.000001; % 訓練目標最小誤差 %% 網路訓練
net=train(net,inputn,outputn); %% 網路測試
an=sim(net,inputn_test); %用訓練好的模型進行模擬
test_simu=mapminmax('reverse',an,outputps); % 預測結果反歸一化 error=test_simu-output_test; %預測值和真實值的誤差 **%%以上用於模擬,實際用於預測的時候只需將 *測試集* 對應的輸入引數正常替換成待預測的輸入引數,即可得出預測結果** %%真實值與預測值誤差比較
figure
plot(output_test,'bo-','linewidth',1.2)
hold on
plot(test_simu,'r*-','linewidth',1.2)
legend('期望值','預測值')
xlabel('測試樣本編號'),ylabel('指標值')
title('BP測試集預測值和期望值的對比')
set(gca,'fontsize',12) figure
plot(error,'ro-','linewidth',1.2)
xlabel('測試樣本編號'),ylabel('預測偏差')
title('BP神經網路測試集的預測誤差')
set(gca,'fontsize',12) %計算誤差
[~,len]=size(output_test);
SSE1=sum(error.^2);
MAE1=sum(abs(error))/len;
MSE1=error*error'/len;
RMSE1=MSE1^(1/2);
MAPE1=mean(abs(error./output_test));
r=corrcoef(output_test,test_simu); %corrcoef計算相關係數矩陣,包括自相關和互相關係數
R1=r(1,2); disp(' ')
disp('/////////////////////////////////')
disp('預測誤差分析...')
disp(['誤差平方和SSE為: ',num2str(SSE1)])
disp(['平均絕對誤差MAE為: ',num2str(MAE1)])
disp(['均方誤差MSE為: ',num2str(MSE1)])
disp(['均方根誤差RMSE為: ',num2str(RMSE1)])
disp(['平均百分比誤差MAPE為: ',num2str(MAPE1*100),'%'])
disp(['相關係數R為: ',num2str(R1)]) %列印結果
disp(' ')
disp('/////////////////////////////////')
disp('列印測試集預測結果...')
disp([' 編號 實際值 預測值 誤差'])
for i=1:len
disp([i,output_test(i),test_simu(i),error(i)])
end

最後給出Matlab以上程式碼中對應處理的資料表

見附件

連結:https://pan.baidu.com/s/1zYIYEQh1JIPePqvNVi9uiA

提取碼:beid

參考來源:https://mianbaoduo.com/o/bread/YZmTmptv?after_pay=1