Contents
I. 清空環境變量
clear all
clc
II. 訓練集/測試集產生
1. 導入數據
load spectra_data.mat
2. 隨機產生訓練集和測試集
temp = randperm(size(NIR,1));
% 訓練集——50個樣本
P_train = NIR(temp(1:50),:)';
T_train = octane(temp(1:50),:)';
% 測試集——10個樣本 P_test = NIR(temp(51:end),:)'; T_test = octane(temp(51:end),:)'; N = size(P_test,2);
III. 數據歸一化,BP 網絡需要歸一化處理
[p_train, ps_input] = mapminmax(P_train,0,1);
p_test = mapminmax('apply',P_test,ps_input);
[t_train, ps_output] = mapminmax(T_train,0,1);
IV. RBF/BP神經網絡創建及仿真測試
1. 創建網絡
net_rbf = newrbe(P_train,T_train,30); net_bp = newff(p_train, t_train, 9);
2. 設置 BP 網絡 訓練參數, RBF 網絡不需要設置參數,除了spread
net_bp.trainParam.epochs = 1000; net_bp.trainParam.goal = 1e-3; net_bp.trainParam.lr = 0.01;
3. BP網絡 訓練, RBF 不需要訓練
net_bp = train(net_bp,p_train,t_train);
4. 仿真測試
T_sim_rbf = sim(net_rbf,P_test); t_sim_bp = sim(net_bp,p_test);
5. 數據反歸一化
T_sim_bp = mapminmax('reverse',t_sim_bp,ps_output);
V. 性能評價
1. 相對誤差error
error_rbf = abs(T_sim_rbf - T_test)./T_test; error_bp = abs(T_sim_bp - T_test)./T_test;
2. 決定系數R^2
R2_rbf = (N * sum(T_sim_rbf .* T_test) - sum(T_sim_rbf) * sum(T_test))^2 / ((N * sum(T_sim_rbf.^2) - (sum(T_sim_rbf))^2) * (N * sum((T_test).^2) - (sum(T_test))^2)); R2_bp = (N * sum(T_sim_bp .* T_test) - sum(T_sim_bp) * sum(T_test))^2 / ((N * sum(T_sim_bp.^2) - (sum(T_sim_bp))^2) * (N * sum((T_test).^2) - (sum(T_test))^2));
3. 結果對比
result = [T_test' T_sim_rbf' T_sim_bp' error_rbf' error_bp']
result = 83.4000 83.8939 83.3325 0.0059 0.0008 86.6000 86.8234 86.8816 0.0026 0.0033 88.5500 88.6082 88.1839 0.0007 0.0041 88.7000 88.6681 88.9107 0.0004 0.0024 88.4500 88.1451 88.2298 0.0034 0.0025 86.1000 86.2906 86.3526 0.0022 0.0029 88.1000 88.2477 87.3687 0.0017 0.0083 88.7000 88.6095 88.9943 0.0010 0.0033 86.5000 86.4926 86.5093 0.0001 0.0001 85.4000 85.7454 86.0366 0.0040 0.0075
VI. 繪圖
figure
plot(1:N,T_test,'b:*',1:N,T_sim_rbf,'r-o') legend('真實值','預測值') xlabel('預測樣本') ylabel('辛烷值') string = {'基於RBF網絡測試集辛烷值含量預測結果對比';['R^2=' num2str(R2_rbf)]}; title(string) figure plot(1:N,T_test,'b:*',1:N,T_sim_bp,'r-o') legend('真實值','預測值') xlabel('預測樣本') ylabel('辛烷值') string = {'基於BP網絡測試集辛烷值含量預測結果對比';['R^2=' num2str(R2_bp)]}; title(string)