লারস এবং গ্ল্যামনেট কেন লাসো সমস্যার বিভিন্ন সমাধান দেয়?


22

আমি আর প্যাকেজগুলি আরও ভালভাবে বুঝতে চাই Larsএবং Glmnetযা লসো সমস্যা সমাধানের জন্য ব্যবহৃত হয়: (জন্য ভেরিয়েবল এবং নমুনা পৃষ্ঠা 3 এ www.stanford.edu/~hastie/Papers/glmnet.pdf দেখুন )পিএন

মিআমিএন(β0β)আরপি+ +1[12এনΣআমি=1এন(Yআমি-β0-এক্সআমিটিβ)2+ +λ||β||1]
পিএন

অতএব, আমি তাদের উভয় একই খেলনা ডেটাसेटে প্রয়োগ করেছি। দুর্ভাগ্যক্রমে, দুটি পদ্ধতি একই ডেটা ইনপুটটির জন্য একই সমাধান দেয় না। পার্থক্যটি কোথা থেকে এসেছে কারও কি ধারণা আছে?

আমি ফলাফলগুলি নিম্নলিখিত হিসাবে পেয়েছি: কিছু তথ্য উত্পন্ন করার পরে (8 টি নমুনা, 12 টি বৈশিষ্ট্য, টোপলিটজ ডিজাইন, কেন্দ্রিক সবকিছু), আমি লার্স ব্যবহার করে পুরো লাসোর পথটি গণনা করেছি। তারপরে, লারস দ্বারা গুণিত ল্যাম্বডাসের ক্রম ব্যবহার করে আমি গ্ল্যামনেট চালিয়েছি (০.০ দিয়ে গুণিত) এবং একই সমাধানটি পাওয়ার আশাবাদী, তবে আমি তা করি নি।

কেউ দেখতে পাচ্ছেন যে সমাধানগুলি একই রকম। তবে আমি কীভাবে পার্থক্যগুলি ব্যাখ্যা করতে পারি? দয়া করে নীচে আমার কোডটি সন্ধান করুন। এখানে একটি সম্পর্কিত প্রশ্ন রয়েছে: লাসো সমাধানের কম্পিউটিংয়ের জন্য জিএলএমনেট বা লারস? , তবে এতে আমার প্রশ্নের উত্তর নেই।

সেটআপ:

# 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)

Lars:

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

ল্যাম্বদা সহ গ্ল্যামনেট = (ল্যাম্বদা_লার / ২):

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 Lasso সমস্যা হিসেবে প্রশ্ন বিবৃত solves, কিন্তু Lars উদ্দেশ্য ফাংশন একটি সামান্য ভিন্ন নিয়মমাফিককরণ আছে, দ্বারা । দ্বিতীয়ত, উভয় পদ্ধতিই ডেটাটিকে পৃথকভাবে স্বাভাবিক করে তোলে, সুতরাং পদ্ধতিগুলি কল করার সময় স্বাভাবিককরণটি অবশ্যই বন্ধ করা উচিত।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
আমি খুশি যে আপনি এটি বুঝতে পেরেছি। কোন চিন্তাভাবনা যার উপর নরমালাইজেশন পদ্ধতিটি আরও অর্থবোধ করে? আমি আসলে গ্ল্যামনেটে (লাসোর জন্য) স্বাভাবিককরণ ব্যবহার করে আরও খারাপ ফলাফল পেয়েছি এবং এখনও কেন তা নিশ্চিত তা নিশ্চিত নয়।
বেন ওগোরেক

আমি প্রকৃতপক্ষে ডেটা অফহ্যান্ডকে সাধারণীকরণ করি এবং এই পদ্ধতিগুলি প্রয়োগ করি এবং সেগুলি অনুরূপ হলে তুলনা করি। ছোট প্রভাবগুলির সাথে
চলকগুলিতে

0

স্পষ্টতই যদি পদ্ধতিগুলি বিভিন্ন মডেল ব্যবহার করে তবে আপনি পৃথক উত্তর পাবেন। ইন্টারসেপ্ট শর্তগুলি বাদ দিয়ে মডেলটিকে বাধা ছাড়াই নেতৃত্ব দেয় না কারণ সেরা ফিটিং সহগের পরিবর্তন হবে এবং আপনি যেভাবে কাছে যাচ্ছেন সেভাবে আপনি সেগুলি পরিবর্তন করেন না। যদি আপনি একই বা প্রায় একই উত্তর চান তবে আপনাকে দুটি পদ্ধতির সাথে একই মডেল ফিট করতে হবে।


1
হ্যাঁ, আপনি ঠিক বলেছেন, পদ্ধতিগুলি কিছুটা ভিন্ন মডেল ব্যবহার করে, আমি এটি সম্পর্কে অবগত ছিলাম না। ইঙ্গিতটির জন্য ধন্যবাদ। (আমি পৃথক উত্তরে পার্থক্যগুলি আরও বিস্তারিতভাবে ব্যাখ্যা করব)
আন্ড্রে

-2

ফলাফল একই হতে হবে। লার্স প্যাকেজটি ডিফল্ট টাইপ = "লার্" দ্বারা ব্যবহার করে, এই মানটি = "লাসো" টাইপ করুন। গ্লোনেটের জন্য প্যারামিটারটি কেবল 'থ্রেশ = 1 ই -16' কম করুন, কারণ স্থানাঙ্কন বংশোদ্ভূত অভিব্যক্তির উপর ভিত্তি করে।


2
আপনার উত্তর করার জন্য আপনাকে ধন্যবাদ। হতে পারে আমি এটি ভুলভাবে লিখছি, তবে এটি ছয় বছর আগে আন্দ্রের উত্তর পোস্ট করা রেজোলিউশনের সাথে মতবিরোধ বলে মনে হচ্ছে। আপনি কী বলতে চাইছেন এবং কেন এটি সঠিক এবং অন্যটি নয় তা আমাদের কেন বিশ্বাস করা উচিত তার পূর্ণ বিবরণ অন্তর্ভুক্ত করার জন্য দয়া করে আপনার পোস্টটি বিশদভাবে বিবেচনা করুন।
whuber
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.