登录论坛

查看完整版本 : [求助]关于PLS程序主成分的确定问题


yiouyang
2008-12-17, 15:59
我再用PLS程序来确定最佳主成分数时,开始只把每个样品对应的1-8个主成分数时的预测值求出来,无奈当程序运行时,只是每个样品在1-3个主成分数的预测值能求出来,其余的皆为NaN。而且当把主成分数的值从5-6或者就只求一个时,却能求出来,不过是值很大罢了,达到1e+014级别。不知道是什么问题,我怀疑是程序内存溢出的问题,但不确定,不知哪位大侠可以告送我,谢谢了!程序如下:
clear all
for bsh=1:21
X=[3 3 3 3.5 3.5 3.5 4.0...
4 4 4.5 4.5 4.5 5 5.0...
5 5.5 5.5 5.5 6 6 6.0;
21 28.5 18.5 28.5 18.5 26 18.5...
26 16 26 16 23.5 16 23.5...
13.5 23.5 13.5 21 13.5 21 28.5;
9.5 7.5 5.5 4.5 9.5 7.5 6.5...
4.5 9.5 8.5 6.5 4.5 10.5 8.5...
6.5 5.5 10.5 8.5 7.5 5.5 10.5];
Y=[0.9965 1.0103 0.7116 0.8802 0.8769 0.9886 0.7931...
0.8957 0.8292 1.0861 0.7178 0.9046 0.8774 1.0688...
0.6443 0.986 0.8158 1.1064 0.7839 1.0466 1.2769;
1.03575 1.0112 0.7308 0.921 0.9126 1.00245 0.8441...
0.93165 0.85005 1.12885 0.76075 0.8995 0.88985 1.1265...
0.7044 1.0113 0.8188 1.16875 0.7951 1.07555 1.314;
1.03285 1.0424 0.7268 0.9247 0.9458 1.02645 0.8699...
0.92605 0.83985 1.17805 0.77125 0.9299 0.90195 1.1312...
0.6945 1.0479 0.8298 1.14835 0.8226 1.09835 1.3423;
1.0451 1.0507 0.7766 0.94435 0.95625 1.07705 0.8704...
0.972 0.8415 1.14785 0.79915 0.94505 0.9412 1.1617...
0.7177 1.04705 0.84205 1.16585 0.8186 1.0869 1.3531;
1.057305 1.08446 0.75684 0.95638 0.94743 1.050385 0.88335...
0.929905 0.856955 1.144695 0.794075 0.95723 0.947065 1.15392...
0.7045 1.04104 0.86639 1.196145 0.82921 1.067765 1.33289;
1.058155 1.06881 0.77009 0.962305 0.931955 1.04721 0.86465...
0.926905 0.876855 1.15667 0.78175 0.925005 0.914515 1.15987...
0.69305 1.052065 0.844815 1.17877 0.83671 1.076265 1.31669;
1.043855 1.05976 0.73484 0.930555 0.934405 1.03381 0.8554...
0.932505 0.862155 1.14137 0.75155 0.938555 0.927315 1.14282...
0.7041 1.033115 0.822565 1.17037 0.81206 1.053565 1.31124];
x1=X(:,bsh);
x1=x1';
X(:,bsh)=[];
Y(:,bsh)=[];
X=X';
Y=Y';
N=size(X,1);
Xmean=mean(X);
Xstd=std(X);
Ymean=mean(Y);
Ystd=std(Y);
X=(X-Xmean(ones(N,1),:))./Xstd(ones(N,1),:);
Y=(Y-Ymean(ones(N,1),:))./Ystd(ones(N,1),:);
for bsh2=1:8
tol=1e-15;
tol2=1e-14;
[rX,cX]=size(X);
[rY,cY]=size(Y);
n=max(cX,cY);
T=zeros(rX,n);
P=zeros(cX,n);
U=zeros(rY,n);
Q=zeros(cY,n);
B=zeros(n,n);
W=P;
k=0;
while norm(Y)>tol2 && k<bsh2
[dummy,tidx]=max(sum(X.*X));
[dummy,uidx]=max(sum(Y.*Y));
t1=X(:,tidx);
u=Y(:,uidx);
t=zeros(rX,1);
while norm(t1-t)>tol
w=X'*u/(u'*u);
w=w/norm(w);
t=t1;
t1=X*w;
q=Y'*t1/(t1'*t1);
q=q/norm(q);
u=Y*q;
end
% update p based on t
t=t1;
p=X'*t/(t'*t);
pnorm=norm(p);
p=p/pnorm;
t=t*pnorm;
w=w*pnorm;

% regression and residuals
b=u'*t/(t'*t);
X=X-t*p';
Y=Y-u*q';

% save iteration results to outputs:
k=k+1;
T(:,k)=t;
P(:,k)=p;
U(:,k)=u;
Q(:,k)=q;
W(:,k)=w;
B(k,k)=b;
% uncomment the following line if you wish to see the convergence
% disp(norm(Y))
end
T(:,k+1:end)=[];
P(:,k+1:end)=[];
U(:,k+1:end)=[];
Q(:,k+1:end)=[];
W(:,k+1:end)=[];
B=B(1:k,1:k);
yp=(x1-Xmean)./Xstd*(P*B*Q')
end
end