R

时间:2018-06-02 09:59:18

标签: r optimization

我试图在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)

1 个答案:

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