首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将固定参数和可变参数传递给最优

将固定参数和可变参数传递给最优
EN

Stack Overflow用户
提问于 2014-06-13 16:28:27
回答 2查看 2.4K关注 0票数 5

这是一个语法问题,并且可能有一个简单的解决方案,但是我发现它在任何地方都没有涉及到,所以对于optimx包来说。

最小工作实例与问题

我的职责是:

代码语言:javascript
复制
ToOptimise = function(a,b,d,e){
(a-1)^2 + (b-2)^2 + (d-3)^2 +(e-4)^2
}

我可以很容易地在mle2中优化选择参数:

代码语言:javascript
复制
library(bbmle)

Calib2 = mle2(ToOptimise,
              start = list(a = 1, d = 10),
              fixed = list(b = 2, e = 2))

这并不是真正正确的工具,因为它不是一个最大的可能性问题。

我想找到一种将固定的、可优化的参数传递给的方法

我计划做几次校准,保持不同的参数在任何时候固定,所以不想重新做函数硬编码在某些参数。

我的尝试不起作用

代码语言:javascript
复制
library(optimx)

ToOptimiseVector = function(Theta){
  a = Theta[1]
  b = Theta[2]
  d = Theta[3]
  e = Theta[4]
  (a-1)^2 + (b-2)^2 + (d-3)^2 +(e-4)^2
}


Calib1  = optimx( par = c(1,2,1,2),
                  fn = ToOptimiseVector,
                  Theta[2] = 2, Theta[4] = 2)

关于堆栈溢出的另一个相关问题

另一个不考虑固定和可优化参数的优化语法问题是:

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-13 17:19:48

opt添加了一个fn参数。只需将这个opt向量传递到optimx()。任何非NA值都将变为固定值。

代码语言:javascript
复制
ToOptimiseVector <- function(Theta, opt = rep(NA, 4)){

# Check if any of opt is not NA
if (any(!sapply(opt, is.na))) {
     i = !sapply(opt, is.na)
# Fix non-NA values
     Theta[i] <- opt[i]
     }

a <- Theta[1]
b <- Theta[2]
d <- Theta[3]
e <- Theta[4]
return((a-1)^2 + (b-2)^2 + (d-3)^2 +(e-4)^2)
}

似乎很管用。

代码语言:javascript
复制
Calib1  = optimx( par = c(1,2,1,2), fn = ToOptimiseVector, opt = c(NA, 2, NA, 2))

Calib2  = optimx( par = c(1,2,1,2), fn = ToOptimiseVector)

> Calib1
               p1       p2      p3       p4 value fevals gevals niter convcode kkt1  kkt2 xtimes
Nelder-Mead 0.9998974 5.517528 3.00022 10.83214     4    103     NA    NA        0 TRUE FALSE   0.02
BFGS        1.0000000 4.000000 3.00000  8.00000     4      6      3    NA        0 TRUE FALSE   0.00
> Calib2
              p1       p2     p3       p4        value fevals gevals niter convcode  kkt1 kkt2 xtimes
Nelder-Mead 1.000936 1.999793 3.0006 4.000256 1.344336e-06    227     NA    NA        0 FALSE TRUE   0.01
BFGS        1.000000 2.000000 3.0000 4.000000 3.566556e-23     16      3    NA        0  TRUE TRUE   0.00
票数 4
EN

Stack Overflow用户

发布于 2014-06-13 17:12:23

诀窍是,要优化的函数的起始参数和参数必须对齐。请看下面的内容是否对你有帮助。

代码语言:javascript
复制
library(optimx)

ToOptimiseVector <- function(Theta){
  a <- Theta[1]
  b <- Theta[2]
  d <- Theta[3]
  e <- Theta[4]
  (a-1)^2 + (b-2)^2 + (d-3)^2 +(e-4)^2
}


start <- c(1,0,1,1)
start <- c(1,0,0,0)
start <- c(1,2,1,2)

Calib1  <- optimx( par=start,
                  fn = ToOptimiseVector)

这会给出警告信息,但您确实得到了结果。

代码语言:javascript
复制
 > Calib1
            p1 p2 p3 p4 value fevals gevals niter convcode kkt1 kkt2
Nelder-Mead  1  2  3  4     0      4      4    NA        0 TRUE TRUE
BFGS         1  2  3  4     0      4      4    NA        0 TRUE TRUE
            xtimes
Nelder-Mead      0
BFGS             0

希望你能从这个开始,然后继续。

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

https://stackoverflow.com/questions/24209922

复制
相关文章

相似问题

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