首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当一些参数被知道时,如何处理optim?

当一些参数被知道时,如何处理optim?
EN

Stack Overflow用户
提问于 2014-03-14 16:42:54
回答 1查看 2.9K关注 0票数 1

在向optim传递参数时,我遇到了一个问题。假设我想对一个多元函数进行框约束最小化,例如

代码语言:javascript
复制
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可用于以下用途:

代码语言:javascript
复制
optim(par = c(0, 1, 1, 2), fr, method = "L-BFGS-B", lower = c(0, 0, 0, 0), upper = c(3, 3, 3, 3))

现在,假设在一个更改lowerupper (box约束)的算法中重复这个过程,然后是par,这样在一些迭代中,参数的一个、两个或三个值就知道了,例如x1 = 1。在本例中,我希望optim通过将x1的初始值、下限和上限设置为1来处理这个问题:

代码语言:javascript
复制
optim(par = c(1, 1, 1, 2), fr, method = "L-BFGS-B", lower = c(1, 0, 0, 0), upper =    c(1, 3, 3, 3))

但是通过运行这一行,我得到了一个错误:

代码语言:javascript
复制
Error in optim(par = c(1, 1, 1, 2), fr, method = "L-BFGS-B", lower = c(1,  : non-finite finite-difference value [1]

现在的问题是,当一个或一些参数被知道时,我如何处理optim的这个特性,而无需定义许多新的函数?

提前谢谢你

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-14 17:09:16

听起来optim无法处理上下匹配。我认为您可以用已知值参数化您的函数,并使用一些简单的ifelse语句来检查您是使用来自optim的传递值还是使用已知值:

代码语言:javascript
复制
# 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传递的索引,并且在这些情况下只使用已知的值。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22410975

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档