超越R的优化功能

Cha*_*ase 22 optimization r

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

我发现在"滚动"自己MLE功能的一些其他著作在这里.然而,从我的挖掘 - 所有这些功能和包依赖于内部optim功能.

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

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

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

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

Jor*_*eys 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 
Run Code Online (Sandbox Code Playgroud)

  • Joris,你能解释一下吗*不知道它是否更快,但它确实再次提高了速度*我今天只喝了两杯咖啡.你的意思是"更快,但不确定多少"? (3认同)
  • Errr,键盘这一侧也需要更多的咖啡......事实上,它在我测试它的功能上更快,有时是微不足道的,有时相当多.它还取决于控制设置,如代码所示. (2认同)

Flo*_*ian 6

我是 R 包optimParallel的作者,这对您的情况可能会有所帮助。该包提供了基于梯度的优化方法的并行版本optim()。该包的主要功能是optimParallel(),其用法和输出与optim(). 使用optimParallel()可以显着减少优化时间,如下图所示(p是参数的数量)。 在此处输入图片说明 有关更多信息,请参阅https://cran.r-project.org/package=optimParallelhttp://arxiv.org/abs/1804.11058