R 为什么optim()的结果依赖于初始值?

R 为什么optim()的结果依赖于初始值?,r,mathematical-optimization,R,Mathematical Optimization,在R中,我使用函数optim()来寻找两个变量的目标函数的最小值。我使用的真正的目标函数非常复杂,所以我试着熟悉一个更简单的目标函数。运行最佳()的最简单的方法是OpTIM(Par,函数),其中PAR是算法的初始值的向量。我发现我得到的答案很大程度上取决于我输入的初始值。然而,我使用的函数非常简单,我担心我误解了optim()的输入或输出 我使用的目标函数是: f <- function(x){ abs(x[1])*abs(x[2]) } f在这种情况下,目标函数有无限多个最优点

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

我使用的目标函数是:

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

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


相关功能是:

g <- function(x, y) abs(x)*abs(y)
g
中的值矩阵:

m <- outer(x, y, g)
这显示了从初始条件(左侧)到函数零点(右侧)的直线。请注意,优化并不遵循直线,但这表明将获得完全不同的结果是合理的


这个简短的答案是因为
optim
试图通过在某个方向上改变参数来找到函数的局部最大值和最小值。这不是很令人鼓舞。我正在使用的目标函数没有表现得很好。是否有一个我可以少担心的函数?您可以尝试通过
optim()
中的
method=“SANN”
进行随机全局优化,或者搜索“全局”将为您提供更多选项。但是,请注意:全局优化通常并不容易,您通常需要花费一些时间根据特定情况调整算法。但在这种情况下,您的函数也有无限多个优化点。两个参数中任何一个为0时,该值均为0。那么谁能说
(0,0)
处的零比
(0,3.4)
@MrFlick处的零更好呢。我的评论很好地回答了一些问题,但不是对这个问题。(你应该画一张目标函数曲面的图片,并将其作为答案发布…)很好。我考虑添加一个3d绘图来显示这一点,但热图方法可能要简单得多。
m <- outer(x, y, g)
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)