【问题标题】:How does one supply a gradient (or hessian) to nlm?如何为 nlm 提供梯度(或粗麻布)?
【发布时间】:2017-07-18 17:47:36
【问题描述】:

在非线性最小化函数stats::nlm 的帮助文件中,它指出f 的参数之一是(强调我的):

要最小化的函数,返回单个数值。这应该是一个函数,第一个参数是一个长度为 p 的向量,后跟由 ... 参数指定的任何其他参数。 如果函数值有一个叫做梯度的属性或同时有梯度和粗麻布属性,这些将用于计算更新的参数值。

这是否意味着梯度和粗麻布是由如下命令提供的:

attr(f, 'gradient') <- function(...){...}

这个函数的输入输出应该是什么?

将此与一般优化器 stats::optim 进行对比:

optim(par, fn, gr = NULL, ...,
  method = c("Nelder-Mead", "BFGS", "CG", "L-BFGS-B", "SANN",
             "Brent"), ...)

梯度被显式指定为optim 的参数,例如:how to propery specify a gradient function for use in optim() or other optimizer

检查nlm 的代码内部没有帮助。

【问题讨论】:

    标签: r mathematical-optimization model-fitting


    【解决方案1】:

    这是一个简单的一维示例:

    f <- function(x) {
      out <- -exp(-0.5 * x^2)
      attr(out, 'gradient') <- -x * out 
      attr(out, 'hessian') <-  (x^2 - 1) * out
      return(out)
    }
    
    nlm(f, 1.3, hessian = TRUE, check.analyticals = TRUE)
    

    这给出了:

    # $minimum
    # [1] -1
    # 
    # $estimate
    # [1] 4.23687e-14
    # 
    # $gradient
    # [1] 4.23687e-14
    # 
    # $hessian
    # [,1]
    # [1,]    1
    # 
    # $code
    # [1] 1
    # 
    # $iterations
    # [1] 3
    

    【讨论】:

      猜你喜欢
      • 2016-05-02
      • 2011-09-27
      • 2014-03-22
      • 1970-01-01
      • 2019-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-07
      相关资源
      最近更新 更多