Matlab實現BP神經網絡預測(附實例數據及代碼)


  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


免責聲明!

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



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