【问题标题】:Questions about boundary constraints with L-BFGS-B method in optim() in R关于 R 中 optim() 中 L-BFGS-B 方法的边界约束的问题
【发布时间】:2018-11-12 07:41:03
【问题描述】:

我正在尝试在 optim() 中使用 L-BFGS-B 方法来找出以下函数的最小值:

ip<-function(x) log(mean(exp(return*x))) , where "return" is a series of constants.

首先,我没有给出边界约束:rst1&lt;-optim (-1,ip,method="L-BFGS-B"),它提供了一个合理的答案(x=-118.44,ip.min=-0.00017),这可以通过理论和excel计算来证明。结果中的给定消息是

收敛:投影梯度的范数

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

CONVERGENCE:REL_REDUCTION_OF_F

然后我尝试了其他的边界约束,不管是什么,只要在此处添加边界约束,它总是会提供由初始参数计算的答案,并且找不到最小值。

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


示例

rtntxt

rtn

ip

rst1

rst2

情节

x

n

s

for(i in 1:n) s[i]

绘图(x,s)

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

分钟

【问题讨论】:

    标签: r optimization


    【解决方案1】:

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

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

    【讨论】:

    • 非常感谢您的回答。函数“ip”中的“收益”实际上是股票超额收益的时间序列,每一个都乘以x。我修改了我的问题并添加了一些示例数据。如果您使用该返回系列,则带有边界的系列将给出错误的结果。但是,我还发现,如果您只使用示例数据中的前 10 个返回值,则带有边界的返回值将给出正确的结果(太令人困惑了!)。你能帮我检查一下吗?谢谢。
    • 你能把你的代码写在示例中吗?这样我可以检查 :) 调用某些东西返回不是一个好主意,因为可能会与函数的 return() 部分混淆。相反,将其称为“返回”
    • 感谢您的建议,我没有意识到“return”是 R 中函数的名称。好消息是我发现了哪里出了问题。很明显,当目标函数的值非常小并且设置了边界约束时,“L-BFGS-B”方法会给出错误的结果。在我将目标函数乘以 100 后,它设法找到了实际的最小值。由于R在整个过程中没有给出警告信息,所以值得关注。
    • 不错!,完美
    猜你喜欢
    • 2017-02-06
    • 2017-05-23
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    • 2015-07-20
    • 1970-01-01
    • 2021-12-18
    • 2021-09-21
    相关资源
    最近更新 更多