Soruda açıklanan kement tahmini, aşağıdaki optimizasyon sorununun lagrange çarpan eşdeğeri:
minimize f(β) subject to g(β)≤t
f(β)g(β)=12n||y−Xβ||22=||β||1
Bu optimizasyon, çok boyutlu bir küre ile bir politop (X vektörleri tarafından yayılmış) arasındaki temas noktasını bulmada geometrik bir temsile sahiptir . Politopun yüzeyi yı temsil eder . Kürenin yarıçapı karesi fonksiyonunu temsil eder ve yüzeyler temas ettiğinde minimize edilir.g(β)f(β)
Aşağıdaki resimler grafiksel bir açıklama sunmaktadır. Görüntüler, uzunluk 3 vektörleri ile aşağıdaki basit problemden yararlandı (bir çizim yapabilmek için basitlik için):
⎡⎣⎢y1y2y3⎤⎦⎥=⎡⎣⎢1.41.840.32⎤⎦⎥=β1⎡⎣⎢0.80.60⎤⎦⎥+β2⎡⎣⎢00.60.8⎤⎦⎥+β3⎡⎣⎢0.60.64−0.48⎤⎦⎥+⎡⎣⎢ϵ1ϵ2ϵ3⎤⎦⎥
ve kısıtlama ileϵ21+ϵ22+ϵ23abs(β1)+abs(β2)+abs(β3)≤t
Görüntüler gösterir:
- Kırmızı yüzey, X tarafından yayılan bir politop olan kısıtlamayı gösterir.
- Ve yeşil yüzey minimalize yüzeyi, bir küreyi tasvir ediyor.
- Mavi çizgi, kement yolunu, veya değiştirirken bulduğumuz çözümleri gösterir .tλ
- Yeşil vektör OLS çözümünü ( veya .y^β1=β2=β3=1y^=x1+x2+x3
- Üç siyah vektör , ve .x1=(0.8,0.6,0)x2=(0,0.6,0.8)x3=(0.6,0.64,−0.48)
Üç resim gösteriyoruz:
- İlk görüntüde , politopun sadece bir noktası küreye dokunuyor . Bu görüntü, kement çözümünün neden sadece OLS çözümünün bir katı olmadığını çok iyi göstermektedir. OLS çözümünün yönü toplamına daha fazla . Bu durumda yalnızca tek bir sıfırdan .|β|1βi
- İkinci görüntüde , politopun bir sırtı küreye dokunuyor (daha yüksek boyutlarda daha yüksek boyutlu analoglar elde ediyoruz). Bu durumda, birden çok sıfırdan .βi
- Üçüncü görüntüde , politopun bir yüzü küreye dokunuyor . Bu durumda, tüm sıfırdanβi .
Birinci ve üçüncü vakalara sahip olduğumuz veya aralığı, basit geometrik temsillerinden dolayı kolayca hesaplanabilir.tλ
Durum 1: Yalnızca tek bir sıfırdan farklıβi
Sıfır olmayan , ilişkili vektörünün ile kovaryansın en yüksek mutlak değerine sahip olduğu (bu, OLS çözümüne en yakın olan parralletopun noktasıdır). En azından sıfır olmayan bir sahip olduğumuz Lagrange çarpanını ile türevi alarak ( negatif veya pozitif yönde bağlı olarak işaret) :βixiy^λmaxβ±βiβi
∂(12n||y−Xβ||22−λ||β||1)±∂βi=0
hangi yol açar
λmax=(12n∂(||y−Xβ||22±∂βi)(||β||1)±∂βi)=±∂(12n||y−Xβ||22∂βi=±1nxi⋅y
Bu, yorumlarda belirtilen .||XTy||∞
bunun sadece politopun ucunun küreye temas ettiği özel durum için geçerli olduğunu fark etmeliyiz ( bu yüzden genelleme basit olsa da bu genel bir çözüm değildir ).
Durum 3: Tüm sıfır değildir.βi
Bu durumda, politopun bir faseti küreye dokunuyor. Daha sonra, kement yolunun değişim yönü belirli bir faset yüzeyine normaldir .
Politopun birçok yönü vardır, olumlu ve olumsuz katkıları vardır . Kement çözüm yakın ols çözüme olduğunda son kement aşamada söz konusu olduğunda, daha sonra katkıları EKK çözümün işareti tanımlanmalıdır. Faset normal fonksiyonunun gradyanı alınarak tanımlanabilir , noktasında betanın toplamın değeri olan,:xixi||β(r)||1r
n=−∇r(||β(r)||1)=−∇r(sign(β^)⋅(XTX)−1XTr)=−sign(β^)⋅(XTX)−1XT
ve bu yön için eşdeğer beta değişikliği:
β⃗ last=(XTX)−1Xn=−(XTX)−1XT[sign(β^)⋅(XTX)−1XT]
transpoze olan bazı cebirsel hilelerden sonra ( ) ve parantezlerin dağılımıATBT=[BA]T
β⃗ last=−(XTX)−1sign(β^)
bu yönü normalleştiriyoruz:
β⃗ last,normalized=β⃗ last∑β⃗ last⋅sign(β^)
Aşağıda tüm katsayıların sıfır olmadığı değerini bulmak için . Sadece OLS çözümünden katsayılardan birinin sıfır olduğu noktaya kadar hesaplamak zorundayız,λmin
d=min(β^β⃗ last,normalized)with the condition that β^β⃗ last,normalized>0
ve bu noktada türevi değerlendiririz (daha önce hesaplarken olduğu gibi ). Bunu ikinci dereceden bir fonksiyon için sahibiz :λmaxq′(x)=2q(1)x
λmin=dn||Xβ⃗ last,normalized||22
Görüntüler
bir noktası küreye dokunuyor, tek bir sıfırdan farklı:βi
bir sırtı (veya birden fazla boyutta farklıdır) küreye dokunuyor, birçok sıfırdan farklı:βi
bir yüzü küreye dokunuyor, hepsi sıfır değil:βi
Kod örneğ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
not: bu son üç satır en önemli
> 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
Yazan: StackExchangeStrike