【问题标题】:optim function with infinite value具有无限值的优化函数
【发布时间】:2017-07-18 16:01:08
【问题描述】:

为了最小化一个关于 3 个参数的函数,我使用了 optim 函数和“L-BFGS-B”方法。 这是错误消息:

优化错误(c(3, 0.01, 0.75), fn = f, lower = c(0.6, 0.0001, 0.1), : L-BFGS-B 需要 'fn' 的有限值

当三个参数中的至少一个到达“边界”(即下限值或上限值)时,我已经检查了函数的值,但它从未给出无限值。

如何知道优化函数中哪些值给出了无限值?

【问题讨论】:

    标签: r optimization


    【解决方案1】:

    一种快速而肮脏的方法是包装你的函数并打印出传递给它的参数。这是执行此操作的示例会话。

    f <- function(par, data){
        if(0.1 < par & par < .9){
            return(Inf)
        }else{
            sqrt(abs(par))
        }
    }
    

    并使用 optim 调用它...

    > optim(2, f, method = "L-BFGS-B", lower = -1)
    Error in optim(2, f, method = "L-BFGS-B", lower = -1) : 
      L-BFGS-B needs finite values of 'fn'
    

    现在包装代码...

    wrap_f <- function(par, ...){
        cat(par, "\n")
        f(par, ...)
    }
    

    现在我们可以看到叫什么了...

    > optim(2, wrap_f, method = "L-BFGS-B", lower = -1)
    2 
    2.001 
    1.999 
    1.646447 
    1.647447 
    1.645447 
    1.256777 
    1.257777 
    1.255777 
    -0.3018999 
    -0.3008999 
    -0.3028999 
    0.7441084 
    Error in optim(2, wrap_f, method = "L-BFGS-B", lower = -1) : 
      L-BFGS-B needs finite values of 'fn'
    

    所以在这个例子中,它最终试图评估 .7441084,它给出了函数定义方式的错误。

    【讨论】:

    • 问题实际上是寻找对数似然函数的定义域本身似乎是一种优化问题。真正给我带来问题的是这些下限和上限只允许“平方”定义域(这里它给出一个“立方体”,因为有 3 个维度),因此,迫使我真正了解参数的可能性。
    • 那你真的需要使用L-BFGS-B吗?您能否使用不将空间限制为立方体的其他优化技术?
    • 不,我真的不需要使用这种技术,但它似乎是最适合似然函数的技术。您还建议我使用哪些其他技术?
    • 试试其他一些吧
    猜你喜欢
    • 2019-04-15
    • 1970-01-01
    • 1970-01-01
    • 2016-05-08
    • 2015-04-22
    • 2015-07-20
    • 1970-01-01
    • 2011-10-03
    • 2021-10-14
    相关资源
    最近更新 更多