Tenemos el problema: suponiendo que: \ sum_ {i = 1} ^ nx_ix_i ^ T = \ diag (\ sigma_1 ^ 2, ..., \ sigma_d ^ 2).
¿Existe una solución de forma cerrada en este caso?
Tengo eso:
Tenemos el problema: suponiendo que: \ sum_ {i = 1} ^ nx_ix_i ^ T = \ diag (\ sigma_1 ^ 2, ..., \ sigma_d ^ 2).
¿Existe una solución de forma cerrada en este caso?
Tengo eso:
Voy a pasar por la derivación de @ cardinal de la solución de lazo de forma cerrada cuando , que se encuentra aquí , con modificaciones menores.
Asumiré que para todo . Esto se justifica porque si tenemos un entonces esto nos dice que la ésima columna de es todo 0, y creo que es razonable excluir ese caso. Voy a dejar que . Tenga en cuenta que esto también significa que es rango completo y la solución OLS está definida de forma única.
También voy a modificar su notación para que coincida mejor con la respuesta a la que me refiero. Con ese fin, resolveré
Esto es idéntico a su problema, pero puedo agregar más detalles aquí si lo desea.
Siguiendo la derivación de @ cardinal, tenemos que tenemos que resolver
Teniendo en cuenta que la solución OLS es , tenemos que β lambda=argmin - β TDβ+1
Estamos optimizando cada separado, por lo que podemos resolver cada término de esta suma por separado. Esto significa que debemos minimizar donde
Siguiendo un argumento completamente análogo a la respuesta vinculada, encontramos que
Además, así que tenemos ese
entonces resulta que un predictor se pone a cero exactamente cuando lo haría si la matriz de diseño fuera ortonormal, no solo ortogonal. Entonces podemos ver que en este caso con , la selección de la variable no es diferente a si , pero los coeficientes reales se escalan de acuerdo con las variaciones del predictor.
Como nota final, convertiré esta solución en una que se parezca a la suya, lo que significa que debemos multiplicar por algo para obtener . Si entonces tenemos que
desde .
Señalando que exactamente cuando
vemos que alternativamente podríamos expresar como
Así que esto está muy cerca de lo que tenía, pero no exactamente lo mismo.
Siempre me gusta verificar derivaciones como esta con bibliotecas conocidas si es posible, así que aquí hay un ejemplo en R:
## generating `x`
set.seed(1)
n = 1000
p = 5
sigma2s = 1:p
x = svd(matrix(rnorm(n * p), n, p))$u %*% diag(sqrt(sigma2s))
## check this
# t(x) %*% x
## generating `y`
betas = 1:p
y = x %*% betas + rnorm(nrow(x), 0, .5)
lambda = 2
## using a well-known library to fit lasso
library(penalized)
penalized(y, x, lambda1 = lambda)@penalized
## using closed form solution
betahat = lm(y ~ x - 1)$coef
ifelse(betahat > 0, 1, -1) * sapply(abs(betahat) - lambda / sigma2s, function(v) max(c(0, v)))