Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过扭曲参数空间处理Nelder-Mead优化中的框约束_R_Algorithm_Nonlinear Optimization_Heuristics - Fatal编程技术网

通过扭曲参数空间处理Nelder-Mead优化中的框约束

通过扭曲参数空间处理Nelder-Mead优化中的框约束,r,algorithm,nonlinear-optimization,heuristics,R,Algorithm,Nonlinear Optimization,Heuristics,我有一个关于Nelder-Mead算法1的具体实现的问题,该算法以一种不寻常的方式处理长方体约束。我在25篇论文、4篇教科书或互联网上找不到关于它的任何信息 我有一个典型的优化问题:带框约束的minfx-0.25这个问题与optimx无关,optimx只是提供无约束优化的R包的包装器 所讨论的函数是dfoptim包中用于无梯度优化例程的nmkb。将有界区域转换为无界空间的方法是一种常见的方法,可以应用于许多不同的转换函数,有时取决于边界的类型和/或目标函数的类型。它也可用于,例如,将无界积分域转

我有一个关于Nelder-Mead算法1的具体实现的问题,该算法以一种不寻常的方式处理长方体约束。我在25篇论文、4篇教科书或互联网上找不到关于它的任何信息


我有一个典型的优化问题:带框约束的minfx-0.25这个问题与optimx无关,optimx只是提供无约束优化的R包的包装器

所讨论的函数是dfoptim包中用于无梯度优化例程的nmkb。将有界区域转换为无界空间的方法是一种常见的方法,可以应用于许多不同的转换函数,有时取决于边界的类型和/或目标函数的类型。它也可用于,例如,将无界积分域转换为有界积分域

如果最优值位于边界,则该方法存在问题,因为最优点将被发送到几乎无限远的位置,并且最终无法到达。例程将不会收敛,或者解决方案非常不准确

如果您认为算法不能正常工作,您应该写信给该软件包的作者,并且——这很重要——为您认为的错误或不正确的解决方案添加一两个示例。如果没有明确的代码示例,这里没有人能够帮助您

1这些变换定义了有界和无界区域之间的双射映射,这种方法背后的理论是显而易见的。你可以在多元微积分的书中读到可能的变换

2惩罚在边界之外的方法有其自身的缺点,例如目标函数在边界处不平滑,BFGS方法可能不再合适

3您可以通过同一dfoptim包中的函数hjkb尝试Hooke-Jeeves算法。它会更慢,但使用不同的方法处理边界,不涉及转换

与Erwin Kalvelagen讨论后进行编辑

在某些坐标为负的情况下,似乎存在局部极小值。 如果将下限设置为0,nmkb将在任何情况下找到全局最小值1,1,1,1,1。
注意:起始值必须是可行的,即它们的坐标都大于0。

谢谢Hans。我将看一看hjkb。请原谅我的吹毛求疵,但正如我在脚注中所说的,我知道nmkb来自dfoptim包。我这里有一段代码,这是我如何意识到它使用单纯形大小作为终止标准的,当我扭曲空间时,这肯定是有问题的。你有这方面的经验吗?我能想到的唯一解决办法是重新编写simplex size语句,即在计算simplex size之前进入正常空间。@Jan Me和其他许多人已经成功地使用了nmkb。只有当最优值接近边界时,单纯形的大小才起作用!,这是一个以某种方式被“扭曲”的区域。如果您对这种方法有问题,我们需要您提供一些示例和代码,否则无法提供帮助。非常感谢@Hans花时间。与某人讨论会有帮助。我在问题上加了一个例子。出于某种原因,受约束的版本在收敛方面有更多的困难。当您删除set.seed并运行它时,您可以看到它多次失败。它不依赖于边界的宽度。我还尝试了不对称边界。我发现终止循环的不是simplex.size。“那就没什么意义了。”简,我用pracma中的Nelder Mead实现检查了你的例子,在慢板中使用了显式转换超限。在每种情况下,结果均为1,最大偏差为1e-16。因此,nmkb中似乎存在一些错误。我绝对建议您向dfoptim包的维护人员发送一份错误报告!它可能是转换后的局部最优。很可能是。我的观点是,无约束算法在寻找全局最优解时没有任何困难。添加约束会带来麻烦。在与@Hans W的讨论中,他提出算法用于将有界空间膨胀为无界空间的空间失真。当最优值接近边界时,这会给我带来麻烦。但事实似乎并非如此。现在我在寻找灵感,因为现在,我不知道如何解决这个问题。有什么原因吗?或者我只是忽略了什么?@ErwinKalvelagen没有,Rosenbrock在那里没有局部最优。正如我在下面指出的,使用Nelder Mead的另一个实现,解决方案非常完美。这是nmkb中的一种缺陷,我建议通知dfoptim包的维护人员。应用转换后它仍然是凸的吗?@ErwinKalvelagen谢谢,这是一个很好的提示。Rosenbrock在平面上不是凸的 更高的维度和上面奇怪的点似乎是一个局部极小值——不仅是转换的,而且是真实函数RosbkText。optim也和其他人在这一点上停了下来。因此,它可能不是Nelder Mead实现中的一个bug。
rosbkext <- function(x) {
  # Extended Rosenbrock function
  n <- length(x)
  sum (100*(x[1:(n-1)]^2 - x[2:n])^2 + (x[1:(n-1)] - 1)^2)
}

np <- 6 #12
for (box in c(2, 4, 12, 24, 32, 64, 128)) {
  set.seed(123)
  p0 <- rnorm(np)
  p0[p0 > +2] <- +2 - 1E-8
  p0[p0 < -2] <- -2 + 1E-8

  ctrl <- list(maxfeval = 5E4, tol = 1E-8)
  o <- nmkb(fn = rosbkext, par = p0, lower = -box, upper = +box, control = ctrl)
  print(o$message)
  cat("f(", format(o$par, digits = 2), ") =", format(o$value, digits=3), "\n")
}
[1] "Successful convergence"
f( -0.99  0.98  0.97  0.95  0.90  0.81 ) = 3.97 
[1] "Successful convergence"
f( 1 1 1 1 1 1 ) = 4.42e-09 
[1] "Successful convergence"
f( -0.99  0.98  0.97  0.95  0.90  0.81 ) = 3.97 
[1] "Successful convergence"
f( 1 1 1 1 1 1 ) = 1.3e-08 
[1] "Successful convergence"
f( 1 1 1 1 1 1 ) = 4.22e-09 
[1] "Successful convergence"
f( 1 1 1 1 1 1 ) = 8.22e-09 
[1] "Successful convergence"
f( -0.99  0.98  0.97  0.95  0.90  0.81 ) = 3.97