Відповіді:
Я пройду через @ кардинальне виведення рішення ласо для закритої форми, коли , знайдений тут , з незначними модифікаціями.
Я буду припускати, що для всіх . Це виправдано, тому що якщо у нас є то це говорить нам, що й стовпець є всім 0, і я вважаю, що розумно виключати такий випадок. Я дозволю . Зауважте, що це також означає, що є повним рангом і рішення OLS визначено однозначно.
Я також збираюся змінити вашу позначення, щоб вона краще відповідала цій відповіді, яку я посилаюсь. З цією метою я буду вирішувати
Це ідентично вашій проблемі, але я можу додати тут більше деталей, якщо хочете.
Після виведення @ кардинала, ми маємо вирішити
Зауваживши, що рішення OLS є , у нас є
Ми оптимізуємо кожен окремо, тому ми можемо вирішити кожен цієї суми окремо. Це означає, що нам потрібно мінімізувати де
Після абсолютно аналогічного аргументу на відповідь, ми знаходимо, що
Крім того, тому у нас це
тож виявляється, що предиктор отримує нуль саме тоді, коли б матриця проекту була ортонормальною, а не просто ортогональною. Отже, ми можемо бачити, що в цьому випадку при вибір змінної не відрізняється, ніж якщо , але фактичні коефіцієнти масштабуються відповідно до дисперсійних дисперсій.
На завершення я перетворять це рішення на те, що нагадує ваше, а значить, нам потрібно помножити на щось, щоб отримати . Якщо нас є те, що
оскільки .
Зауваживши, що саме тоді, коли
ми бачимо, що ми можемо альтернативно виразити як
Тож це дуже близько до того, що у вас було, але зовсім не так.
Мені завжди подобається, якщо можливо, перевіряти такі виводи проти відомих бібліотек, тож ось приклад в 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)))