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軸
BP神經網絡(基於MATLAB)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.