การประมาณการแบบบ่วงบาศที่อธิบายไว้ในคำถามคือตัวคูณแบบลากรองจ์ของปัญหาการปรับให้เหมาะสมต่อไปนี้:
minimize f(β) subject to g(β)≤t
f(β)g(β)=12n||y−Xβ||22=||β||1
optimizazion นี้มีการนำเสนอทางเรขาคณิตในการค้นหาจุดสัมผัสระหว่างทรงกลมหลายมิติและโพลิปท็อป (ทอดด้วยเวกเตอร์ของ X) พื้นผิวของ polytope หมายเบต้า) สแควร์ของรัศมีของทรงกลมแสดงถึงฟังก์ชั่นและถูกย่อให้เล็กสุดเมื่อสัมผัสกับพื้นผิว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⎤⎦⎥
ϵ 2 1 + ϵ 2 2 + ϵ 2 3
และเราลดกับข้อ จำกัดϵ21+ϵ22+ϵ23abs(β1)+abs(β2)+abs(β3)≤t
ภาพแสดง:
- พื้นผิวสีแดงแสดงให้เห็นถึงข้อ จำกัด ซึ่งเป็นโพลีท็อปซึ่งขยายโดย X
- และพื้นผิวสีเขียวแสดงให้เห็นถึงพื้นผิวที่เรียบง่ายเป็นทรงกลม
- สีฟ้าแสดงเส้นเส้นทางเชือก, การแก้ปัญหาที่เราพบขณะที่เราเปลี่ยนหรือ\tλ
- สีเขียวเวกเตอร์แสดงให้เห็นว่าการแก้ปัญหา OLS (ซึ่งได้รับเลือกเป็นหรือx_3y^β1=β2=β3=1 Y =x1+x2+x3y^=x1+x2+x3
- สามเวกเตอร์สีดำเป็น ,และ-0.48)x1=(0.8,0.6,0)x2=(0,0.6,0.8)x3=(0.6,0.64,−0.48)
เราแสดงภาพสามภาพ:
- ในภาพแรกเพียงจุด polytope ที่สัมผัสทรงกลม ภาพนี้แสดงให้เห็นได้อย่างดีว่าเหตุใดโซลูชัน lasso จึงไม่ใช่เพียงแค่โซลูชัน OLS หลายตัว ทิศทางของการแก้ปัญหา OLS เพิ่มมากขึ้นเพื่อรวม\ ในกรณีนี้มีเพียงเดียวไม่ใช่ศูนย์|β|1βi
- ในภาพที่สองสันเขาของ polytope สัมผัสกับทรงกลม (ในมิติที่สูงกว่าเราจะได้มิติแอนะล็อกที่สูงขึ้น) ในกรณีนี้มีหลายไม่ใช่ศูนย์βi
- ในภาพที่สามแง่ TOF polytope จะสัมผัสทรงกลม ในกรณีนี้ทั้งหมดβiเป็นภัณฑ์
ช่วงของหรือที่เรามีกรณีแรกและที่สามสามารถคำนวณได้ง่าย ๆ เนื่องจากการแทนค่าทางเรขาคณิตอย่างง่ายtλ
กรณีที่ 1: มีเพียงเดียวที่ไม่ใช่ศูนย์βi
ไม่ใช่ศูนย์เป็นเวกเตอร์ที่เกี่ยวข้องมีค่าสัมบูรณ์สูงสุดของความแปรปรวนร่วมกับ (นี่คือจุดของ parrallelotope ซึ่งใกล้เคียงกับโซลูชัน OLS มากที่สุด) เราสามารถคำนวณตัวคูณลากรองจ์ด้านล่างซึ่งเรามีอย่างน้อยไม่ใช่ศูนย์โดยการหาอนุพันธ์ด้วย (เครื่องหมายขึ้นอยู่กับว่าเราเพิ่มในทิศทางลบหรือบวก):βixiY λ เมตรx β ± β ฉันβ ฉันy^λ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
ในกรณีนี้โพลีท็อปด้านสัมผัสกับทรงกลม จากนั้นทิศทางของการเปลี่ยนแปลงของเส้นทางบ่วงเป็นเรื่องปกติไปยังพื้นผิวของด้านใดด้านหนึ่ง
polytope มีหลายแง่มุมที่มีผลงานในเชิงบวกและเชิงลบของx_iในกรณีของขั้นตอนสุดท้ายของ lasso เมื่อโซลูชัน lasso ใกล้กับ ols solution ดังนั้นการมีส่วนร่วมของต้องถูกกำหนดโดยเครื่องหมายของโซลูชัน OLS ปกติของด้านสามารถกำหนดได้โดยใช้การไล่ระดับสีของฟังก์ชั่น , ค่าของผลรวมของเบต้าที่จุดซึ่งคือ:xixi||β(r)||1r
n=−∇r(||β(r)||1)=−∇r(sign(β^)⋅(XTX)−1XTr)=−sign(β^)⋅(XTX)−1XT
และการเปลี่ยนแปลงที่เท่าเทียมกันของเบต้าสำหรับทิศทางนี้คือ:
β⃗ last=(XTX)−1Xn=−(XTX)−1XT[sign(β^)⋅(XTX)−1XT]
ซึ่งหลังจากเทคนิคเกี่ยวกับพีชคณิตบางอย่างที่มีการเปลี่ยน transposes ( ) และการกระจายของวงเล็บจะกลายเป็น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
สันเขา (หรือแตกต่างกันในหลายมิติ) ของ polytope สัมผัสกับทรงกลมจำนวนมากไม่ใช่ศูนย์:βi
ด้านหนึ่งของ polytope สัมผัสกับทรงกลมทั้งหมดนั้นไม่ใช่ศูนย์:β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