Observei que a função laço no MATLAB é relativamente lenta. Eu corro muitos problemas de regressão, com tipicamente 1 a 100 preditores e 200 a 500 observações. Em alguns casos, o laço mostrou-se extremamente lento (para resolver problemas de regressão, levou vários minutos). Descobri que esse era o caso quando os preditores eram altamente correlacionados (por exemplo, séries temporais de temperatura do ar em pontos de grade vizinhos de um modelo atmosférico).
Comparei as performances do exemplo abaixo no matlab e no R.
y é o vetor preditivo com 163 elementos (representando observações) e x é a matriz preditora com 100 linhas e 163 observações correspondentes às observações em y. Eu apliquei o laço da função MATLAB da seguinte maneira:
[beta_L,stats]=lasso(x,y,'cv',4);
O mesmo em R, usando glmnet:
fit.lasso=cv.glmnet(predictor.ts,predictand.ts,nfolds=4)
MATLAB e R são baseados em um algoritmo de descida de coordenadas. O valor padrão para o número de valores lambda é 100 para laço e glmnet. O limite de convergência para a descida de coordenadas é por padrão 10 ^ -4 no matlab e ainda mais baixo em R (10 ^ -7).
A função R leva um segundo no meu computador. O Matlab leva vários minutos, com a maior parte do tempo de computação gasto no algoritmo de descida de coordenadas.
Quando os preditores são menos correlacionados (por exemplo, diferentes tipos de variáveis de um modelo atmosférico numérico), o laço no Matlab não é tão lento, mas ainda leva ~ 30 - comparado a ~ 1 s em R).
O laço do matlab é realmente muito mais ineficiente do que o glmnet, ou sinto falta de algo?