用MATLAB编写的PLS算法程序
- 格式:docx
- 大小:16.19 KB
- 文档页数:2
clear all;
load DATA1;
load DATA3;
[X0,Y0]=stda(X,Y);
x0=X0;
y0=Y0;
[W,T,U,V,RX,RY,YY]=regress(X0,Y0);
T11=T;
[W2,T2,U2,V2,RX2,RY2,YY2]=regress(RX,RY);
T3=[T T2];
X6=W*V;
[M1 N1]=size(X0);
M2=eye(N1);
X7=V2*(M2-W*U')*W2;
out1=X6+X7;
X9=X0*out1;
[press1,ss1,j]=pressing(X0,Y0,YY,X9);
L=length(press1);
T3(:,1)=T;
T3(:,2)=T2;
W3(:,1)=W;U3(:,1)=U;
W3(:,2)=W2;U3(:,2)=U2;
F1=1;out=G;
if press1(2)<=press1(1)
for i=3:j-2
[W3(:,i),T(:,i),U(:,i),V3(i),RX3,RY3,YY3(:,i)]=regress(RX2,RY2);
for k=1:i-1
F1=F1*(M2-W3(:,k)*U3(:,k)');
end
X8=V3(i)*F1*W3(:,i);
G=G+X8;
out=G;
X10=X0*out;
end
[b,bint,r,rint,statss]=regress(Y0,T3);
else
[b,bint,r,rint,statss]=regress(Y0,T);
out=X6;
T3=T;
end
function[X0,Y0]=stda(X,Y);
A=mean(X);
B=mean(Y);
A0=std(X);
B0=std(Y);
L=length(A0);
for i=1:L
X0(:,i)=(X(:,i)-A(1,i))/A0(1,i);
end
Y0=(Y-B)/B0;
function[W1,T1,U1,V1,RX1,RY1,YY]=regress(X1,Y1);
Z0=X1'*Y1;
W1=Z0/norm(Z0,2);
T1=X1*W1;
U1=X1'*T1/(T1'*T1);
V1=Y1'*T1/(T1'*T1);
RX1=X1-T1*U1';
RY1=Y1-T1*V1;
YY=T1*V1;
function[press,SS,j]=pressing(X2,Y2,YX1,YX2)
[M1 N1]=size(X2);
press(1)=0;
press(2)=0;
SS(1)=0;
SS(2)=0;
for i=1:M1
X5=X2;
Y5=Y2;
X5(i,:)=[];
Y5(i)=[];
[W5,T5,U5,V5,RX5,RY5,YY5]=regress(X5,Y5);
Y6(i)=V5*X2(i,:)*W5;
press(1)=press(1)+(Y2(i)-Y6(i))^2;
SS(1)=SS(1)+(Y2(i)-YX1(i))^2;
[W25,T25,U25,V25,RX25,RY25,YY25]=regress(RX5,RY5);
T35=[T5 T25];
[b5,bint5,r5,rint5,stats5]=regress(Y5,T35);
X65=W5*V5;
[M15 N15]=size(X5);
M25=eye(N15);
X75=V25*(M25-W5*U5')*W25;
X85=X65+X75;
X95(i)=X2(i,:)*X85;
press(2)=press(2)+(Y2(i)-X95(i))^2;
SS(2)=SS(2)+(Y2(i)-YX2(i))^2;
end
W35(:,1)=W5;U35(:,1)=U5;
W35(:,2)=W25;U35(:,2)=U25;
F=1;j=3;S=0;
while press(j-1)<=press(j-2)
press(j)=0;
[W35(:,j),T35(:,j),U35(:,j),V35(j),RX35,RY35,YY35(:,j)]=regress(RX25,RY 25);
for k=1:j-1
F=F*(M25-W35(:,k)*U35(:,k)');
end
for i=1:M1
S=S+X2(i,:)*F*V35(j)*W35(:,j);
press(j)=press(j)+(Y2(i)-S9-S)^2;
end
RX25=RX35;
RY25=RY35;
j=j+1;
end