लार्स समस्या के लिए लार्स और ग्लमेनेट अलग-अलग समाधान क्यों देते हैं?


22

मैं बेहतर आर संकुल को समझना चाहते हैं Larsऔर Glmnetहै, जो कमंद समस्या को हल करने के लिए इस्तेमाल कर रहे हैं: (पेजवेरिएबल्स औरएननमूनों के लिए,www.stanford.edu/~hastie/Papers/glmnet.pdfपेज 3 परदेखें)

मीटरमैंn(β0β)आरपी+1[12एनΣमैं=1एन(yमैं-β0-एक्समैंटीβ)2+λ||β||एल1]
पीएन

इसलिए, मैंने उन दोनों को एक ही खिलौना डाटासेट पर लागू किया। दुर्भाग्य से, दो तरीके समान डेटा इनपुट के लिए समान समाधान नहीं देते हैं। क्या किसी को अंदाजा है कि अंतर कहां से आता है?

मैंने परिणाम निम्नानुसार प्राप्त किया: कुछ डेटा (8 नमूने, 12 सुविधाएँ, टोप्लेट्ज़ डिज़ाइन, सब कुछ केंद्रित) बनाने के बाद, मैंने लार्स का उपयोग करके पूरे लासो पथ की गणना की। फिर, मैंने लार्स द्वारा गणना की गई लैम्ब्डा (0.5 से गुणा) के अनुक्रम का उपयोग करके ग्लमेनेट को चलाया और उसी समाधान को प्राप्त करने की उम्मीद की, लेकिन मैंने नहीं किया।

कोई देख सकता है कि समाधान समान हैं। लेकिन मैं अंतर कैसे समझा सकता हूं? कृपया नीचे मेरा कोड खोजें। यहाँ एक संबंधित प्रश्न है: LASSO समाधानों की गणना के लिए GLMNET या LARS? , लेकिन इसमें मेरे प्रश्न का उत्तर नहीं है।

सेट अप:

# Load packages.
library(lars)
library(glmnet)
library(MASS)

# Set parameters.
nb.features <- 12
nb.samples <- 8
nb.relevant.indices <- 3
snr <- 1
nb.lambdas <- 10

# Create data, not really important. 
sigma <- matrix(0, nb.features, nb.features)
for (i in (1:nb.features)) {
  for (j in (1:nb.features)) {
    sigma[i, j] <- 0.99 ^ (abs(i - j))
  }
}

x <- mvrnorm(n=nb.samples, rep(0, nb.features), sigma, tol=1e-6, empirical=FALSE)
relevant.indices <- sample(1:nb.features, nb.relevant.indices, replace=FALSE)
x <- scale(x)
beta <- rep(0, times=nb.features)
beta[relevant.indices] <- runif(nb.relevant.indices, 0, 1)
epsilon <- matrix(rnorm(nb.samples),nb.samples, 1)
simulated.snr <-(norm(x %*% beta, type="F")) / (norm(epsilon, type="F"))
epsilon <- epsilon * (simulated.snr / snr)
y <- x %*% beta + epsilon
y <- scale(y)

लार्स:

la <- lars(x, y, intercept=TRUE, max.steps=1000, use.Gram=FALSE)
co.lars <- as.matrix(coef(la, mode="lambda"))
print(round(co.lars, 4))

