function [yPredict,TTrain,TTest] = pls(XTrain,yTrain,XTest,Factor)
t=cputime;
%normalize training set
SampleNumber = size(XTrain,1);
InputNumber = size(XTrain,2);
yMean = mean(yTrain);
yTrain = yTrain - yMean;
for j = 1:InputNumber
XMean(j) = mean(XTrain(:,j));
XTrain(:,j) = XTrain(:,j) - XMean(j);
end
%calibrate W B V T
W = zeros(InputNumber,Factor);
T = zeros(SampleNumber,Factor);
V = zeros(1,Factor);
B = zeros(InputNumber,Factor);
Xk = XTrain;
Yk = yTrain;
for k = 1:Factor
Wk = Xk' * Yk / (Yk' * Yk); % Wk(InputNumber*1)
Tk = Xk * Wk / (Wk' * Wk); % Tk(SampleNumber*1)
Vk = Tk' * Yk / (Tk' * Tk); % Vk(1*1)
Bk = Xk' * Tk / (Tk' * Tk); % Bk(InputNumber*1)
W(:,k) = Wk;
T(:,k) = Tk;
V(k) = Vk;
B(:,k) = Bk;
EXk = Xk - Tk * Bk';
EYk = Yk - Vk * Tk;
Xk = EXk;
Yk = EYk;
end
TTrain = T;
f = (W /(B' * W)) * V';
%predict y value
for k = 1:size(XTest,1)
TTest(k,:) = (XTest(k,:) - XMean) * (W /(B' * W));
yPredict(k) = yMean + (XTest(k,:) - XMean) * f;
if yPredict(k) < 0
yPredict(k) = 0;
end
end
yPredict = yPredict';
t=cputime-t;
%save PLSPara;