【问题标题】:R optim, can I pass a list to parameter :par?R optim,我可以将列表传递给参数:par 吗?
【发布时间】:2019-12-31 16:01:32
【问题描述】:

问题:

我正在使用optim 来优化我的功能。但是,我的函数有 2 个参数,第一个是标量,第二个是动态长度向量。

我用列表初始化参数,然后传递给optim 函数。引发如下错误,看来par in optim 只能得到一个vactor 输入?由于我的第二个参数具有动态长度,因此很难使用参数向量然后用y <- para_vector[slice] 切片将它们传递给y

例如:

# I dont know the length of second elements
para <- c(1,3,2, ... ,283)
x <- para[1]
# I can't slice the vector and pass value to y
y <- para[2:?]

代码:

obj <- function(para){
  ### input:
  ### para is a list with 2 elements.first element is scalar, second element is vector 

  # x is a scalar, stored in the first position of para list
  x <- para[[1]]
  # y is a vector with unfixed length, so I store it in the second element in a list
  y <- para[[2]] 

  value <- x^2 + sum(y^2)
  return(value)
}

para_initial = list(1,c(0,1))

optim(par = list(1,c(0,1)),fn = obj)

输出:

优化错误(par = list(1, c(0, 1)), fn = obj): (list) 对象不能被强制输入'double'

【问题讨论】:

  • 不,你不能做你想做的事。传递给optim 的函数只能采用固定长度的向量。
  • @Bhas 当我们修复para_initial时,函数参数的长度与para_initial相同,所以optim可以对其执行。我认为一定有办法解决这个问题,否则为什么lm 可以很好地处理动态数据框?
  • 你不能简单地说par = unlist(para_initial)吗?
  • 矢量参数失败,因为第二个元素的长度是动态的。如果你能做到这一点,你能给出一个代码示例吗? @HansW。

标签: r


【解决方案1】:

您将不得不更改您的目标函数,因为正如 Bhas 所说,优化求解器需要将参数作为向量。如果难以更改obj() 函数,您可以为其编写一个包装器,将输入向量拆分为一个列表。

obj_wrap <- function(x) {
    obj(list(x[1], x[2:length(x)]))  ## CORRECTED
}

现在通过将optim 应用于此函数来解决它。

para_initial = list(1,c(0,1))

optim(unlist(para_initial), fn = obj_wrap)
## $par
[1]  4.575264e-05  1.710995e-05 -5.172657e-05
## ...

这看起来有点笨拙,但有可能并给出正确的结果..

【讨论】:

  • 不应该x[2,length(x)] 只是x[-1]
  • x[2:length(x)]?
猜你喜欢
  • 1970-01-01
  • 2013-01-05
  • 1970-01-01
  • 2016-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-26
  • 1970-01-01
相关资源
最近更新 更多