2013-07-18 36 views
2

我有点麻烦让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。

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 

这样的差别是非常小的,可能不是很重要的。但是,由于这里的目标是了解DEOPTI,我想了解发生了什么。

我想知道的是(1)为什么DEoptim被卡在这个值,以及(2)我如何让它搜索更多并最终找到真正的最小值?

谢谢, andrew。

+2

你可能不希望重置你优化函数内部的种子参见[这里](HTTP。: //www.stackoverflow.com/a/17382072/474349)举个例子,在Monte Carlo实验中重置种子使得事情变成wr翁。 –

+0

另外,你使用了什么'N'的值? –

+0

我正在使用N = 10000.更新原始问题以反映此问题。我同意:重置函数内的种子可能不是一个好主意(它肯定会影响函数返回的值的独立性),但在此用于确保可重复性。然而,我并不真正担心MC模拟的结果是否给了我pi的正确答案。我更关心的是为什么DE实际上并没有找到绝对的最小值。 – DataWookie

回答

0

试图找到这样一个选项:(因为我使用MATLAB实现)

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

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

F_VTR = 1e-16; 

然后算法会找到全局最小值,否则您将发现它实际上已经停留在本地mimima。

0

请谨慎选择目标函数。

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

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