Confundido por la implementación de la cresta de MATLAB

8

Tengo dos implementaciones diferentes de ridgeen MATLAB. Uno es simplemente

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

    (como se ve en la página de regresión de cresta de Wikipedia ), con siendo la matriz de identidad de las columnas de tamaño ( \ mathbf {A} ) \ times columnas ( \ mathbf {A} ), yIA×A

  2. Simplemente estoy llamando "cresta" de Matlab con

    x = ridge(A, b, lambda)

Mi problema es que ambos devuelven resultados diferentes. (1) devuelve los resultados que quiero (lo sé al comparar los resultados con otras personas) pero ¿por qué (2) no devuelve los mismos resultados?

Mi matriz A es escasa, está llena con 1% de 1 y 99% de 0. Algunas columnas contienen casi no 1's. La mayor diferencia parece ser que el coeficiente para aquellas columnas con muy pocos 1 están muy cerca de 0 en (1), pero puede estar bastante lejos de 0 en (2)

¿Alguien tiene alguna idea de por qué es diferente y cómo puedo modificar la llamada en (2) para obtener los mismos resultados que (1)?

Susie G.
fuente
44
Mi suposición : está calculando (1) en una matriz no centrada y sin escala , mientras que la llamada a ridge(según la documentación de MATLAB) indica que (como es estándar): por defecto, b se calcula después de centrar y escalar los predictores para que tengan una media 0 y desviación estándar 1. El modelo no incluye un término constante, y X no debe contener una columna de 1s. .
cardenal
Si el motivo es el centrado y la escala, ¿puedo modificar "A" y "b" para que la llamada de Matlab dé el mismo resultado que (1)?
Susie G.
1
Hola susie Sí tu puedes. Primero, si hay una columna completamente constante (distinta de cero) en , elimínela. Ahora, simplemente centre y escale usted mismo antes de hacer la llamada . No debería necesitar hacer nada para . AAridgeb
cardenal
(He ignorado los detalles de la escasez. Al centrar, la escasez se romperá. Para muy grandes esto puede introducir problemas computacionalmente.)A
cardenal

Respuestas:

6

Este es un programa matlab para validar lo que dijo el cardenal, en realidad se debe al centrado y la escala

% 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 entonces igual x2

usuario2874944
fuente
0

Debería especializar la escala en cresta como 0, para que parezca x = cresta (A, b, lambda, 0). En este caso, la primera fila de x es constante y el resto son los coeficientes. En otras palabras, x (2: end, :) debería ser el mismo resultado que obtuviste usando (1). Esto se afirma claramente en la documentación de Mathlab. Esperando que esto ayude.

吴 京城
fuente