我尝试估计函数的最大对数可能性(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."
如您所见,“最佳”参数是上限和下限的混合。有谁知道我该怎么办?我是否可以从此说明中看到基本错误?
btw:我通过插入较低的上部和sart级别来测试该函数,并且为起始数组获得了更高的值,较低的一个用于上部,而较高的一个用于较低的数组。为什么它不只是将start数组作为输出? (因为该值高于实际输出)
真的会提供任何帮助..
THX
答案 0 :(得分:1)
由于你没有提供这个功能,我无法评论,但你观察到的现象很容易在一个简单的例子中看到。
考虑将f(x)= x最小化为0< = x< = 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), ]
现在使用它作为你的答案,如果你不需要太精确的东西,或者如果你想要更好的东西,那么将它作为起始值。