Оцінка ласо, описана у запитанні, є еквівалентом множника лагранжу в наступній задачі оптимізації:
minimize f(β) subject to g(β)≤t
f(β)g(β)=12n||y−Xβ||22=||β||1
Цей оптимізація має геометричне зображення пошуку точки дотику між багатовимірною сферою та політопом (що охоплюється векторами X). Поверхня політопа являє собою . Квадрат радіуса сфери представляє функцію і мінімізується при контакті поверхонь.g(β)f(β)
На малюнках нижче наведено графічне пояснення. Зображення використовували наступну просту задачу з векторами довжиною 3 (для простоти, щоб можна було зробити креслення):
⎡⎣⎢y1y2y3⎤⎦⎥=⎡⎣⎢1.41.840.32⎤⎦⎥=β1⎡⎣⎢0.80.60⎤⎦⎥+β2⎡⎣⎢00.60.8⎤⎦⎥+β3⎡⎣⎢0.60.64−0.48⎤⎦⎥+⎡⎣⎢ϵ1ϵ2ϵ3⎤⎦⎥
і ми мінімізуємо з обмеженнямϵ21+ϵ22+ϵ23abs(β1)+abs(β2)+abs(β3)≤t
На зображеннях показано:
- Червона поверхня зображує обмеження, багатогранник, що охоплюється X.
- А зелена поверхня зображує мінімізовану поверхню, сферу.
- Синя лінія показує шлях lasso, рішення, які ми знаходимо, змінюючи або .tλ
- Зелений вектор показує рішення OLS (який було обрано як або .y^β1=β2=β3=1y^=x1+x2+x3
- Три чорні вектори: , і .x1=(0.8,0.6,0)x2=(0,0.6,0.8)x3=(0.6,0.64,−0.48)
Ми показуємо три зображення:
- На першому зображенні лише точка політопа стосується сфери . Це зображення дуже добре демонструє, чому рішення ласо не є просто кратним рішенням OLS. Напрямок рішення OLS додає сильнішої суми . У цьому випадку лише один не дорівнює нулю.|β|1βi
- У другому зображенні хребет багатогранника торкається сфери (у більш високих розмірах ми отримуємо аналоги більш високих розмірів). У цьому випадку множина не дорівнює нулю.βi
- На третьому зображенні грань політопа торкається сфери . У цьому випадку всі є нульовимиβi .
Діапазон або для якого ми маємо перший та третій випадки, можна легко обчислити завдяки їх простому геометричному зображенню.tλ
Випадок 1: Лише одиничний не нульовийβi
Ненульовий - це той, для якого асоційований вектор має найбільшу абсолютну величину коваріації з (це точка паралелетотопа, найближчого до рішення OLS). Ми можемо обчислити множник Lagrange нижче якого у нас є принаймні ненульовий , взявши похідну з (знак залежно від того, збільшуємо в негативному чи позитивному напрямку):βixiy^λmaxβ±βiβi
∂(12n||y−Xβ||22−λ||β||1)±∂βi=0
що призводить до
λmax=(12n∂(||y−Xβ||22±∂βi)(||β||1)±∂βi)=±∂(12n||y−Xβ||22∂βi=±1nxi⋅y
що дорівнює згаданому в коментарях.||XTy||∞
де слід зазначити, що це справедливо лише для особливого випадку, коли кінчик політопа торкається сфери ( тому це не є загальним рішенням , хоча узагальнення є прямим).
Випадок 3: Усі не нульові.βi
У цьому випадку грань політопа торкається сфери. Тоді напрямок зміни шляху ласо є нормальним до поверхні конкретної грані.
Політоп має багато аспектів, з позитивним і негативним внеском . У випадку останнього етапу ласо, коли розчин ласо близький до розчину ols, тоді внески повинні визначатися знаком рішення OLS. Нормальність грані можна визначити, взявши градієнт функції , значення суми бета в точці , яке становить:xixi||β(r)||1r
n=−∇r(||β(r)||1)=−∇r(sign(β^)⋅(XTX)−1XTr)=−sign(β^)⋅(XTX)−1XT
і еквівалентна зміна бета-версії для цього напрямку:
β⃗ last=(XTX)−1Xn=−(XTX)−1XT[sign(β^)⋅(XTX)−1XT]
який після деяких алгебраїчних трюків зі зміщенням транспозитів ( ) і розподілом дужок стаєATBT=[BA]T
β⃗ last=−(XTX)−1sign(β^)
ми нормалізуємо цей напрямок:
β⃗ last,normalized=β⃗ last∑β⃗ last⋅sign(β^)
Щоб знайти нижче якого всі коефіцієнти не дорівнюють нулю. Нам залишається лише обчислити назад від рішення OLS до точки, коли один із коефіцієнтів дорівнює нулю,λmin
d=min(β^β⃗ last,normalized)with the condition that β^β⃗ last,normalized>0
, і в цей момент ми оцінюємо похідну (як і раніше, коли обчислюємо ). Ми використовуємо, що для квадратичної функції маємо :λmaxq′(x)=2q(1)x
λmin=dn||Xβ⃗ last,normalized||22
Зображення
точка політопа стосується сфери, одиничний не дорівнює нулю:βi
хребет (або різняться в декількох вимірах) політопа торкається сфери, багато не нульові:βi
грань політопа торкається сфери, всі не нульові:βi
Приклад коду:
library(lars)
data(diabetes)
y <- diabetes$y - mean(diabetes$y)
x <- diabetes$x
# models
lmc <- coef(lm(y~0+x))
modl <- lars(diabetes$x, diabetes$y, type="lasso")
# matrix equation
d_x <- matrix(rep(x[,1],9),length(x[,1])) %*% diag(sign(lmc[-c(1)]/lmc[1]))
x_c = x[,-1]-d_x
y_c = -x[,1]
# solving equation
cof <- coefficients(lm(y_c~0+x_c))
cof <- c(1-sum(cof*sign(lmc[-c(1)]/lmc[1])),cof)
# alternatively the last direction of change in coefficients is found by:
solve(t(x) %*% x) %*% sign(lmc)
# solution by lars package
cof_m <-(coefficients(modl)[13,]-coefficients(modl)[12,])
# last step
dist <- x %*% (cof/sum(cof*sign(lmc[])))
#dist_m <- x %*% (cof_m/sum(cof_m*sign(lmc[]))) #for comparison
# calculate back to zero
shrinking_set <- which(-lmc[]/cof>0) #only the positive values
step_last <- min((-lmc/cof)[shrinking_set])
d_err_d_beta <- step_last*sum(dist^2)
# compare
modl[4] #all computed lambda
d_err_d_beta # lambda last change
max(t(x) %*% y) # lambda first change
enter code here
зауважте: останні три рядки є найважливішими
> modl[4] # all computed lambda by algorithm
$lambda
[1] 949.435260 889.315991 452.900969 316.074053 130.130851 88.782430 68.965221 19.981255 5.477473 5.089179
[11] 2.182250 1.310435
> d_err_d_beta # lambda last change by calculating only last step
xhdl
1.310435
> max(t(x) %*% y) # lambda first change by max(x^T y)
[1] 949.4353
Автор StackExchangeStrike