首页 文章

如何为nlm提供渐变(或粗麻布)?

提问于
浏览
1

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

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

这是否意味着渐变和hessians由以下命令提供:

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 的代码内部没有帮助 .

1 回答

  • 0

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

    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
    

相关问题