DEoptim陷入局部最小噪声目标函数

时间:2013-07-18 04:57:24

标签: r

我很难让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。

objective function

在摆弄了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)我怎样才能让它更多地搜索并最终找到真正的最小值?

感谢, 安德鲁。

2 个答案:

答案 0 :(得分:0)

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

F_VTR“值到达”(当ofunc&lt; F_VTR时停止)

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

F_VTR = 1e-16;

然后算法会找到全局最小值,或者你会发现它实际上已经停留在当地的mimima。

答案 1 :(得分:0)

对目标函数的选择保持警惕。

通常,我对您的问题了解不多,但以下步骤有助于优化。

  • 选择目标函数类型会改变您的优化obj.fun值。调查你的 残差(误差)并检查您的统计模型假设是否有效。
  • 看看DEoptim.control。在这里,您可以设置收敛标准,以及抖动/步长。
  • 检查您是否可以转换优化中的参数(在obj.fun
  • 中重新转换它们
  • 不要在obj.functions中使用set.seed。它只能产生类似的错误(!)结果。
  • DEoptim()中的起始人群使用良好的初步猜测(例如,查看lhs包进行多维优化)。