Ich habe festgestellt, dass die Funktion Lasso in MATLAB relativ langsam ist. Ich habe viele Regressionsprobleme mit normalerweise 1 bis 100 Prädiktoren und 200 bis 500 Beobachtungen. In einigen Fällen erwies sich Lasso als extrem langsam (um ein Regressionsproblem zu lösen, dauerte es einige Minuten). Ich entdeckte, dass dies der Fall war, wenn die Prädiktoren stark korreliert waren (z. B. Lufttemperatur-Zeitreihen an benachbarten Gitterpunkten eines atmosphärischen Modells).
Ich habe die Leistungen des folgenden Beispiels in matlab und in R verglichen.
y ist der Prädiktorenvektor mit 163 Elementen (die Beobachtungen darstellen) und x ist die Prädiktormatrix mit 100 Zeilen und 163 Beobachtungen, die den Beobachtungen in y entsprechen. Ich habe die MATLAB-Funktion Lasso wie folgt angewendet:
[beta_L,stats]=lasso(x,y,'cv',4);
Das gleiche in R mit glmnet:
fit.lasso=cv.glmnet(predictor.ts,predictand.ts,nfolds=4)
Sowohl MATLAB als auch R basieren auf einem Algorithmus für den Koordinatenabstieg. Der Standardwert für die Anzahl der Lambda-Werte ist 100 für Lasso und Glmnet. Die Konvergenzschwelle für den Koordinatenabstieg beträgt in Matlab standardmäßig 10 ^ -4 und in R (10 ^ -7) sogar noch weniger.
Die R-Funktion dauert auf meinem Computer eine Sekunde. Matlab dauert mehrere Minuten, wobei der größte Teil der Rechenzeit im Algorithmus für den Koordinatenabstieg verbracht wird.
Wenn die Prädiktoren weniger korreliert sind (z. B. verschiedene Variablentypen eines numerischen atmosphärischen Modells), ist das Lasso in Matlab nicht so langsam, dauert aber immer noch ~ 30 - verglichen mit ~ 1 s in R).
Ist Matlab Lasso wirklich viel ineffizienter als glmnet oder vermisse ich etwas?