为什么optim()的结果取决于初始值?

时间:2014-05-22 01:26:43

标签: r mathematical-optimization

在R中,我使用函数optim()来查找两个变量的目标函数的最小值。我正在使用的真正目标函数非常复杂,所以我试着熟悉一个更简单的目标函数。运行optim()的最简单方法是optim(par,function),其中par是算法初始值的向量。我发现我得到的答案在很大程度上取决于我输入的初始值。但是,我使用的功能非常简单,我担心我误解了optim()的输入或输出。

我使用的目标函数是:

f <- function(x){
    abs(x[1])*abs(x[2])
}

当我运行optim(c(-1.2,1),f)optim(c(-1.2,10),f)时,我得到了最佳参数(par)和最小值(value)的完全不同的输出。有没有人知道为什么会这样呢?

2 个答案:

答案 0 :(得分:6)

在这种情况下,您的目标函数具有无限多个最佳点(不一定只是不同的局部最大值)。其中一个参数为零0 0与参数接近0的任何其他点一样好。我不确定您是否期望(0,0),但(0,34)具有相同的值并且也可以被认为是最佳的。

objective function

答案 1 :(得分:1)

相关功能是:

g <- function(x, y) abs(x)*abs(y)

我们可以使用contour可视化图表的级别,并绘制给定的点:

根据您的初始和最终条件(从运行optim注明)的合理字段:

x <- seq(-1.5, 0, by=.1)
y <- seq(0, 11, by=1)

g中的值矩阵:

m <- outer(x, y, g)

绘制结果,包括optim的结果。请注意,x==0y==0的值是最佳值。

contour(x, y, m)
o1 <- optim(c(-1.2,1),f)$par
o2 <- optim(c(-1.2,10),f)$par
segments(-1.2, 1, o1[1], o1[2], col='red')
segments(-1.2, 10, o2[1], o2[2], col='red')
# Add zero lines as contour does not draw them
segments(0, 11, 0, 0)
segments(-1.5, 0, 0, 0)

这显示从初始条件(左侧)到功能零点(右侧)的直线。请注意,优化并不遵循直线,但这表明可以实现完全不同的结果。

enter image description here