对 MATLAB 的 ridge 实现感到困惑

机器算法验证 matlab 岭回归
2022-03-21 05:32:32

ridge在 MATLAB 中有两种不同的实现。一是简单

  1. x=(AA+Iλ)1Ab

    (如维基百科的岭回归页面所示),与I是大小列的单位矩阵(A)×列(A), 和

  2. 我只是用

    x = ridge(A, b, lambda)
    

我的问题是两者都返回不同的结果。(1)返回我想要的结果(我通过与其他人比较结果知道这一点)但为什么(2)不返回相同的结果?

我的矩阵A是稀疏的,它充满了 1% 的 1 和 99% 的 0。有些列几乎不包含 1。最大的区别似乎是那些只有很少 1 的列的系数在 (1) 中非常接近 0,但在 (2) 中可能与 0 相差甚远

有谁知道它为什么不同以及如何修改 (2) 中的调用以给出与 (1) 相同的结果?

2个回答

这是一个验证cardinal所说的matlab程序,它实际上是由于居中和缩放

% Create A(10 by 3 matrix) and b(10 by 1 matrix)
A=rand(10,3);
b=rand(10,1);
lambda=0.01
% centering and scaling A 
s=std(A,0,1);
s=repmat(s,10,1);
A=(A-repmat(mean(A),10,1))./s;

%check the result
X1=inv(A'*A+eye(3)*lambda)*A'*b;
X2=ridge(b,A,lambda,1);

x1 然后等于 x2

您应该将 ridge 中的比例专门设置为 0,因此它看起来像 x = ridge(A, b, lambda,0)。在这种情况下,x 的第一行是常数,其余的是系数。换句话说,x(2:end,:) 应该与使用 (1) 得到的结果相同。这在 mathlab 文档中有明确说明。希望这会有所帮助。