近红外PLS建模 数据处理采用二阶倒数

对近红外数据处理进行二阶倒数,对输出变量进行标准化。

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值