
我做的是基于中红外光谱的定量分析,想用胆固醇缺失模型预测有胆固醇的葡萄糖已验证偏差,但是目前用以上代码提取主成分数f报错了,请问我该调整哪里呢?
以下是我的plsf代码:
function [minRMSECV,f]=plsf(x1,y1,f)
%无主因子数输入时,进行1~20计算最优主因子数
if nargin<3 %用来判断输入变量个数的函数,nargout表示输出
n=size(x1,1);
RMSECV=zeros(1,20);%zeros(m,n)表示生成一个m行n列的矩阵零矩生阵ones函数产一矩阵
for f=1:20
e=zeros(n,1);
for i=1:n
a=[(1:i-1),(i+1:n)];
xval=x1(a,:);
yval=y1(a);
xcal=x1(i,:);
ycal=y1(i);
xm=mean(xval);
xvalc=xval-repmat(xm,n-1,1);
xcalc=xcal-xm;
[~,~,~,~,b]=plsregress(xvalc,yval,f);
Ycal=[1 xcalc]*b;
e(i)=Ycal-ycal;
end
RMSECV(f)=sqrt(e'*e/n);%交叉验证均方根误差,用来测试模型对于训练集样本的预测能力,越小说明预测能力越强 ;
end
[minRMSECV,f]=min(RMSECV);
%{
figure
plot((1:20),RMSECV,'k-h')%k-*表示标记方式对于标记方式我的CSDN里面有
title('RMSECV与主因子关系图')
xlabel('主因子数')
ylabel('RMSECV')
hold on%当前轴及图像保持而不被刷新,准备接受此后将绘制的图形,多图共存
plot(f,minRMSECV,'s')%上述对模型进行主成分进行选择,并计算出主成分数
%}
%有主因子输入时,进行留一交叉验证;留一法交叉验证,是一种模型的内部检验方法,即当模型数据太少,没有多余的数据集可以对样本进行验证时,则采用这种方法对所建立的模型进行检验。用来检验上述选择的主成分是否具有很好的表示整个模型数据的能力
else
n=size(x1,1);
e=zeros(n,1);
for i=1:n
a=[(1:i-1),(i+1:n)];
xval=x1(a,:);
yval=y1(a);
xcal=x1(i,:);
ycal=y1(i);
xm=mean(xval);
xvalc=xval-repmat(xm,n-1,1);
xcalc=xcal-xm;
[~,~,~,~,b]=plsregress(xvalc,yval,f);
Ycal=[1 xcalc]*b;
e(i)=Ycal-ycal;
end
minRMSECV=sqrt(e'*e/n);
f=f;