【发布时间】:2022-01-17 17:30:11
【问题描述】:
我正在使用 R 编程语言。使用“optim”库和“BFGS”优化算法,我有兴趣优化以下函数(也称为“Rosenbrock 函数”):
如果你定义了这个函数和这个函数的导数,用“optim”库和BFGS算法优化是非常简单的(注意:BFGS算法需要知道函数的导数):
fr <- function(x) { ## Rosenbrock Banana function
x1 <- x[1]
x2 <- x[2]
100 * (x2 - x1 * x1)^2 + (1 - x1)^2
}
grr <- function(x) { ## Gradient of 'fr'
x1 <- x[1]
x2 <- x[2]
c(-400 * x1 * (x2 - x1 * x1) - 2 * (1 - x1),
200 * (x2 - x1 * x1))
}
res <- optim(c(-1.2,1), fr, grr, method = "BFGS")
> res
$par
[1] 1 1
$value
[1] 9.594956e-18
$counts
function gradient
110 43
$convergence
[1] 0
$message
NULL
假设您正在处理一个高维复杂函数 - 该函数的导数将难以手动评估,然后为该导数编写一个函数(即您可能会犯错误的额外位置)。 R 中是否有任何“自动”方式,例如,如果您编写数学函数 - R 可以自动“推断”该函数的导数?
例如,在新的 R 会话中 - 是否有某种方法可以在不显式定义导数的情况下运行 BFGS 算法?
fr <- function(x) { ## Rosenbrock Banana function
x1 <- x[1]
x2 <- x[2]
100 * (x2 - x1 * x1)^2 + (1 - x1)^2
}
#pseudo code
res <- optim(c(-1.2,1), fr, ??? , method = "BFGS")
有谁知道这样的事情是否可行? R能自动推断导数吗?
我想到了一种方法,您可以在 R 中使用预先存在的“数值微分”函数来近似每次迭代的导数,然后将此近似值输入 BFGS 算法,但这听起来非常复杂且不必要。
如果 R 能够以某种方式自动推断函数的导数,那就太好了。
参考资料:
【问题讨论】:
-
你可以看看Deriv 包。
标签: r function optimization