【问题标题】:Automatically "recognizing" (calculus) derivatives自动“识别”(微积分)导数
【发布时间】: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


【解决方案1】:

这已经内置到 optim() 函数中。如果您不指定导数,它将以数字方式计算,例如

fr <- function(x) {   ## Rosenbrock Banana function
  x1 <- x[1]
  x2 <- x[2]
  100 * (x2 - x1 * x1)^2 + (1 - x1)^2
}


optim(c(-1.2,1), fr, method = "BFGS")

# $par
# [1] 0.9998044 0.9996084
# 
# $value
# [1] 3.827383e-08
# 
# $counts
# function gradient 
# 118       38 
# 
# $convergence
# [1] 0
# 
# $message
# NULL

请注意(至少在这种情况下)解非常接近使用解析导数找到的解。

【讨论】:

    猜你喜欢
    • 2017-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多