【问题标题】:Optimization by bobyqa lower and upper bound mix as output通过 bobyqa 下限和上限混合作为输出进行优化
【发布时间】:2014-09-05 19:26:02
【问题描述】:

我尝试估计函数 (f(x)) 的最大对数似然。很抱歉,我无法发布整个功能,因为它很长而且很痛苦。目标是根据 x 优化函数,其中 x 是一个类似 x = c(x[1],..,x[7]) 的数组,此外内部还有几个带有不同参数的循环。但是我通过使用几个输入参数来测试这个函数,它似乎工作正常。 (没有错误等)

最大化我使用的功能:

library('nloptr')
bobyqa(c(0.3, 0.3, 1,70, 0.005, 0.02,70), Log.Likelihoodsum, lower = c(0.01, 0.01, 1,4, 0.001, 0.001,4), upper = c(0.6, 0.6, 1,90, 0.01, 0.1,90),control = list(xtol_rel = 1e-7))

问题出现在输出中:

> bobyqa(c(0.3, 0.3, 1,70, 0.005, 0.02,70), Log.Likelihoodsum, lower = c(0.01, 0.01, 1,4, 0.001, 0.001,4), upper = c(0.6, 0.6, 1,90, 0.01, 0.1,90),control = list(xtol_rel = 1e-7)) #Function explodes for some values, i.e. 1000 oder mu oder sigma..
$par
[1] 0.600 0.600 1.000 4.000 0.001 0.100 4.000

$value
[1] 1.210564

$iter
[1] 113

$convergence
[1] 4

$message
[1] "NLOPT_XTOL_REACHED: Optimization stopped because xtol_rel or xtol_abs (above) was reached."

如您所见,“最佳”参数是上限和下限的混合。有谁知道我该如何进行?我是否犯了一个你可以从这个描述中看到的根本错误?

顺便说一句:我通过插入较低的上层和 sart 级别来测试该函数,并为起始数组设置一个更高的值,一个较低的值用于上层,一个较高的值用于下层数组。为什么它不只是给我起始数组作为输出? (由于数值高于实际输出)

真的很感激任何帮助..

谢谢

【问题讨论】:

    标签: arrays windows r output


    【解决方案1】:

    由于您没有提供该功能,我无法对此发表评论,但您观察到的现象可以在一个简单的示例中轻松看出。

    考虑在 0

    > for(lower in c(0, -1, -100)) 
    +   print(bobyqa(1, identity, lower = lower, upper = 1)$par)
    [1] 0
    [1] -1
    [1] -100
    

    已添加

    请注意,1 是第三个参数的下限和上限。算法可能无法处理。尝试从参数中删除它并在函数本身中将其设置为 1。

    要做的另一件事是创建一个网格并评估每个点的目标。删除刚才讨论的第三个参数创建一个网格g 并在每个点评估目标函数f。我们假设目标函数的形式为 f(x),其中 x 是 6 个参数的向量。

    lower <- c(0.01, 0.01, 4, 0.001, 0.001,4)
    upper <- c(0.6, 0.6, 90, 0.01, 0.1,90)
    
    # pick 5 values of each parameter from lower to upper
    m <- mapply(seq, lower, upper, MoreArgs = list(length = 5), SIMPLIFY = FALSE)
    g <- do.call(expand.grid, m)  # g will have 5^6 rows & 6 cols
    v <- apply(g, 1, f)
    g[which.min(v), ]
    

    现在,如果您不需要太精确的东西或者想要更好的东西,现在就用它作为您的答案,然后用它作为起始值。

    【讨论】:

    • 正如我所写,起始值已经提供了比下界更大的值。输出是下限和上限的混合。通过仅使用下限或上限,我得到“更好”的值。代码太长了,我不认为有人愿意通过它。
    • 起点并非不可行,你为什么这么认为?由于起点是局部最小值,并且由于该局部最小值大于/小于找到的参数,所以我不明白为什么算法没有给我返回起始值。有机会私下联系吗? (我特别想寻求帮助(不是免费的))
    • 我尝试了不同的算法和不同的凝视值,但结果并没有太大变化(有时我得到 20.0000232 而不是 20 作为起始值)如果有人可以通过代码,我会很高兴。 (可能需要 3-4 个小时)我愿意给 30 个一小时。 thx(outlook dot com 上的 rhelpthesis)
    • 我已经添加了一些额外的东西让你在答案中尝试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-27
    • 2017-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多