BP神經網絡(基於MATLAB)

clc
clear all

%% 導入數據
load('S_Data.mat')     % 預測S含量所用數據

n = 12;   % n 是自變量的個數
m = 1;    % m 是因變量的個數
%% 讀取訓練數據
train_num = 1600;  %訓練樣本數
train_Data = S_Data(1:train_num,:);
% 特徵值歸一化
[train_Input,minI,maxI] = premnmx(train_Data(:,1:n)');
% 構造輸出矩陣
[train_Output,minO,maxO] = premnmx(train_Data(:,n+1:end)');

%% 創建神經網絡
% net = newff(P,T,S,TF,BTF,BLF,PF)
% net = newff(P,T,[隱層的神經元的個數,輸出層的神經元的個數],{隱層神經元的傳輸函數,輸出層的傳輸函數},'反向傳播的訓練函數','學習函數','性能函數')
% P爲輸入矩陣,T爲期望輸出矩陣
% TF爲神經網絡的傳輸函數,默認爲'tansig'函數爲隱層的傳輸函數,purelin函數爲輸出層的傳輸函數
% 一般在這裏還有其他的傳輸的函數一般的如下,如果預測出來的效果不是很好,可以調節
% TF1 = 'tansig';TF2 = 'logsig';
% TF1 = 'logsig';TF2 = 'purelin';
% TF1 = 'logsig';TF2 = 'logsig';
% TF1 = 'purelin';TF2 = 'purelin';
TF1='tansig';TF2='purelin';

net = newff( train_Input,train_Output,5,{ TF1,TF2 },'traincgf','learngdm','mse'); 

 %%%%%%%%%% 設置網絡參數 %%%%%%%%%%%
%% 權值賦定值
% [m1,n1]=size(net.IW{1,1});
% net.IW{1,1}=0.3*ones(m1,n1);
% [m2,n2]=size(net.LW{2,1});
% net.LW{2,1}=0.3*ones(m2,n2);
%% 權值賦隨機值
 %net.layers{1}.initFcn = 'initwb';
% % net.inputWeights{1,1}.initFcn = 'rands';  % 將權值設置爲[-1,1]之間的隨機數
% % net.biases{1,1}.initFcn = 'rands';    % 將閾值設置爲[-1,1]之間的隨機數
% % net.biases{2,1}.initFcn = 'rands';    % 將閾值設置爲[-1,1]之間的隨機數
% % 
% % net.layers{2}.initFcn = 'initwb';
% % net.inputWeights{1,1}.initFcn = 'rands';  % 將權值設置爲[-1,1]之間的隨機數
% % net.biases{1,1}.initFcn = 'rands';    % 將閾值設置爲[-1,1]之間的隨機數
% % net.biases{2,1}.initFcn = 'rands';    % 將閾值設置爲[-1,1]之間的隨機數
% % net = init(net);
% 
 net.trainparam.epochs = 1000;        % 最大迭代次數
  net.trainparam.goal = 1e-5;         % 網絡性能函數訓練目標值
  net.trainParam.lr = 0.01;           % 學習率
  net.trainparam.mc = 0.95;           % 動量因子
  net.trainparam.show = 10;           % 顯示訓練迭代過程
  net.trainParam.max_fail = 100;      % 最大確認失敗次數
 
% %% 指定訓練參數
% % net.trainFcn = 'traingdx'; % 變學習率動量梯度下降算法
% % net.trainFcn = 'trainlm'; %Levenberg-Marquardt算法,內存需求最大,收斂速度最快
% % net.trainFcn = 'trainbr'; % 貝葉斯正則化算法
% % net.trainFcn = 'trainbfg'; %Quasi-Newton Algorithms - BFGS Algorithm,計算量和內存需求均比共軛梯度算法大,但收斂比較快
% % net.trainFcn = 'traingd'; % 梯度下降算法
% % net.trainFcn = 'traingdm'; % 動量梯度下降算法
% % net.trainFcn = 'traingda'; % 變學習率梯度下降算法

% 開始訓練
tic;  % 仿真計時開始
 net = train(net,train_Input,train_Output);% BP神經網絡訓練
BPtrain_Output = sim(net,train_Input );% BP神經網絡訓練數據預測
toc;   % 仿真計時結束

train_Output = postmnmx(train_Output,minO,maxO);
BPtrain_Output = postmnmx(BPtrain_Output,minO,maxO);
% 訓練數據誤差
train_err = train_Output - BPtrain_Output;
n1 = length(BPtrain_Output);
train_RMSE = sqrt(sum((train_err).^2)/n1);

%% 讀取測試數據
test_Data = S_Data(train_num+1:end,:);
% 特徵值歸一化
test_Input = tramnmx(test_Data(:,1:n)',minI,maxI);
% 構造測試輸出矩陣
test_Output = tramnmx(test_Data(:,n+1:end)',minO,maxO);

%% BP神經網絡測試數據預測
BPtest_Output = sim(net,test_Input);
test_Output = postmnmx(test_Output,minO,maxO);
BPtest_Output = postmnmx(BPtest_Output,minO,maxO);
% 測試數據誤差
test_err = test_Output - BPtest_Output;
n2 = length(BPtest_Output);
test_RMSE = sqrt(sum((test_err).^2)/n2);

%% 預測結果可視化
figure(1);  % 繪製圖1
subplot(2,1,1);  % 圖1包含2行1列個子圖形,首先繪製子圖1
plot(BPtest_Output,':og');  % 用綠色的o繪製測試數據的預測輸出值
hold on;
plot(test_Output','-*b');  % 用藍色的*繪製測試數據的期望輸出值
legend('預測輸出','期望輸出');  % 子圖1的註釋
title('BP神經網絡預測S含量結果','fontsize',12)  %子圖1的標題
ylabel('S含量','fontsize',12);  % y軸
xlabel('樣本','fontsize',12);  % x軸
subplot(2,1,2);  % 繪製子圖2
plot(abs(test_Output - BPtest_Output),'-*');  % 輸出測試數據的預測誤差
title('BP神經網絡預測S含量誤差','fontsize',12)  %子圖2的標題
ylabel('誤差','fontsize',12);  % y軸
xlabel('樣本','fontsize',12);  % x軸
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章