Как подать градиент (или гессиан) в nlm?

В файле справки для нелинейной функции минимизатора 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, в качестве примера см .: как правильно указать функцию градиента для использования в optim () или другом оптимизаторе

Изучение внутреннего кода nlm не помогло.


person Alex    schedule 27.02.2017    source источник


Ответы (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
person inhuretnakht    schedule 03.11.2017