我试图在optim()中使用L-BFGS-B方法来找出以下函数的最小值:
ip<-function(x) log(mean(exp(return*x))) , where "return" is a series of constants.
首先,我没有给出边界约束:rst1<-optim (-1,ip,method="L-BFGS-B")
,它提供了一个合理的答案(x=-118.44,ip.min=-0.00017)
,这可以通过理论和excel计算来证明。结果中的给定消息是
收敛:投射梯度的标准&lt; = PGTOL。
由于理论上x必须小于零,然后我向优化器添加了边界约束:rst2<-optim (-1,ip,method="L-BFGS-B",lower=-Inf,upper=0)
。但是,这次它只提供了一个由初始参数(-1)计算的答案,这显然不是最小值。结果中的给定消息是
CONVERGENCE:REL_REDUCTION_OF_F&lt; = FACTR * EPSMCH。
然后我尝试了其他边界约束,无论它们是什么,只要在这里添加边界约束,它总是提供由初始参数计算的答案,并且未能找到最小值。
有谁知道为什么会这样?非常感谢。
rtntxt&LT; - ” 返回 9.15051E-05 9.67217E-07 1.34187E-05 -0.000105801 0.000111004 0.000228786 3.84068E-06 0.000388639 -0.000122291 -7.73028E-05 4.97595E-05 -3.97503E-05 1.86449E-05 -0.000137739 -0.000180709 -1.07254E-05 3.89723E-05 “
RTN&LT; -read.table(文本= rtntxt,标题= TRUE)
ip&lt; -function(x)log(mean(exp(rtn $ return * x)))
rst1&lt; -optim(-1,ip,method =“L-BFGS-B”)#no boundary
rst2&lt; -optim(-1,ip,method =“L-BFGS-B”,lower = -Inf,upper = 0)#with boundary
x < - -10000:10000
N'LT; -length(x)的
S&LT; -numeric(n)的
for(i in 1:n)s [i]&lt; -ip(x [i])
积(X,S)
x [其中(s == min(s))]#rst1(无边界)是正确的
分(S)
答案 0 :(得分:0)
我不确定你是如何得到这样的结果的:如果我更正了拼写错误的代码,我仍会得到类似的答案,而不是你从结果中得到的答案:
ip<-function(x) log(mean(exp(return(x))))
rst1<-optim(-1,ip,method="L-BFGS-B")
# > rst1
# $`par`
# [1] -1.820444e+13
#
# $value
# [1] -1.820444e+13
#
# $counts
# function gradient
# 20 20
#
# $convergence
# [1] 0
#
# $message
# [1] "CONVERGENCE: NORM OF PROJECTED GRADIENT <= PGTOL"
#
rst2<-optim (-1,ip,method="L-BFGS-B",lower=-Inf,upper=0)
# $`par`
# [1] -1.80144e+13
#
# $value
# [1] -1.80144e+13
#
# $counts
# function gradient
# 3 3
#
# $convergence
# [1] 0
#
# $message
# [1] "CONVERGENCE: NORM OF PROJECTED GRADIENT <= PGTOL"
此外,为了检查我的代码是否存在错误,我试图将你的函数值绘制为-1:-100000,但它看起来并不存在你告诉它的优化。检查您的代码/帖子,如果您知道最佳值的大致位置,请尝试以图形方式绘制(这将是我的建议)。干杯!,
plot(x = -1:-100000, y = ip(-1:-100000))