首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将nlm()调用转换为nlminb()调用

将nlm()调用转换为nlminb()调用
EN

Stack Overflow用户
提问于 2017-10-26 01:15:20
回答 1查看 257关注 0票数 0

我有一些使用nlm()进行非线性优化的遗留代码。我打算将代码更新为nlminb(),以便可以进行约束优化。我知道这两个方法可能不相同或不等价,但是考虑到提供给nlm()的以下参数,为类似的nlminb调用提供的调用和参数是什么?

代码语言:javascript
复制
##' @param print.level Arguments for nlm.
##' @param typsize Arguments for nlm.
##' @param ndigit Arguments for nlm.
##' @param gradtol Arguments for nlm.
##' @param stepmax Arguments for nlm.
##' @param steptol Arguments for nlm.
##' @param iterlim Arguments for nlm.
##' @param fscale Arguments for nlm.


# Take the legacy nlm() call and ...    
z0 <- nlm(like,p=p,hessian=TRUE,print.level=print.level,typsize=typsize,
    ndigit=ndigit,gradtol=gradtol,stepmax=stepmax,steptol=steptol,
    iterlim=iterlim,fscale=fscale)


# turn into nlminb call:
z0 <- nlminb(nlminb args with different names but taking same @param from parent function)
EN

回答 1

Stack Overflow用户

发布于 2017-10-26 01:15:20

有趣的问题!我最终会建议使用optimx ( RdocsJSS site),但现在让我们将nlm映射到nlminb上。

我会补充一下你写的内容:

代码语言:javascript
复制
##' @param print.level Arguments for nlm.
##' @param typsize Arguments for nlm.
##' @param ndigit Arguments for nlm.
##' @param gradtol Arguments for nlm.
##' @param stepmax Arguments for nlm.
##' @param steptol Arguments for nlm.
##' @param iterlim Arguments for nlm.
##' @param fscale Arguments for nlm.


# Take the legacy nlm() call and ...    
z0 <- nlm(f=like,
          p=p,
          hessian=TRUE,
          print.level=print.level,
          typsize=typsize,
          ndigit=ndigit,
          gradtol=gradtol,
          stepmax=stepmax,
          steptol=steptol,
          iterlim=iterlim,
          fscale=fscale
          )

nlminb()中类似的调用将如下所示。我们注意到的第一件事是,nlminb()使用了一个带有control parameterscontrol参数,以及参数objectivestart,而不是fp (分别以不同于nlm的顺序,所以一定要显式地输入参数):

代码语言:javascript
复制
# turn into nlminb call:
z0 <- nlminb(objective=like,
             start=p,
             hessian=TRUE,
             control = list(trace=print.level,  #for 0, same behavior
                            #typsize=typsize,
                            #ndigit=ndigit,
                            #gradtol=gradtol,
                            step.max=stepmax,
                            #steptol=steptol,
                            iter.max=iterlim,
                            #fscale=fscale
             )
)

我建议在父函数中添加更多参数,并使用optimx

代码语言:javascript
复制
##' @param print.level Arguments for nlm.
##' @param typsize Arguments for nlm.
##' @param ndigit Arguments for nlm.
##' @param gradtol Arguments for nlm.
##' @param stepmax Arguments for nlm, nlminb
##' @param steptol Arguments for nlm.
##' @param iterlim Arguments for optimx, nlm, nlminb
##' @param fscale Arguments for nlm.
##' @param trace Arguments for nlminb
##' @param method Argument for optimx

z0 <- optimx(fn=like, 
             par=p, 
             hessian=TRUE, ## not `hess`
             method=c("nlminb"), 
             itnmax=iterlim, 
             control = list(
               # for nlm:
               print.level=print.level,
               typsize=typsize,
               ndigit=ndigit,
               gradtol=gradtol,
               stepmax=stepmax,
               steptol=steptol,
               #iterlim=iterlim, # preferred as itnmax above
               fscale=fscale,
               # for nlminb:
               trace=trace,
               step.max=stepmax
               # ... any other nlminb args
             )             
)

要从optimx中提取hessian,请这样做:

代码语言:javascript
复制
## hessian extraction (1st row or by name):
attr(fit, "details")[1,]$nhatend
attr(fit, "details")["nlminb",]$nhatend

下面的nlminb不是问题所必需的,只需将感兴趣的 nlm 参数放在一个位置,然后得出结论,即a不存在完美的一对一匹配

以下是nlm() (摘自Rdocs)的print.leveltypsizendigitgradtolstepmaxsteptoliterlimfscalenlm()参数定义:

  • print.level此参数确定最小化过程中执行的打印级别。默认值0表示不进行打印,值1表示打印初始和最终细节,值2表示完整的跟踪信息是minimum.
  • ndigit处每个参数大小的估计值,函数f.
  • gradtol中的有效位数是一个正标量,在该公差处缩放的渐变被认为足够接近于零,从而终止算法。缩放梯度是每个方向pi上f的相对变化除以pi.
  • stepmax中的相对变化的度量,正标量给出了最大允许的缩放步长。stepmax用于防止可能导致优化函数溢出的步骤,防止算法离开参数空间中的感兴趣区域,或检测算法中的发散。可以选择足够小以防止前两次发生的步长,但应该大于任何预期的合理step.
  • steptol提供最小允许相对步长的正标量length.
  • iterlim一个正整数,指定在程序terminated.
  • fscale最小f的大小之前执行的最大迭代次数。

现在我们尝试在nlminb() (从Rdocs中提取)中查找匹配项。我们注意到的第一件事是,nlminb()control parameters使用了control参数

代码语言:javascript
复制
# turn into nlminb call:
z0 <- nlminb(objective=like,
             start=p,
             hessian=TRUE,
             control = list(trace=print.level,  #for 0, same behavior
                            #typsize=typsize,
                            #ndigit=ndigit,
                            #gradtol=gradtol,
                            step.max=stepmax,
                            #steptol=steptol,
                            iter.max=iterlim,
                            #fscale=fscale
             )
)

nlmprint.level最接近的可能是trace。对于值为0的值,两者做的是相同的事情。但是,对于非零值,它们的操作是不同的。

  • trace目标函数值和参数值在每次trace迭代时打印。默认值为0,表示不打印跟踪信息。

结论:更多地查看文档,看起来找到一个精确的匹配可能是具有挑战性的。这就是为什么我建议扩展父参数和使用优化的原因。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46938381

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档