24 votos

¿Por qué Lars y Glmnet dar diferentes soluciones para el Lazo problema?

Quiero entender mejor los paquetes de R Lars y Glmnet, que se utilizan para resolver el Lazo problema: $$min_{(\beta_0 \beta) \in R^{p+1}} \left[\frac{1}{2N}\sum_{i=1}^{N}(y_i-\beta_0-x_i^T\beta)^2 + \lambda||\beta ||_{l_{1}} \right]$$ (para $p$ Variables e $N$ muestras, ver www.stanford.edu/~hastie/Papers/glmnet.pdf en la página 3)

Por lo tanto, he aplicado, tanto en el mismo juguete conjunto de datos. Por desgracia, los dos métodos no dan las mismas soluciones para los mismos datos de entrada. ¿Alguien tiene una idea de donde está la diferencia viene de?

He obtenido los resultados de la siguiente manera: Después de generar algunos datos (8 muestras, 12 funciones, Toeplitz diseño, todo centrado), he calculado todo Lazo ruta con Lars. Entonces, me encontré con Glmnet utilizando la secuencia de las lambdas calculada por Lars (multiplicado por 0.5) y esperaba obtener la misma solución, pero no lo hice.

[edit:por Favor, ignore el párrafo siguiente, la diffierent intercepta fueron causados por un error en el código, en el que me fijo ahora, lo siento por eso. El resto de la pregunta es pertinente, como corregir el error no se soluciona el problema de los destinatarios.]
Cuando vi el (no idénticas) salidas, me di cuenta de que glmnet calcula una intercepción para cada lambda, mientras que lars no. Así que me resta por mano de la intersección de algunas glmnet solución de y y recentered Y. Entonces me calcula el Lazo camino de nuevo el uso de Lars, y luego con glmnet el uso de las nuevas expresiones lambdas de Lars.

Uno puede ver que las soluciones son similares. Pero, ¿cómo puedo explicar las diferencias? Por favor, encontrar mi código de abajo. Hay una pregunta relacionada aquí: GLMNET o LARS para el cómputo de los LASSO de la solución? , pero no contiene la respuesta a mi pregunta.

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

###Set parameters 
nbFeatures<-12
nbSamples<-8
nbRelevantIndices<-3
snr<-1
nbLambdas<-10
nlambda<-nbLambdas


### Create data, not really important 
sigma<-matrix(0,nbFeatures,nbFeatures)
for (i in (1:nbFeatures))
  for (j in (1:nbFeatures))
    sigma[i,j]<-0.99^(abs(i-j))
X<-mvrnorm(n = nbSamples, rep(0, nbFeatures), sigma, tol = 1e-6, empirical = FALSE)
relevantIndices <- sample(1:nbFeatures, nbRelevantIndices, replace=F)
X<-scale(X) #bug fixed, replaced 'scale(X)' by 'X<-scale(X)'
beta <- rep(0, times=nbFeatures)
beta[relevantIndices] <- runif(nbRelevantIndices,0,1)
epsilon<-matrix(rnorm(nbSamples),nbSamples,1)
simulatedSnr<-(norm(X %*% beta,type="F"))/(norm(epsilon,type="F"))
epsilon<-epsilon*(simulatedSnr/snr)
Y <- X %*% beta + epsilon;
Y<-scale(Y) #bug fixed, replaced 'scale(Y)' by 'Y<-scale(Y)'

### launch lars 
la <- lars(X,Y,intercept=TRUE, max.steps=1000, use.Gram=FALSE)
coLars <- as.matrix(coef(la,,mode="lambda"))
print(round(coLars,4))



### Launch glmnet with lambda=1/2*lambda_lars 
glm2 <- glmnet(X,Y,family="gaussian",lambda=0.5*la$lambda,thresh=1e-16)
coGlm2 <- as.matrix(t(coef(glm2,mode="lambda")))
print(round(coGlm2,4))

##########################
#edit: The rest of the program is not relevant any more, as the issue of the intercept was due to a bug.    
##########################

### Remove intercept computed by glmnet for some lambda (adjusted by hand, depending on output) 
Y<-Y--0.0863
Y<-Y/norm(Y,"F")

### Launch Lars 
la <- lars(X,Y,intercept=TRUE, max.steps=1000, use.Gram=FALSE)
coLars <- as.matrix(coef(la,,mode="lambda"))
print(round(coLars,4))

### Launch Glmnet with lambda=1/2*lambda_lars 
glm2 <- glmnet(X,Y,family="gaussian",lambda=0.5*la$lambda,thresh=1e-16)
coGlm2 <- as.matrix(t(coef(glm2,mode="lambda")))
print(round(coGlm2,4))

23voto

Henrik Puntos 1579

Finalmente hemos sido capaces de producir la misma solución con ambos métodos! Primer problema es que glmnet resuelve el lazo problema como se indica en la pregunta, pero lars tiene un poco diferente de la normalización en la función objetivo, se reemplaza$\frac{1}{2N}$$\frac{1}{2}$. En segundo lugar, ambos métodos de normalizar los datos de manera diferente, por lo que la normalización debe ser swiched off cuando se llama a los métodos.

Para que la reproducción, y ver que las mismas soluciones para el lazo problema puede ser calculadas con lars y glmnet, las siguientes líneas en el código anterior debe ser cambiado:

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

a

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

y

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

a

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

0voto

mat_geek Puntos 1367

Obviamente, si los métodos que se utilizan diferentes modelos de diferentes respuestas. Sustrae la intersección de los términos no conducen a la modelo sin intercepto porque el mejor ajuste de los coeficientes va a cambiar y no cambiar la forma en que se están acercando a él. Necesita que el mismo modelo con ambos métodos, si desea que las mismas o casi las mismas respuestas.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X