Temos o problema: supondo que: \ sum_ {i = 1} ^ nx_ix_i ^ T = \ diag (\ sigma_1 ^ 2, ..., \ sigma_d ^ 2).
Existe uma solução fechada neste caso?
Eu tenho isso:
Temos o problema: supondo que: \ sum_ {i = 1} ^ nx_ix_i ^ T = \ diag (\ sigma_1 ^ 2, ..., \ sigma_d ^ 2).
Existe uma solução fechada neste caso?
Eu tenho isso:
Vou passar pela derivação do @ cardinal da solução de laço de forma fechada quando , encontrado aqui , com pequenas modificações.
que para todos . Isso é justificado porque, se tivermos um , isso nos diz que a ésima coluna de é toda 0, e acho razoável excluir um caso desse tipo. Vou deixá- . Observe que isso também significa quei σ 2 i = 0 i X X T X = D X β é a classificação completa e a solução OLS é definida exclusivamente.
Também vou modificar sua notação para corresponder melhor à resposta que estou referenciando. Para esse fim, eu vou resolver
Isso é idêntico ao seu problema, mas posso adicionar mais detalhes aqui, se desejar.
Após a derivação do @ cardinal, temos que resolver
Observando que a solução OLS é , temos esse β X=argmin - β TDβ+1
Estamos otimizando cada separadamente, para que possamos resolver cada termo dessa soma separadamente. Isso significa que precisamos minimizar onde
Após um argumento completamente análogo à resposta vinculada, descobrimos que
Além disso, portanto temos isso
portanto, um preditor é zerado exatamente quando ocorreria se a matriz de design fosse ortonormal, não apenas ortogonal. Portanto, podemos ver que, neste caso com , a seleção de variáveis não é diferente de se , mas os coeficientes reais são dimensionados de acordo com as variações do preditor.
Como observação final, vou transformar essa solução em uma que se assemelhe à sua, o que significa que precisamos multiplicar por algo para obter . Se , temos esse
desde .
Observando que exatamente quando
vemos que podemos alternativamente expressar como
Portanto, isso é muito próximo do que você tinha, mas não exatamente o mesmo.
Eu sempre gosto de verificar derivações como essa em bibliotecas conhecidas, se possível, então aqui está um exemplo em 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)))