Antworten:
Ich werde @ cardinals Herleitung der Lasso-Lösung in geschlossener Form durchgehen, wenn , hier gefunden , mit geringfügigen Änderungen.
Ich gehe davon aus, dass für alle . Dies ist gerechtfertigt, weil, wenn wir ein dies uns sagt, dass dasi & sgr; 2 i = 0 i X X T X = D X β te Spalte von alle 0 ist, und ich denke, es ist vernünftig, einen solchen Fall auszuschließen. Ich lasse . Beachten Sie, dass dies auch bedeutet, dass vollen Rang hat und die OLS-Lösung eindeutig definiert ist.
Ich werde auch Ihre Notation so ändern, dass sie der Antwort, auf die ich verweise, besser entspricht. Zu diesem Zweck werde ich
Dies ist identisch mit Ihrem Problem, aber ich kann hier weitere Details hinzufügen, wenn Sie möchten.
Nach der Herleitung von @ cardinal müssen wir lösen.
Festzustellen, dass die OLS-Lösung ist β & lgr;=argmin - β TDβ+1 , haben wir
Wir optimieren jedes separat, damit wir jeden Term dieser Summe separat lösen können. Das heißt, wir müssen minimierenL j L j = - β j β j σ 2 j + σ 2 j mit
Nach einem völlig analogen Argument zur verknüpften Antwort finden wir das
Außerdem sodass wir das
es stellt sich also heraus, dass ein Prädiktor genau dann auf Null gesetzt wird, wenn die Entwurfsmatrix orthonormal und nicht nur orthogonal wäre. Wir können also sehen, dass in diesem Fall mit die Variablenauswahl nicht anders ist als mit , aber die tatsächlichen Koeffizienten werden gemäß den Prädiktorvarianzen skaliert.
Abschließend möchte ich diese Lösung in eine Lösung umwandeln, die Ihrer ähnelt. Dies bedeutet, dass wir mit etwas multiplizieren müssen, um . If dann haben wir das
schon seit .
Beachten Sie, dass genau wann
wir sehen, dass wir alternativ als
Das kommt dem sehr nahe, was du hattest, ist aber nicht genau dasselbe.
Ich mag es immer, solche Ableitungen mit bekannten Bibliotheken abzugleichen, also hier ein Beispiel in 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)))