J'ai observé que la fonction lasso dans MATLAB est relativement lente. Je gère de nombreux problèmes de régression, avec généralement 1 à 100 prédicteurs et 200 à 500 observations. Dans certains cas, le lasso s'est avéré extrêmement lent (pour résoudre un problème de régression, il a fallu plusieurs minutes). J'ai découvert que c'était le cas lorsque les prédicteurs étaient fortement corrélés (par exemple, les séries chronologiques de la température de l'air aux points de grille voisins d'un modèle atmosphérique).
J'ai comparé les performances de l'exemple ci-dessous en matlab et en R.
y est le vecteur prédictif avec 163 éléments (représentant les observations) et x est la matrice prédictive avec 100 lignes et 163 observations correspondant aux observations en y. J'ai appliqué le lasso de la fonction MATLAB comme suit:
[beta_L,stats]=lasso(x,y,'cv',4);
La même chose dans R, en utilisant glmnet:
fit.lasso=cv.glmnet(predictor.ts,predictand.ts,nfolds=4)
MATLAB et R sont tous deux basés sur un algorithme de descente de coordonnées. La valeur par défaut du nombre de valeurs lambda est 100 pour le lasso et le glmnet. Le seuil de convergence pour la descente de coordonnées est par défaut 10 ^ -4 dans matlab, et encore plus bas dans R (10 ^ -7).
La fonction R prend une seconde sur mon ordinateur. Matlab prend plusieurs minutes, la plupart du temps de calcul étant passé dans l'algorithme de descente de coordonnées.
Lorsque les prédicteurs sont moins corrélés (par exemple, différents types de variables d'un modèle atmosphérique numérique), le lasso dans Matlab n'est pas si lent, mais prend toujours ~ 30 - contre ~ 1 s dans R).
Matlab Lasso est-il vraiment beaucoup plus inefficace que glmnet, ou est-ce que je manque quelque chose?