R optim实现中的布伦特方法总是返回相同的局部最小值

时间:2015-06-21 16:35:33

标签: r optimization

Function to be minimised

我正在尝试最小化上面显示的功能。我在(-1,1)之间搜索。我使用以下代码

optim(runif(1,min=-1,max=+1), ..., method = "Brent", lower = -1.0, upper = 1.0)

我注意到它总是返回x = -0.73的值,而不是正确的x = 0.88答案。原因在optimise帮助页面中提供:

  

f的第一次评估总是在x_1 = a +(1-φ)(ba),其中(a,b)=(下,上)和phi =(sqrt(5)-1)/ 2 = 0.61803 ..是黄金分割比率。几乎总是,第二次评估是在x_2 = a + phi(b-a)。请注意,[x_1,x_2]内的局部最小值将被视为解,即使f在那里是常数,请参见最后一个示例。

我很好奇是否有任何方式使用布伦特的方法,而不是每次都达到相同的局部最小值。

将方法更改为“L-BFGS-B”效果更好(每次返回一个随机的局部最小值):

optim(runif(1,min=-1,max=+1), ..., method = "L-BFGS-B", lower = -1.0, upper = 1.0)

1 个答案:

答案 0 :(得分:5)

您的函数不是凸的,因此您将具有多个局部/全局最小值或最大值。对于您的函数,我将运行非传统/衍生自由全局优化器,如模拟退火或遗传算法,并使用输出作为BFGS或任何其他本地优化器的起点,以获得精确的解决方案。多次重复上述步骤,您将找到所有全局和局部最佳点。