#          [,1] [,2] [,3]   [,4]   [,5]   [,6]    [,7]   [,8]    [,9]   [,10]
#  [1,]  0.0000    0    0 0.0000 0.0000 0.0000  0.0000 0.0000  0.0000  0.0000
#  [2,]  0.0000    0    0 0.0000 0.0000 0.1735  0.0000 0.0000  0.0000  0.0000
#  [3,]  0.0000    0    0 0.2503 0.0000 0.4238  0.0000 0.0000  0.0000  0.0000
#  [4,]  0.0000    0    0 0.1383 0.0000 0.7578  0.0000 0.0000  0.0000  0.0000
#  [5,] -0.1175    0    0 0.2532 0.0000 0.8506  0.0000 0.0000  0.0000  0.0000
#  [6,] -0.3502    0    0 0.2676 0.3068 0.9935  0.0000 0.0000  0.0000  0.0000
#  [7,] -0.4579    0    0 0.6270 0.0000 0.9436  0.0000 0.0000  0.0000  0.0000
#  [8,] -0.7848    0    0 0.9970 0.0000 0.9856  0.0000 0.0000  0.0000  0.0000
#  [9,] -0.3175    0    0 0.0000 0.0000 3.4488  0.0000 0.0000 -2.1714  0.0000
# [10,] -0.4842    0    0 0.0000 0.0000 4.7731  0.0000 0.0000 -3.4102  0.0000
# [11,] -0.4685    0    0 0.0000 0.0000 4.7958  0.0000 0.1191 -3.6243  0.0000
# [12,] -0.4364    0    0 0.0000 0.0000 5.0424  0.0000 0.3007 -4.0694 -0.4903
# [13,] -0.4373    0    0 0.0000 0.0000 5.0535  0.0000 0.3213 -4.1012 -0.4996
# [14,] -0.4525    0    0 0.0000 0.0000 5.6876 -1.5467 1.5095 -4.7207  0.0000
# [15,] -0.4593    0    0 0.0000 0.0000 5.7355 -1.6242 1.5684 -4.7440  0.0000
# [16,] -0.4490    0    0 0.0000 0.0000 5.8601 -1.8485 1.7767 -4.9291  0.0000
#         [,11]  [,12]
#  [1,]  0.0000 0.0000
#  [2,]  0.0000 0.0000
#  [3,]  0.0000 0.0000
#  [4,] -0.2279 0.0000
#  [5,] -0.3266 0.0000
#  [6,] -0.5791 0.0000
#  [7,] -0.6724 0.2001
#  [8,] -1.0207 0.4462
#  [9,] -0.4912 0.1635
# [10,] -0.5562 0.2958
# [11,] -0.5267 0.3274
# [12,]  0.0000 0.2858
# [13,]  0.0000 0.2964
# [14,]  0.0000 0.1570
# [15,]  0.0000 0.1571

लैम्ब्डा के साथ glmnet = (लैम्ब्डा_लार्स / 2):

glm2 <- glmnet(x, y, family="gaussian", lambda=(0.5 * la$lambda), thresh=1e-16)
co.glm2 <- as.matrix(t(coef(glm2, mode="lambda")))
print(round(co.glm2, 4))

#     (Intercept)      V1 V2 V3     V4     V5     V6      V7     V8      V9
# s0            0  0.0000  0  0 0.0000 0.0000 0.0000  0.0000 0.0000  0.0000
# s1            0  0.0000  0  0 0.0000 0.0000 0.0000  0.0000 0.0000  0.0000
# s2            0  0.0000  0  0 0.2385 0.0000 0.4120  0.0000 0.0000  0.0000
# s3            0  0.0000  0  0 0.2441 0.0000 0.4176  0.0000 0.0000  0.0000
# s4            0  0.0000  0  0 0.2466 0.0000 0.4200  0.0000 0.0000  0.0000
# s5            0  0.0000  0  0 0.2275 0.0000 0.4919  0.0000 0.0000  0.0000
# s6            0  0.0000  0  0 0.1868 0.0000 0.6132  0.0000 0.0000  0.0000
# s7            0 -0.2651  0  0 0.2623 0.1946 0.9413  0.0000 0.0000  0.0000
# s8            0 -0.6609  0  0 0.7328 0.0000 1.6384  0.0000 0.0000 -0.5755
# s9            0 -0.4633  0  0 0.0000 0.0000 4.6069  0.0000 0.0000 -3.2547
# s10           0 -0.4819  0  0 0.0000 0.0000 4.7546  0.0000 0.0000 -3.3929
# s11           0 -0.4767  0  0 0.0000 0.0000 4.7839  0.0000 0.0567 -3.5122
# s12           0 -0.4715  0  0 0.0000 0.0000 4.7915  0.0000 0.0965 -3.5836
# s13           0 -0.4510  0  0 0.0000 0.0000 5.6237 -1.3909 1.3898 -4.6583
# s14           0 -0.4552  0  0 0.0000 0.0000 5.7064 -1.5771 1.5326 -4.7298
#         V10     V11    V12
# s0   0.0000  0.0000 0.0000
# s1   0.0000  0.0000 0.0000
# s2   0.0000  0.0000 0.0000
# s3   0.0000  0.0000 0.0000
# s4   0.0000  0.0000 0.0000
# s5   0.0000 -0.0464 0.0000
# s6   0.0000 -0.1293 0.0000
# s7   0.0000 -0.4868 0.0000
# s8   0.0000 -0.8803 0.3712
# s9   0.0000 -0.5481 0.2792
# s10  0.0000 -0.5553 0.2939
# s11  0.0000 -0.5422 0.3108
# s12  0.0000 -0.5323 0.3214
# s13 -0.0503  0.0000 0.1711
# s14  0.0000  0.0000 0.1571

