m0_68598352 2024-04-14 13:11 采纳率: 0%
浏览 12

matlab 如何解决这个报错?关于pls提取主成分数f的问题!

img


我做的是基于中红外光谱的定量分析,想用胆固醇缺失模型预测有胆固醇的葡萄糖已验证偏差,但是目前用以上代码提取主成分数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;

  • 写回答

4条回答 默认 最新

  • 檀越@新空间 2024-04-14 13:11
    关注

    下午好🌅🌅🌅
    本答案参考ChatGPT-3.5

    关于pls提取主成分数f的问题,代码中出现错误,无法提取主成分数f。以下是解决方案:

    1. 查看错误信息,了解出错原因。

    2. 检查输入参数x1、y1和f是否正确传入函数中,并进行相应调整。

    3. 可以修改RMSECV的计算方式,采用交叉验证均方误差的计算方式,即把求和部分换成平方和,代码如下:

      RMSECV(f)=sqrt(sum(e.^2)/(n-1));

    4. 如果问题仍然存在,可以考虑增加数据量或尝试改变数据预处理方式进行优化。

    修改后的代码:

    function [minRMSECV,f]=plsf(x1,y1,f)

    %无主成分数输入时,进行1~20计算最优主成分数 if nargin<3 n=size(x1,1); RMSECV=zeros(1,20); 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(sum(e.^2)/(n-1)); end [minRMSECV,f]=min(RMSECV);

    %有主成分数输入时,进行留一交叉验证 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(sum(e.^2)/(n-1)); f=f; end end

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月14日