超越R的优化功能

时间:2010-09-21 04:32:29

标签: optimization r

我正在尝试使用R来估计具有手动规范的多项logit模型。我找到了一些允许您估算MNL模型herehere的软件包。

我发现了一些关于“滚动”你自己的MLE函数here的其他着作。但是,从我的挖掘 - 所有这些函数和包依赖于内部optim函数。

在我的基准测试中,optim是瓶颈。使用具有约16000个观测值和7个参数的模拟数据集,R在我的机器上花费大约90秒。 Biogeme中的等效模型需要大约10秒。在Ox中编写自己的代码的同事在同一模型中报告大约4秒钟。

有没有人有编写自己的MLE功能的经验,或者可以指出我的方向超出默认的optim功能(没有双关语)?

如果有人想要R代码重新创建模型,请告诉我 - 我会提供它。我没有提供它,因为它与优化optim函数和保留空间的问题没有直接关系......

编辑:感谢大家的想法。基于下面的无数评论,我们能够将R与Biogeme放在同一个球场,以获得更复杂的模型,对于我们运行的几个更小/更简单的模型,R实际上更快。我认为这个问题的长期解决方案是编写一个单独的最大化函数,它依赖于fortran或C库,但我肯定对其他方法持开放态度。

4 个答案:

答案 0 :(得分:20)

已经尝试过nlm()函数了吗?不知道它是否更快,但确实提高了速度。还要检查选项。 optim使用慢速算法作为默认值。你可以获得一个>使用Quasi-Newton算法(method =“BFGS”)代替默认值,加速5倍。如果你不太关心最后的数字,你也可以设置更高的nlm()公差等级来获得额外的速度。

f <- function(x) sum((x-1:length(x))^2)

a <- 1:5

system.time(replicate(500,
     optim(a,f)
))
   user  system elapsed 
   0.78    0.00    0.79 

system.time(replicate(500,
     optim(a,f,method="BFGS")
))
   user  system elapsed 
   0.11    0.00    0.11 

system.time(replicate(500,
     nlm(f,a)
))
   user  system elapsed 
   0.10    0.00    0.09 

system.time(replicate(500,
      nlm(f,a,steptol=1e-4,gradtol=1e-4)
))
   user  system elapsed 
   0.03    0.00    0.03 

答案 1 :(得分:6)

您是否考虑了CRAN Task View for Optimization上的资料?

答案 2 :(得分:2)

FWIW,我在C-ish中使用OPTIF9完成了这项工作。你很难比这更快。有很多方法可以让事情变得更慢,比如运行像R这样的翻译。

补充:从评论中可以清楚地看出,OPTIF9被用作优化引擎。这意味着很可能大部分时间花在评估R中的目标函数上。虽然C函数可能在下面用于某些操作,但仍然存在解释器开销。有一种快速的方法可以确定R中哪些代码行和函数调用负责大部分时间,也就是使用Escape键暂停它并检查堆栈。如果一个语句花费X%的时间,那么它在X%的时间内处于堆栈中。您可能会发现有些操作不是C,应该是。当您找到并行化R执行的方法时,将保留以此方式获得的任何加速因子。

答案 3 :(得分:2)

我是R包 optimParallel 的作者,这可能对您的情况有所帮助。该软件包提供optim()基于梯度的优化方法的并行版本。包的主要功能是optimParallel(),其用法和输出与optim()相同。使用optimParallel()可以显着缩短优化时间,如下图所示(p是参数的数量)。 enter image description here 有关详细信息,请参阅https://cran.r-project.org/package=optimParallelhttp://arxiv.org/abs/1804.11058