对近红外数据处理进行二阶倒数,对输出变量进行标准化。
clc;
clear;
%% 数据导入
%训练集
A=load("NITSingleSeed.mat");
data_train = A.Calibration_X;
target_out = A.Calibration_Y;
% 测试
date_test = A.Validation_X;
predict_out= A.Validation_Y;
VarLabel_X = A.VarLabels_X;
%% 数据处理
var=[data_train,target_out];
mu=mean(var); %求均值
sig=std(var); %求标准差
ab=zscore(var); %数据标准化
a=ab(:,[1:100]); %标准化后的自变量
b=ab(:,end); %因变量数据
% 计算一阶导数
y_prime = diff(data_train');
% 计算二阶导数
a = diff(y_prime); %98*415 415个样本
a = a';
% 进行 PLS 建模
[XL,YL,XS,YS,beta,PCTVAR,MSE,stats] = plsregress(a,b);
test_VAR = [date_test,predict_out];
AAA = repmat(mu,size(test_VAR,1),1);
BBB = repmat(sig,size(test_VAR,1),1);
ab_test = (test_VAR-AAA)./BBB ;
a1= ab_test(:,[1:100]);
b1 = ab_test(:,end); %因变量数据
% 计算一阶导数
y_prime1 = diff(date_test');
% 计算二阶导数
a1 = diff(y_prime1); %98*108 108个样本
a1 = a1';
% 对测试集进行预测
y_pred = [ones(size(a1, 1), 1) a1] * beta;
y_pred = y_pred .*BBB(:,end) +AAA(:,end); %反归一化
%% 绘制预测结果和真实值的对比
%N = size(a,1);% 样本个数
N = size(a1,1);
for i =1:size(b,2)
yz = predict_out (:,i);% 真实值
yc = y_pred (:,i);% 预测值
R2 = (N*sum(yc.*yz)-sum(yc)*sum(yz))^2/((N*sum((yc).^2)-(sum(yc))^2)*(N*sum((yz).^2)-(sum(yz))^2)); %计算R方
figure
plot(1:N,yz,'b:*',1:N,yc,'r--^')
legend('真实值','预测值','location','best')
xlabel('测试样本个数')
ylabel('值')
title({'预测结果对比';['R^2=' num2str(R2)]});
end
%% 三种方法检验网络性能
% for i =1:size(b,2)
% yz = predict_out (:,i);% 真实值
% yc = y_pred (:,i);% 预测值
% % 第一种方法,均方误差
% perf = mse(predict_out,y_pred)
% % 第二种方法,回归图
% figure;
% plotregression(yz,yc,['第',num2str(i),'个回归图'])
% % 第三种方法,误差直方图
% e = yz-yc;
% figure;
% ploterrhist(e,['第',num2str(i),'个误差直方图'])
% end