Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 当某些参数已知时,如何处理optim?_R_Mathematical Optimization - Fatal编程技术网

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变得灵活。我以前没注意过,谢谢