Oszacowanie lasso opisane w pytaniu jest odpowiednikiem mnożnika lagrange'a następującego problemu optymalizacji:
minimize f(β) subject to g(β)≤t
f(β)g(β)=12n||y−Xβ||22=||β||1
Ta optymalizacja ma geometryczną reprezentację znalezienia punktu styku między sferą wielowymiarową a polytopem (rozpiętym przez wektory X). Powierzchnia polytopu reprezentuje . Kwadrat promienia kuli reprezentuje funkcję i jest minimalizowany, gdy powierzchnie stykają się.g(β)f(β)
Poniższe obrazy przedstawiają objaśnienie graficzne. W obrazach wykorzystano następujący prosty problem z wektorami o długości 3 (dla uproszczenia, aby móc wykonać rysunek):
⎡⎣⎢y1y2y3⎤⎦⎥=⎡⎣⎢1.41.840.32⎤⎦⎥=β1⎡⎣⎢0.80.60⎤⎦⎥+β2⎡⎣⎢00.60.8⎤⎦⎥+β3⎡⎣⎢0.60.64−0.48⎤⎦⎥+⎡⎣⎢ϵ1ϵ2ϵ3⎤⎦⎥
a my minimalizujemy z ograniczeniemϵ21+ϵ22+ϵ23abs(β1)+abs(β2)+abs(β3)≤t
Obrazy pokazują:
- Czerwona powierzchnia przedstawia ograniczenie, polytop o rozpiętości X.
- Zielona powierzchnia przedstawia zminimalizowaną powierzchnię - kulę.
- Niebieska linia pokazuje ścieżkę lasso, rozwiązania, które znajdujemy, gdy zmieniamy lub .tλ
- Zielony wektor pokazuje rozwiązanie OLS (które wybrano jako lub .y^β1=β2=β3=1 y =x1+x2+x3y^=x1+x2+x3
- Trzy czarne wektory to , , i .x1=(0.8,0.6,0)x2=(0,0.6,0.8)x3=(0.6,0.64,−0.48)
Wyświetlamy trzy obrazy:
- Na pierwszym zdjęciu tylko punkt polytopu dotyka kuli . Ten obraz pokazuje bardzo dobrze, dlaczego rozwiązanie lasso nie jest tylko wielokrotnością rozwiązania OLS. Kierunek rozwiązania OLS zwiększa sumy . W tym przypadku tylko pojedynczy jest niezerowy.|β|1βi
- Na drugim zdjęciu grzbiet polytopa dotyka kuli (w wyższych wymiarach otrzymujemy analogi o wyższych wymiarach). W tym przypadku wiele jest niezerowych.βi
- Na trzecim zdjęciu aspekt polytopu dotyka kuli . W tym przypadku wszystkie są niezeroweβi .
Zakres lub dla którego mamy pierwszy i trzeci przypadek, można łatwo obliczyć dzięki ich prostej reprezentacji geometrycznej.tλ
Przypadek 1: Tylko jeden niezerowyβi
Niezerowa to ta, dla której skojarzony wektor ma najwyższą bezwzględną wartość kowariancji z (jest to punkt paralallelotopu najbliższy rozwiązaniu OLS). Możemy obliczyć mnożnik Lagrange'a poniżej którego mamy co najmniej niezerową , biorąc pochodną z (znak w zależności od tego, czy zwiększymy w kierunku ujemnym czy dodatnim):βixiy^λmaxβ±βiβi
∂(12n||y−Xβ||22−λ||β||1)±∂βi=0
który prowadzi do
λmax=(12n∂(||y−Xβ||22±∂βi)(||β||1)±∂βi)=±∂(12n||y−Xβ||22∂βi=±1nxi⋅y
co równa się wspomnianej w komentarzach.||XTy||∞
gdzie powinniśmy zauważyć, że jest to prawdą tylko w szczególnym przypadku, w którym czubek polytopu dotyka kuli ( więc nie jest to ogólne rozwiązanie , chociaż uogólnienie jest proste).
Przypadek 3: Wszystkie są niezerowe.βi
W tym przypadku aspekt polytopu dotyka kuli. Wtedy kierunek zmiany ścieżki lassa jest normalny do powierzchni konkretnego aspektu.
Polytop ma wiele aspektów, z dodatnim i ujemnym udziałem . W przypadku ostatniego kroku lasso, gdy rozwiązanie lasso jest zbliżone do rozwiązania ols, wówczas wkład musi być określony znakiem rozwiązania OLS. Normalna ścianka może być zdefiniowana przez przyjęcie gradientu funkcji , wartości sumy beta w punkcie , która wynosi:xixi||β(r)||1r
n=−∇r(||β(r)||1)=−∇r(sign(β^)⋅(XTX)−1XTr)=−sign(β^)⋅(XTX)−1XT
a równoważna zmiana wersji beta dla tego kierunku to:
β⃗ last=(XTX)−1Xn=−(XTX)−1XT[sign(β^)⋅(XTX)−1XT]
który po niektórych sztuczkach algebraicznych z przesunięciem transpozycji ( ) i rozkładem nawiasów staje sięATBT=[BA]T
β⃗ last=−(XTX)−1sign(β^)
normalizujemy ten kierunek:
β⃗ last,normalized=β⃗ last∑β⃗ last⋅sign(β^)
Aby znaleźć poniżej której wszystkie współczynniki są niezerowe. Musimy tylko przeliczyć z rozwiązania OLS z powrotem do punktu, w którym jeden ze współczynników wynosi zero,λmin
d=min(β^β⃗ last,normalized)with the condition that β^β⃗ last,normalized>0
, i w tym momencie oceniamy pochodną (jak poprzednio, gdy obliczamy ). Używamy tego dla funkcji kwadratowej mamy :λmaxq′(x)=2q(1)x
λmin=dn||Xβ⃗ last,normalized||22
Zdjęcia
punkt dotyka kuli, pojedynczy jest niezerowy:βi
grzbiet (lub różny w wielu wymiarach) dotyka kuli, wiele jest niezerowych:βi
aspekt dotyka kuli, wszystkie są niezerowe:βi
Przykład kodu:
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
Uwaga: najważniejsze są te trzy ostatnie linie
> 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
Napisane przez StackExchangeStrike