Ответы:
Я собираюсь пройти через вывод @ cardinal решения Лассо в замкнутой форме, когда , найденный здесь , с небольшими изменениями.
Я буду предполагать, что для всех . Это оправдано, потому что если у нас есть то это говорит о том, что й столбец равен 0, и я думаю, что разумно исключить такой случай. Я позволю . Обратите внимание, что это также означает, что имеет полный ранг, а решение OLS определено однозначно.я сг 2 я = 0 я Х Х Т Х = Д Х β
Я также собираюсь изменить вашу запись, чтобы она лучше соответствовала ответу, на который я ссылаюсь. С этой целью я буду решать
Это идентично вашей проблеме, но я могу добавить больше подробностей здесь, если хотите.
После деривации @ cardinal у нас есть, что нам нужно решить
Отмечая, что решение 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)))