代码之家  ›  专栏  ›  技术社区  ›  Chase

超越R的optim函数

  •  22
  • Chase  · 技术社区  · 15 年前

    我试图用R来估计一个多项式logit模型与手动规范。我发现了一些软件包,允许您估计MNL模型 here here

    我发现了一些关于“滚动”你自己的MLE函数的其他著作 here . 然而,从我的挖掘周围-所有这些功能和包依赖于内部 optim

    在我的基准测试中, 擎天柱 Biogeme 大约需要10秒。用计算机编写自己代码的同事 Ox 同一型号的报告时间约为4秒。

    擎天柱

    如果有人想用R代码重新创建模型,请告诉我-我很乐意提供。我没有提供它,因为它与优化 擎天柱

    编辑:谢谢大家的想法。基于下面的大量评论,对于更复杂的模型,我们能够得到与Biogeme相同的R,对于我们运行的几个更小/更简单的模型,R实际上更快。我认为这个问题的长期解决方案将涉及到编写一个独立的最大化函数,它依赖于fortran或C库,但我肯定会接受其他方法。

    4 回复  |  直到 15 年前
        1
  •  20
  •   Joris Meys    15 年前

    是否已尝试使用nlm()函数?不知道是不是快了很多,但确实提高了速度。同时检查选项。optim默认使用一个慢算法。使用拟牛顿算法(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 
    
        3
  •  5
  •   Nairolf    8 年前

    我是R软件包的作者 最佳平行 ,这对你的情况可能有帮助。该软件包提供了基于梯度优化方法的并行版本 optim() . 软件包的主要功能是 optimParallel() optim() . 使用 optimParallel() 可以显著减少优化时间,如下图所示( p 是参数数)。 enter image description here 看到了吗 https://cran.r-project.org/package=optimParallel http://arxiv.org/abs/1804.11058 更多信息。

        4
  •  2
  •   Mike Dunlavey    15 年前

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