我正在研究一个有约束的优化问题。我有许多变量的总和必须为 100。我已经关注了这里的工作为什么 R 中的 optimx 没有为这个简单的非参数似然最大化提供正确的解决方案?并试图优化梯度的范数,如图所示。我的功能相对良好,规范看起来像这样:
grad.norm <- function(x) {
lambda <- tail(x, 1)
p <- head(x, -1)
h2 <- sum(((test.betas * 81)/p + lambda)^2) +
(sum(p) - 100)^2
}
我有 81 修饰符,因为 ln(p) 在我的原始方程中出现了 81 次。当我使用此代码进行优化时,似乎无论我在哪里设置 lambda,我都会得到不遵守 sum(p) = 100 的约束的输出。
这是与我实际观察到的相似的 test.betas 的可重现版本(如下)。请注意,在输出中 lambda 甚至没有接近它的界限,所以我认为这不是问题所在。
library(optimx)
set.seed(43215)
test.betas <- c(rnorm(5, 350, 20), runif(120, 0.01, 1))
grad.norm <- function(x) {
lambda <- tail(x, 1)
p <- head(x, -1)
h2 <- sum(((test.betas * 81)/p + lambda)^2) +
(sum(p) - 100)^2
}
(out <-
optimx(c(runif(length(test.betas), 5, 10), -50),
grad.norm,
lower = c(rep(.01, length(test.betas)), -500),
upper = c(rep(99.99, length(test.betas)), -1),
method = "L-BFGS-B"))
sum(out[,1:length(test.betas)]) # = 505.4267
任何关于如何获得尊重我的约束或资源的功能的想法将不胜感激。