我观察到 MATLAB 中的函数 lasso 比较慢。我运行了许多回归问题,通常有 1 到 100 个预测变量和 200 到 500 个观察值。在某些情况下,lasso 速度非常慢(解决回归问题需要几分钟时间)。我发现当预测变量高度相关时就是这种情况(例如,大气模型相邻网格点的气温时间序列)。
我比较了以下示例在 matlab 和 R 中的性能。
y 是具有 163 个元素(代表观测值)的预测向量,x 是具有 100 行和 163 个观测值的预测矩阵,对应于 y 中的观测值。我应用了 MATLAB 函数套索如下:
[beta_L,stats]=lasso(x,y,'cv',4);
在 R 中也是如此,使用 glmnet:
fit.lasso=cv.glmnet(predictor.ts,predictand.ts,nfolds=4)
MATLAB 和 R 都基于坐标下降算法。lasso 和 glmnet 的 lambda 值数量的默认值为 100。坐标下降的收敛阈值在 matlab 中默认为 10^-4,在 R (10^-7) 中甚至更低。
R 函数在我的计算机上需要一秒钟。Matlab 需要几分钟,大部分计算时间都花在坐标下降算法上。
当预测变量相关性较低(例如,数值大气模型的不同变量类型)时,Matlab 中的套索并不那么慢,但仍需要约 30 - 与 R 中的约 1 秒相比。
matlab lasso 真的比 glmnet 效率低得多,还是我错过了什么?