我正在研究受限制的优化问题。我有许多必须总和为100的变量。我已经按照这里的工作Why does optimx in R not give the correct solution to this simple nonparametric likelihood maximization?进行了尝试优化梯度的范数,如图所示。我的功能相对良好,规范如此:
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
非常感谢任何有关如何使功能尊重我的约束或资源的想法。