回 帖 发 新 帖 刷新版面

主题:[讨论]偏最小二乘法中的交叉有效性计算的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;

回复列表 (共3个回复)

沙发

% 求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* 的值


第5行错了吧,应该是W_h_s = W_h_s * ( eye(m) - W(:,j) *( P(:,j) )');

板凳


[em1]

3 楼

有研究偏最小二乘回归的加我啊 
我的qq:348952843

我来回复

您尚未登录,请登录后再回复。点此登录或注册