我在让 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)我怎样才能让它搜索更多并最终找到真正的最小值?
谢谢,安德鲁。