जवाबों:


20

अंत में हम दोनों विधियों के साथ एक ही समाधान का उत्पादन करने में सक्षम थे! पहला मुद्दा यह है कि glmnet प्रश्न में बताए अनुसार लैस्सो समस्या को हल करता है, लेकिन लार्स का उद्देश्य फ़ंक्शन में थोड़ा अलग सामान्यीकरण होता है, यह को बदल देता है।12एन12

पुन: पेश करने के लिए, और देखें कि लैसो समस्या के लिए समान समाधान लार्स और ग्लमेनेट का उपयोग करके गणना की जा सकती है, ऊपर दिए गए कोड में निम्नलिखित पंक्तियों को बदलना होगा:

la <- lars(X,Y,intercept=TRUE, max.steps=1000, use.Gram=FALSE)

सेवा मेरे

la <- lars(X,Y,intercept=TRUE, normalize=FALSE, max.steps=1000, use.Gram=FALSE)

तथा

glm2 <- glmnet(X,Y,family="gaussian",lambda=0.5*la$lambda,thresh=1e-16)

सेवा मेरे

glm2 <- glmnet(X,Y,family="gaussian",lambda=1/nbSamples*la$lambda,standardize=FALSE,thresh=1e-16)

1
मुझे खुशी है कि आपको यह पता चला। कोई भी विचार जिस पर सामान्यीकरण विधि अधिक समझ में आती है? मैं वास्तव में glmnet (लासो के लिए) में सामान्यीकरण का उपयोग करके बदतर परिणाम प्राप्त कर चुका हूं और मुझे अभी भी यकीन नहीं है कि क्यों।
बेन ओगोरक

मैं वास्तव में डेटा ऑफहैंड को सामान्य करता हूं और इन तरीकों को लागू करता हूं और यदि वे समान हैं तो तुलना करें। छोटे प्रभावों वाले चर आमतौर पर अलग-अलग गुणांक के देखे जाते हैं
कार्तिक

0

जाहिर है अगर विधियाँ विभिन्न मॉडलों का उपयोग करती हैं तो आपको अलग-अलग उत्तर मिलेंगे। अवरोधन की शर्तों को घटा देने से अवरोधन के बिना मॉडल का नेतृत्व नहीं होता है क्योंकि सबसे अच्छा फिटिंग गुणांक बदल जाएगा और आप उन्हें उस तरीके से नहीं बदलते हैं जिस तरह से आप आ रहे हैं। यदि आप एक ही या लगभग समान उत्तर चाहते हैं, तो आपको दोनों विधियों के साथ एक ही मॉडल को फिट करने की आवश्यकता है।


1
हां, आप सही हैं, विधियां थोड़ा अलग मॉडल का उपयोग करती हैं, मुझे इसके बारे में पता नहीं था। संकेत के लिए धन्यवाद। (मैं एक अलग उत्तर में मतभेदों को और अधिक विस्तृत रूप
आंद्रे

-2

परिणाम समान होना चाहिए। लक्स पैकेज डिफ़ॉल्ट प्रकार = "लार्" द्वारा उपयोग करता है, इस मान को टाइप = "लास्सो" में बदलें। ग्लोमनेट के लिए बस पैरामीटर 'थ्रेश = 1e-16' को कम करें क्योंकि समन्वित वंश अभिसरण पर आधारित है।


2
आपके उत्तर के लिए धन्यवाद। शायद मैं इसे गलत समझ रहा हूं, लेकिन यह छह साल पहले आंद्रे के जवाब में पोस्ट किए गए संकल्प के साथ था। कृपया अपनी पोस्ट को विस्तृत करने पर विचार करें कि आप जो कहना और दिखाना चाह रहे हैं उसका एक पूर्ण विवरण शामिल करें कि हमें यह क्यों मानना ​​चाहिए कि यह सही है और दूसरा नहीं है।
whuber
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.