BP神经网络经典例子——
基于近红外光谱的汽油辛烷值测试
我这里找到了两个不同的代码(matlab实现),都可以试一下,需要数据文件的再可以找我要下,第一个方法比较简练,第二个十分详细(图多)。
代码:
load spectra_data.mat %第一个方法,生成图较少
temp = randperm(size(NIR,1));
P_train = NIR(temp(1:50),:)';
T_train = octane(temp(1:50),:)';
P_test = NIR(temp(51:end),:)';
T_test = octane(temp(51:end),:)';
N = size(P_test,2);
net = newrbe(P_train,T_train,0.3);
w1=net.iW{1,1}
isequal(w1',P_train)
b1=net.b{1}
T_sim = sim(net,P_test);
error = abs(T_sim - T_test)./T_test;
R2 = (N * sum(T_sim .* T_test) - sum(T_sim)
* sum(T_test))^2 / ((N * sum((T_sim).^2) - (sum(T_sim))^2) * (N *
sum((T_test).^2) - (sum(T_test))^2));
result = [T_test' T_sim' error']
figure
plot(1:N,T_test,'b:*',1:N,T_sim,'r-o')
legend('真实值','预测值')
xlabel('预测样本')
ylabel('辛烷值')
string = {'RBF:RBF实现测试集辛烷值含量预测结果对比—Jason niu';['R^2=' num2str(R2)]};
title(string)
clear all;%第二个方法
clc
load spectra_data.mat%产生训练集/测试集
temp=randperm(size(NIR,1));%随机产生训练集和测试集
P_train=NIR(temp(1:50),:)';
T_train=octane(temp(1:50),:)'; %训练集50个样本P_test=NIR(temp(51:end),:)';
T_temp=octane(temp(51:end),:)'; %测试集 10个样本
N=size(P_test,2);
net=newff(P_train,T_train,5);%创建/训练BP神经网络
net.trainParam.epochs=1000;
net.trainParam.goal=1e-3;
net.trainParam.lr=0.01;
net=train(net,P_train,T_train); %训练网络
T_sim_bp=sim(net,P_test); %仿真测试
net=newrbe(P_train,T_train,0.5);
%创建BPF神经网络
T_sim_rbf=sim(net,P_test);
%仿真测试
%性能评价
error_bp=abs(T_sim_bp-T_test)./T_test;
error_rbf=abs(T_sim_rbf-T_test)./T_test;
%相对误差
R2_bp=(N*sum(T_sim_bp.*T_bp)-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));
%决定系数R^2
result=[T_test'T_sim_bp'T_sim_rbf'error_bp'error_rbf'] %结果对比
figure %绘图
plot(1:N,T_test,'b:*',1:N,T_sim_bp,'r-o',1:N,T_sim_rbf,'k-.^')
legend('真实值','BP预测值','RBF预测值')
xlabel('预测样本')
ylabel('辛烷值')
string={'测试集辛烷值含量预测结果对比(BP vs RBF)';['R^2='num2str(R2_bp)'(bp)''R^2='num2str(R2_rbf)'(RBF)']};
title(string)