在向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
}与往常一样,optim可用于以下用途:
optim(par = c(0, 1, 1, 2), fr, method = "L-BFGS-B", lower = c(0, 0, 0, 0), upper = c(3, 3, 3, 3))现在,假设在一个更改lower和upper (box约束)的算法中重复这个过程,然后是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的这个特性,而无需定义许多新的函数?
提前谢谢你
发布于 2014-03-14 17:09:16
听起来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"这段代码基本上忽略了已经知道的从optim传递的索引,并且在这些情况下只使用已知的值。
https://stackoverflow.com/questions/22410975
复制相似问题