【问题标题】:How do I pass constant parameters through an optimization function that calls another function in R?如何通过调用 R 中另一个函数的优化函数传递常量参数?
【发布时间】:2017-01-06 01:41:45
【问题描述】:

我正在尝试最小化一个在概念上类似于此的函数:

minim<-function(a,b,state){
if(state=="TRUE"){out<-2*a^2+b}else{out<-2*a^3-b}
return(out) }

我正在这样调用 GenSA(我希望只优化 ab 而不是优化 state):

upper_limits<-c(10,10)
lower_limits<-c(-10,-10)
params<-c(1,1)

minim<-function(a,b,state){
  if(state=="TRUE"){out<-2*a^2+b}else{out<-2*a^3-b}
  return(out)
  }

minim_state_TRUE_fit<-GenSA(par=params,function(params) minim(params[1],params[2]), 
                      lower=lower_limits, upper=upper_limits, 
                      control=list(max.time=100),state="TRUE")

我得到的错误是:

Error in fn(par, ...) : unused argument (state = "TRUE")

GenSA 应该能够接受将传递给被调用函数的附加参数。由于某种原因,state="TRUE" 似乎没有传递给minim。我编码不正确吗?我找不到GenSA 使用的示例,其中使用附加参数来检查我的 R 语法。

【问题讨论】:

  • 请注意,如果调用构造正确,则将状态设置为“TRUE”意味着它应该未通过stat=="True"的测试
  • 啊,好点子。我已在示例代码中修复了该错误。

标签: r function optimization parameter-passing


【解决方案1】:

如果您想将命名参数传递给函数,您需要提供形式参数来接受它们,因此在 fn 参数定义和 minim 调用中添加“点”:

minim_state_TRUE_fit<-GenSA(par=params,fn=function(params, ...) {     
                                                minim(params[1],params[2], ...) }, 
                            lower=lower_limits, upper=upper_limits, 
                            control=list(max.time=100), state="TRUE")

【讨论】:

    【解决方案2】:

    您正在优化函数function(params) minim(params[1],params[2])。此函数不包含参数state。你可以这样解决这个问题:

    minim <- function(a, b, state) {
      if (state) {
        out <- 2 * a^2 + b
      } else {
        out<-2 * a^3 - b
      }
      return(out)
    }
    
    fn = function(params, state) minim(params[1],params[2], state)
    
    minim_state_TRUE_fit<-GenSA(par=params,fn = fn, 
                                lower=lower_limits, upper=upper_limits, 
                                control=list(max.time=100), state = TRUE)
    

    另请注意,我将state = "TRUE" 更改为state = TRUE。如果您将其用于逻辑测试,最好尽可能将其更改为逻辑测试。

    【讨论】:

      猜你喜欢
      • 2014-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-23
      相关资源
      最近更新 更多