Odpowiedzi:
Przejdę do pochodnej @ kardynała rozwiązania lasso zamkniętej postaci, gdy , tutaj , z niewielkimi modyfikacjami.
Zakładam, że dla wszystkich . Jest to uzasadnione, ponieważ jeśli mamy to, że ta kolumna ma wartość 0 i myślę, że uzasadnione jest wykluczenie takiego przypadku. Powiem . Zauważ, że oznacza to również, że ma pełną pozycję, a rozwiązanie OLS jest jednoznacznie zdefiniowane.
Zamierzam również zmodyfikować twoją notację, aby lepiej pasowała do tej w odpowiedzi, do której się odwołuję. W tym celu będę rozwiązywał
Jest to identyczne z twoim problemem, ale mogę dodać więcej szczegółów tutaj, jeśli chcesz.
Po pochodnej @ kardynała mamy do rozwiązania
Biorąc pod uwagę, że rozwiązaniem OLS jest , mamy
Optymalizujemy każdy osobno, więc możemy rozwiązać każdy okres tej sumy osobno. Oznacza to, że musimy zminimalizować gdzie
Po całkowicie analitycznym argumencie do połączonej odpowiedzi stwierdzamy, że
Ponadto więc mamy
więc okazuje się, że predyktor jest dokładnie wtedy, gdy zrobiłby to, gdyby macierz projektowa była ortonormalna, a nie tylko ortogonalna. Widzimy więc, że w tym przypadku przy wybór zmiennych nie różni się od tego, jeśli , ale rzeczywiste współczynniki są skalowane zgodnie z wariancjami predyktora.
Na koniec to rozwiązanie na podobne do twojego, co oznacza, że musimy pomnożyć przez coś, aby uzyskać . Jeśli mamy to
od .
Zwracając uwagę, że dokładnie wtedy, gdy
widzimy, że możemy alternatywnie wyrazić jako
Jest to więc bardzo zbliżone do tego, co miałeś, ale nie dokładnie takie samo.
Zawsze lubię porównywać takie pochodne z dobrze znanymi bibliotekami, jeśli to możliwe, więc oto przykład w 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)))