我很难让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)我怎样才能让它更多地搜索并最终找到真正的最小值?
感谢, 安德鲁。
答案 0 :(得分:0)
尝试找到这样的选项:(因为我在MATLAB中使用实现)
F_VTR“值到达”(当ofunc&lt; F_VTR时停止)
此选项可以设置为非常小的值,例如:
F_VTR = 1e-16;
然后算法会找到全局最小值,或者你会发现它实际上已经停留在当地的mimima。
答案 1 :(得分:0)
对目标函数的选择保持警惕。
通常,我对您的问题了解不多,但以下步骤有助于优化。
obj.fun
值。调查你的
残差(误差)并检查您的统计模型假设是否有效。obj.fun
DEoptim()
中的起始人群使用良好的初步猜测(例如,查看lhs
包进行多维优化)。