Observé que la función lazo en MATLAB es relativamente lenta. Corro muchos problemas de regresión, con típicamente 1 a 100 predictores y 200 a 500 observaciones. En algunos casos, el lazo resultó ser extremadamente lento (para resolver un problema de regresión, tomó varios minutos). Descubrí que este era el caso cuando los predictores estaban altamente correlacionados (p. Ej., Series temporales de temperatura del aire en puntos de cuadrícula vecinos de un modelo atmosférico).
Comparé las actuaciones del siguiente ejemplo en matlab y en R.
y es el vector predictivo con 163 elementos (que representan observaciones) yx es la matriz predictora con 100 filas y 163 observaciones correspondientes a las observaciones en y. Apliqué el lazo de la función MATLAB de la siguiente manera:
[beta_L,stats]=lasso(x,y,'cv',4);
Lo mismo en R, usando glmnet:
fit.lasso=cv.glmnet(predictor.ts,predictand.ts,nfolds=4)
Tanto MATLAB como R se basan en un algoritmo de descenso coordinado. El valor predeterminado para el número de valores lambda es 100 para lazo y glmnet. El umbral de convergencia para el descenso de coordenadas es por defecto 10 ^ -4 en matlab, e incluso más bajo en R (10 ^ -7).
La función R tarda un segundo en mi computadora. Matlab toma varios minutos, con la mayor parte del tiempo de cálculo empleado en el algoritmo de descenso de coordenadas.
Cuando los predictores están menos correlacionados (p. Ej., Diferentes tipos de variables de un modelo atmosférico numérico) el lazo en Matlab no es tan lento, pero aún tarda ~ 30, en comparación con ~ 1 s en R).
¿Matlab Lasso es realmente mucho más ineficiente que glmnet, o me pierdo algo?