思路说明
此程序主要是基于Matlab,应用regress函数进行多元线性拟合,为了反映拟合出的结果具有预测能力,即:按照机器学习的说法,为了检验训练出的模型能够预测新的数据集,采用留一法进行检验。
主要解决了如何
留一法介绍
简单地说,需要对n个数据点进行线性拟合,我们每次采用n-1个数据作为训练集进行拟合,得到一个线性拟合公式,再用未参与拟合的数据点作为测试集,检验该拟合方法的的误差;重复n次后,就得到了每个点作为测试集的误差,从而可以看出该线性拟合方法是否有效。
代码和具体过程
- 进行两元线性拟合,按照留一法检验线性拟合的误差
clear; %清除Matlab工作区的数据
for i=1:15
T_ambt =xlsread('data.xlsx','公式拟合20210129','D4:D18');%导入自变量T_ambt、Rh和因变量c
Rh=xlsread('data.xlsx','公式拟合20210129','F4:F18');
c=xlsread('data.xlsx','公式拟合20210129','I4:I18');
T_ambt(i)=[]; %去掉测试点的值
Rh(i)=[];
c(i)=[];
n=length(T_ambt); %利用除测试点以外的数据进行线性拟合
x=[ones(n,1) T_ambt Rh ];
[a(:,:,i), bint(:,:,i), r(:,:,i), rint(:,:,i), stats(:,:,i)] = regress(c,x);
end
T_ambt =xlsread('data.xlsx','公式拟合20210129','D4:D18'); %读入原始的数据
Rh=xlsread('data.xlsx','公式拟合20210129','F4:F18');
c=xlsread('data.xlsx','公式拟合20210129','I4:I18');
for i=1:15 %计算每个测试点在各自的多元拟合结果下的相对误差Eer
Eer(i)=(a(1,1,i)+a(2,1,i)*T_ambt(i)+a(3,1,i)*Rh(i)-c(i))/c(i);
end
gress函数使用方法介绍请参考网站: Matlab_gress.
2.画出相对误差的散点图,本例中的相对误差基本上都在30%以内,因为本例的数据是工程数据,可以接受该误差。
hold on
scatter([1:1:15],Eer,'filled') %残差图
xlabel('数据序号') %本程序共有15个数据进行拟合
ylabel('相对误差')
hold off
结果图如下: