2

我在让 DEoptim 做我想做的事情时遇到了一些麻烦。我确信这主要是由于我的幼稚使用。我对差分优化的理解是,它是一种旨在避免陷入目标函数局部最小值的技术。显然,它成功的程度取决于目标函数的不规则程度。

这是我的目标函数:

N <- 10000

obj.func <- function(x) {
    set.seed(x*100000)
    #
    # Generate Monte Carlo estimate of pi
    #
    r <- sqrt(runif(N, -1, 1)**2 + runif(N, -1, 1)**2)
    #
    pi.estimate = sum(r <= 1) / N * 4
    #
    # Objective function
    #
    return((x - pi.estimate)**2)
}

这是一个相当极端的例子。我的真实应用程序有一个目标函数,它不是那么嘈杂,而是多维的。所以我想在弄清楚 DEoptim 的工作原理时,我会先玩一个玩具示例。

目标函数在下面绘制为散点图,以 0.00001 的间隔进行评估。红色是无噪声目标函数(围绕 pi 对称),蓝色虚线是噪声目标函数中实际最小值的位置,位于 x = 3.15719。

目标函数

在摆弄了 DEoptim 的选项后,我发现我得到了合理的结果

> library(DEoptim)
> set.seed(1)
> DEoptim(obj.func, lower = 2, upper = 4,
+         control = DEoptim.control(trace = 10, strategy = 6, itermax = 10000))
Iteration: 10 bestvalit: 0.000000 bestmemit:    3.105490
Iteration: 20 bestvalit: 0.000000 bestmemit:    3.130510
Iteration: 30 bestvalit: 0.000000 bestmemit:    3.130510
Iteration: 40 bestvalit: 0.000000 bestmemit:    3.148317
Iteration: 50 bestvalit: 0.000000 bestmemit:    3.148317
Iteration: 60 bestvalit: 0.000000 bestmemit:    3.151152
Iteration: 70 bestvalit: 0.000000 bestmemit:    3.151152
Iteration: 80 bestvalit: 0.000000 bestmemit:    3.151152
Iteration: 90 bestvalit: 0.000000 bestmemit:    3.151152
Iteration: 100 bestvalit: 0.000000 bestmemit:    3.158387
Iteration: 110 bestvalit: 0.000000 bestmemit:    3.158387
Iteration: 120 bestvalit: 0.000000 bestmemit:    3.158387
Iteration: 130 bestvalit: 0.000000 bestmemit:    3.158387
Iteration: 140 bestvalit: 0.000000 bestmemit:    3.158387
Iteration: 150 bestvalit: 0.000000 bestmemit:    3.158387

输出已被缩短,因为算法似乎卡在这个解决方案上。如果我让它运行到指定的迭代次数(10000),那么它仍然顽固地坐在 x = 3.158387 的结果上。此时目标函数的值为

> obj.func(3.158387)
[1] 1.69e-10

而在真正的最小值是

> obj.func(3.15719)
[1] 1e-10

所以差异真的很小,可能根本不是很重要。但是,由于这里的目标是了解 DEoptim,我想了解正在发生的事情。

我想知道的是(1)为什么DEoptim会卡在这个值上,(2)我怎样才能让它搜索更多并最终找到真正的最小值?

谢谢,安德鲁。

4

2 回答 2

0

尝试找到这样的选项:(因为我在 MATLAB 中使用实现)

F_VTR “达到的价值”(当 ofunc < F_VTR 时停止)

此选项可以设置为一个非常小的值,例如:

F_VTR = 1e-16;

然后该算法将找到全局最小值,或者您会发现它实际上已停留在局部最小值。

于 2013-08-19T13:01:48.520 回答
0

谨慎选择目标函数。

一般来说,我对您的问题了解不够,但以下步骤可以帮助优化。

  • 目标函数类型的选择会改变您的优化obj.fun值。调查您的残差(错误)并检查您的统计模型假设是否有效。
  • 看看 DEoptim.control。您可以在此处设置收敛标准和抖动/步长。
  • 检查您是否可以在优化中转换参数(在您的obj.fun
  • 不要在 obj.functions 中使用 set.seed。它只能产生可比较的错误(!)结果。
  • 对起始人口使用良好的初始猜测DEoptim()(例如,查看lhs包以进行多维优化)。
于 2014-04-13T09:55:45.183 回答