r - DEoptim错误: objective function result has different length than parameter matrix

标签 r optimization data.table differential-evolution

我正在尝试使用 DEoptim 命令(来自同名的 R 包)来最小化函数,但收到这个奇怪的错误“目标函数结果的长度与参数矩阵的长度不同。”除了一些我无法阅读的发布的 C 代码之外,我找不到任何有关此问题的信息。

当我尝试通过 ... 参数向函数传递其他参数时,会出现错误。在下面的示例中,我修改了 Rosenbrock 函数(取自 DEoptim 文档),使其具有第二个参数 pow (我将其设置为 2,以便该示例与文档中的示例相同)。这有效。然后我尝试对 Rastrigin 函数(来自 GenSA 文档)执行相同的操作。同样的技巧在这里失败了(但如果我在第二个参数中进行硬编码,则优化器可以正常工作,如记录的情况所示)。

这里是示例代码:

library(DEoptim)
## Note that the vector of parameters to be optimized must be the first
## argument of the objective function passed to DEoptim.
Rosenbrock <- function(x,pow){
  x1 <- x[1]
  x2 <- x[2]
  100 * (x2 - x1 * x1)^pow + (1 - x1)^pow
}

lower <- c(-10,-10)
upper <- -lower
set.seed(1234)

# works
DEoptim(Rosenbrock,pow=2, lower, upper)

Rastrigin <- function(x) {
  sum(x^2 - 10 * cos(2 * pi * x)) + 10 * length(x)
}

Rastrigin2 <- function(x,p) {
  sum(x^2 - p * cos(2 * pi * x)) + 10 * length(x)
}

dimension <- 2
lower <- rep(-5.12, dimension)
upper <- rep(5.12, dimension)

# works
DEoptim(fn=Rastrigin,lower=lower,upper=upper,
        control = list(storepopfrom = 1))

# should be same, but doesn't work
DEoptim(fn=Rastrigin2,p=10,lower=lower,upper=upper,
        control = list(storepopfrom = 1))

当然,这个问题是在一个更复杂的例子中出现的,但我希望对这个简单案例的解释可以帮助我。如果有任何其他帮助,最终目标是从 data.table 对象调用函数,其中函数的第一个参数是要最小化的(标量)参数,其余参数是获取的数据来自data.table

最佳答案

我必须更深入地寻找根本原因,但看起来您的 p 参数与优化/评估过程中某处的另一个参数部分匹配。解决方法是为该参数使用不同的名称。

require(DEoptim)
Rastrigin2 <- function(x,p.) {
  sum(x^2 - p. * cos(2 * pi * x)) + 10 * length(x)
}
lower <- rep(-5.12, 2)
upper <- -lower
de <- DEoptim(Rastrigin2, lower, upper, list(storepopfrom=1), p.=10)

我将提交错误报告。感谢您提供可重现的示例!

关于r - DEoptim错误: objective function result has different length than parameter matrix,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32638033/

相关文章:

r - 自动将 R Markdown 应用程序重定向到不同的链接

r - 在 R 中绘制 igraph 对象时控制轴标签大小

c++ - 来自 C++ 的中间代码

c# - 连接字符串的最有效方法?

r - 查找 R 时间序列中数据点的日期

r - ddply 如何将因子处理为 "split"变量?

sql-server-2008 - 如何使用 TOP 并有条件地忽略 UNION ALL?

r - 将 lapply (或任何替代方案)与 data.table 一起使用来一次生成多个列

r - 使用nls跳过数据表计算中的错误

R-创建一个新变量,其中每个观察值都依赖于另一个表和数据框中的其他变量