在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)的完全不同的输出。有没有人知道为什么会这样呢?
答案 0 :(得分:6)
在这种情况下,您的目标函数具有无限多个最佳点(不一定只是不同的局部最大值)。其中一个参数为零0 0与参数接近0的任何其他点一样好。我不确定您是否期望(0,0),但(0,34)具有相同的值并且也可以被认为是最佳的。
答案 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==0
或y==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)
这显示从初始条件(左侧)到功能零点(右侧)的直线。请注意,优化并不遵循直线,但这表明可以实现完全不同的结果。