使用constrOptim
函数进行约束优化时,我有时会收到以下错误消息:
Error in optim(theta.old, fun, gradient, control = control, method = method, :
initial value in 'vmmin' is not finite
示例
x <- c(-0.2496881061155757641767394261478330008685588836669921875,
0.0824038146359631351600683046854101121425628662109375,
0.25000000111421105675191256523248739540576934814453125)
nw <- length(x)
ui <- diag(1, nrow = nw)
ui <- rbind(ui, rep(0, nw))
ui[cbind(2:(nw + 1), 1:nw)] <- -1
ci <- rep(-0.8 / (nw + 1), nw + 1)
constrOptim(theta = rep(0, nw), f = function(theta) mean((theta - x)^2),
grad = function(theta) 2 * (theta - x), ui = ui, ci = ci,
method = "BFGS")
我所知道的
问题发生在constrOptim
内的迭代期间,当结果如此接近边界时,BFGS优化器评估的几乎所有点都是NaN
s(不包括初始点)。在这种情况下,BFGS有时会在约束集之外返回NaN的最佳值和相应的最小化参数。
在constrOptim
中,馈送给BFGS的目标函数由
R <- function(theta, theta.old, ...) {
ui.theta <- ui %*% theta
gi <- ui.theta - ci
if (any(gi < 0)) {
return(NaN)
}
gi.old <- ui %*% theta.old - ci
bar <- sum(gi.old * log(gi) - ui.theta)
if (!is.finite(bar))
bar <- -Inf
f(theta, ...) - mu * bar
}
我的问题
在我看来,问题的显而易见的解决方案是,如果有sign(mu) * Inf
,只需返回NaN
而不是gi < 0
,但这可能会导致其他问题?< / p>
答案 0 :(得分:0)
正确标准化渐变后
constrOptim(theta = rep(0, nw), f = function(theta) mean((theta - x)^2),
grad = function(theta) 2 / nw * (theta - x), ui = ui, ci = ci,
method = "BFGS")
我再也无法复制这个问题了。似乎问题是由于目标函数梯度的错误加权和内部梯度中对数屏障项的梯度造成的。
然而,我仍然认为在边界之外返回Inf会比返回NaN更强大。