我有点麻烦让DEoptim做我想做的事。我相信这主要是由于我的天真使用。我对微分优化的理解是,它是一种旨在避免陷入目标函数局部极小值的技术。显然它的成功程度取决于目标函数的多么不规范。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
这样的差别是非常小的,可能不是很重要的。但是,由于这里的目标是了解DEOPTI,我想了解发生了什么。
我想知道的是(1)为什么DEoptim被卡在这个值,以及(2)我如何让它搜索更多并最终找到真正的最小值?
谢谢, andrew。
你可能不希望重置你优化函数内部的种子参见[这里](HTTP。: //www.stackoverflow.com/a/17382072/474349)举个例子,在Monte Carlo实验中重置种子使得事情变成wr翁。 –
另外,你使用了什么'N'的值? –
我正在使用N = 10000.更新原始问题以反映此问题。我同意:重置函数内的种子可能不是一个好主意(它肯定会影响函数返回的值的独立性),但在此用于确保可重复性。然而,我并不真正担心MC模拟的结果是否给了我pi的正确答案。我更关心的是为什么DE实际上并没有找到绝对的最小值。 – DataWookie