首页 > 解决方案 > 关于 R 中 optim() 中 L-BFGS-B 方法的边界约束的问题

问题描述

我试图在 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计算来证明。结果中的给定消息是

收敛:投影梯度的范数 <= PGTOL。

由于理论上 x 必须小于零,因此我向优化器添加了边界约束:rst2<-optim (-1,ip,method="L-BFGS-B",lower=-Inf,upper=0). 但是,这一次它只提供了一个由初始参数(-1)计算得到的答案,这显然不是最小值。结果中的给定消息是

收敛:REL_REDUCTION_OF_F <= FACTR*EPSMCH。

然后我又尝试了其他的边界约束,不管是什么,只要在这里加上边界约束,总是会给出一个由初始参数计算得到的答案,并且找不到最小值。

有谁知道为什么会这样?非常感谢。


例子

rtntxt<-" return 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<-read.table(text=rtntxt,header=TRUE)

ip<-function(x) log(mean(exp(rtn$return*x)))

rst1<-optim(-1,ip,method="L-BFGS-B") #无边界

rst2<-optim(-1,ip,method="L-BFGS-B",lower=-Inf,upper=0) #带边界

阴谋

x<- -10000:10000

n<-长度(x)

s<-数字(n)

for(i in 1:n) s[i]<-ip(x[i])

情节(x,s)

x[which(s==min(s))] #rst1(无边界)是正确的

分钟)

标签: roptimization

解决方案


我不确定你是如何得到这个结果的:如果我更正你的代码拼写错误,我仍然会得到类似的答案,而不是你从结果中得到的答案:

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))

推荐阅读