主题:[讨论]偏最小二乘法中的交叉有效性计算的matlab程序
偏最小二乘法中的交叉有效性计算的matlab程序,怎么计算出来的预测误差平方和PRESS不太对,偏大;请大牛指教!
function re = GetPRESS(E0,F0,h)
[n,m] = size(E0);
F0n = size(F0);
if F0n ~= n | n <2 | m < 2
disp('errors!');
return;
end
press = 0;
for i = 1:n
E = [ E0(1:i-1,:); E0(i+1:n,:) ];
F = [ F0(1:i-1,:); F0(i+1:n,:) ];
for j = 1:h % h步
w = ( E'* F )/ norm( E'*F );
W(:, j ) = w;
W;
t = E * w;
T(:, j ) = t; % 主成分
p = E'* t / ( (norm( t))^2 );
P(:, j ) = p;
r = F'* t / ( (norm( t))^2 );
R( j ) = r; % 系数
E = E - t * p';
F = F - t * r';
end
% 求W* 的值
for k = 1: h
W_h_s = eye(m);
for j = 1:(k-1)
W_h_s = W_h_s * ( eye(m) - W(j) *( P(j) )');
end
W_h_s = W_h_s * W(:,k); % Wh* 的值
W_s(:,k) = W_h_s;
end
F0i_s = E0(i,:) * (W_s * R'); % 求F0i的拟合值
F0i = F0(i);
% Yi_Yh_i = ( F0i - F0i_s )^2
press = press + ( F0i - F0i_s )^2; % 两值相减再平方
end
re = press;
function re = GetPRESS(E0,F0,h)
[n,m] = size(E0);
F0n = size(F0);
if F0n ~= n | n <2 | m < 2
disp('errors!');
return;
end
press = 0;
for i = 1:n
E = [ E0(1:i-1,:); E0(i+1:n,:) ];
F = [ F0(1:i-1,:); F0(i+1:n,:) ];
for j = 1:h % h步
w = ( E'* F )/ norm( E'*F );
W(:, j ) = w;
W;
t = E * w;
T(:, j ) = t; % 主成分
p = E'* t / ( (norm( t))^2 );
P(:, j ) = p;
r = F'* t / ( (norm( t))^2 );
R( j ) = r; % 系数
E = E - t * p';
F = F - t * r';
end
% 求W* 的值
for k = 1: h
W_h_s = eye(m);
for j = 1:(k-1)
W_h_s = W_h_s * ( eye(m) - W(j) *( P(j) )');
end
W_h_s = W_h_s * W(:,k); % Wh* 的值
W_s(:,k) = W_h_s;
end
F0i_s = E0(i,:) * (W_s * R'); % 求F0i的拟合值
F0i = F0(i);
% Yi_Yh_i = ( F0i - F0i_s )^2
press = press + ( F0i - F0i_s )^2; % 两值相减再平方
end
re = press;