R 当某些参数已知时,如何处理optim?
我在向R 当某些参数已知时,如何处理optim?,r,mathematical-optimization,R,Mathematical Optimization,我在向optim传递参数时遇到了一个问题。 例如,假设我想对一个多元函数进行框约束最小化 fr <- function(x) { ## Rosenbrock function x1 <- x[1] x2 <- x[2] x3 <- x[3] x4 <- x[4] 100 * (x2 - x1 * x1)^2 + (1 - x1)^2 + 100 * (x3 - x2 * x2)^2 + (1 - x2)^2 + 100 * (x4
optim
传递参数时遇到了一个问题。
例如,假设我想对一个多元函数进行框约束最小化
fr <- function(x) { ## Rosenbrock function
x1 <- x[1]
x2 <- x[2]
x3 <- x[3]
x4 <- x[4]
100 * (x2 - x1 * x1)^2 + (1 - x1)^2 +
100 * (x3 - x2 * x2)^2 + (1 - x2)^2 +
100 * (x4 - x3 * x3)^2 + (1 - x3)^2
}
现在,假设此过程在一个算法中重复,该算法改变下部
和上部
(框约束),然后是par
,这样在一些迭代中,一个、两个或三个参数值变得已知,例如x1
=1。在这种情况下,我希望optim
通过将x1
的初始值、下限和上限设置为1来处理这个问题:
optim(par = c(1, 1, 1, 2), fr, method = "L-BFGS-B", lower = c(1, 0, 0, 0), upper = c(1, 3, 3, 3))
但通过运行这条线路,我得到了一个错误:
Error in optim(par = c(1, 1, 1, 2), fr, method = "L-BFGS-B", lower = c(1, : non-finite finite-difference value [1]
现在的问题是,当一个或一些参数已知时,如何在不定义许多新函数的情况下处理optim
的这个特性
提前谢谢听起来好像
optim
无法处理上下匹配。我想您可以使用已知值对函数进行参数化,并使用一些简单的ifelse
语句检查您是否应该使用optim
中传递的值或已知值:
# Slightly redefined function to optimize
fr2 <- function(opt.x, known.x) {
x <- ifelse(is.na(known.x), opt.x, known.x)
100 * (x[2] - x[1] * x[1])^2 + (1 - x[1])^2 +
100 * (x[3] - x[2] * x[2])^2 + (1 - x[2])^2 +
100 * (x[4] - x[3] * x[3])^2 + (1 - x[3])^2
}
# Optimize, and then replace the appropriate indices of the result with known vals
known.x <- c(NA, 1, NA, 1)
opt.result <- optim(par = c(0, 1, 1, 2), fr2, method = "L-BFGS-B",
lower = c(0, 0, 0, 0), upper = c(3, 3, 3, 3), known.x=known.x)
opt.result$par <- ifelse(is.na(known.x), opt.result$par, known.x)
opt.result
# $par
# [1] 0.9999995 1.0000000 0.9999996 1.0000000
#
# $value
# [1] 1.795791e-10
#
# $counts
# function gradient
# 13 13
#
# $convergence
# [1] 0
#
# $message
# [1] "CONVERGENCE: REL_REDUCTION_OF_F <= FACTR*EPSMCH"
#略微重新定义函数以优化
fr2听起来好像optim
无法处理上下匹配。我想您可以使用已知值对函数进行参数化,并使用一些简单的ifelse
语句检查您是否应该使用optim
中传递的值或已知值:
# Slightly redefined function to optimize
fr2 <- function(opt.x, known.x) {
x <- ifelse(is.na(known.x), opt.x, known.x)
100 * (x[2] - x[1] * x[1])^2 + (1 - x[1])^2 +
100 * (x[3] - x[2] * x[2])^2 + (1 - x[2])^2 +
100 * (x[4] - x[3] * x[3])^2 + (1 - x[3])^2
}
# Optimize, and then replace the appropriate indices of the result with known vals
known.x <- c(NA, 1, NA, 1)
opt.result <- optim(par = c(0, 1, 1, 2), fr2, method = "L-BFGS-B",
lower = c(0, 0, 0, 0), upper = c(3, 3, 3, 3), known.x=known.x)
opt.result$par <- ifelse(is.na(known.x), opt.result$par, known.x)
opt.result
# $par
# [1] 0.9999995 1.0000000 0.9999996 1.0000000
#
# $value
# [1] 1.795791e-10
#
# $counts
# function gradient
# 13 13
#
# $convergence
# [1] 0
#
# $message
# [1] "CONVERGENCE: REL_REDUCTION_OF_F <= FACTR*EPSMCH"
#略微重新定义函数以优化
fr2好把戏。事实上,您在optim中使用了省略号(…),它将进一步的参数传递给fn和gr。这个简单的特性使optim变得灵活。我以前没注意过,谢谢你,好把戏。事实上,您在optim中使用了省略号(…),它将进一步的参数传递给fn和gr。这个简单的特性使optim变得灵活。我以前没注意过,谢谢