Мне нужно оптимизировать набор переменных относительно объектной функции. У меня есть аналитический градиент функции, и я хотел бы использовать его в подпрограмме оптимизации. Объект и градиент имеют некоторые общие вычисления, и я хотел бы определить функции наиболее эффективным способом. Следующий пример демонстрирует проблему.Оптимизация в R - эффективное вычисление цели и градиента
Пусть f_obj
, f_grad
и f_common
- функции для объектного, градиентного и общего вычислений соответственно. Оптимизация выполняется над вектором x
. В приведенном ниже коде найден корень полинома y^3 - 3*y^2 + 6*y + 1
, где y
является функцией от c(x[1], x[2])
. Обратите внимание, что функция f_common
вызывается как f_obj
, так и f_grad
. В моей реальной проблеме общее вычисление намного длиннее, поэтому я ищу способ определить f_obj
и f_grad
так, чтобы количество вызовов f_common
было сведено к минимуму.
f_common <- function(x) x[1]^3*x[2]^3 - x[2]
f_obj <- function(x) {
y <- f_common(x)
return ((y^3 - 3*y^2 + 6*y + 1)^2)
}
f_grad <- function(x) {
y <- f_common(x)
return (2 * (y^3 - 3*y^2 + 6*y + 1) * (3*y^2 - 6*y + 6)* c(3*x[1]^2*x[2]^3, 3*x[1]^3*x[2]^2 - 1))
}
optim(par = c(100,100), fn = f_obj, gr = f_grad, method = "BFGS")
UPDATE
Я считаю, что пакет nloptr
предлагает средство для ввода целевой функции и ее градиента в виде списка. Есть ли способ определить другие оптимизаторы (optim
, optimx
, nlminb
и т. Д.) Аналогичным образом?
Спасибо.
Что вы хотите>? Код работает. Если вы хотите свести к минимуму вызов функции f_common, вы не должны называть его, а вместо этого - жестким кодом y в функции. –
Жесткое кодирование общих вычислений в обеих функциях будет эквивалентным вызову f_common (с точки зрения времени выполнения). Я ищу способ устранить избыточные вычисления. С моим кодом, если подпрограмма оптимизации должна вычислять 'f_obj' в точке' x' и найти ее градиент в этой точке, ей нужно будет вызвать 'f_common' дважды, но нам нужно только вычислить' y' один раз. – user3294195
Возможно, вы можете использовать пакет, например [memoise] (https://cran.r-project.org/web/packages/memoise/index.html) для кэширования результатов 'f_common'. – sgibb