0

我正在研究一个有约束的优化问题。我有许多变量的总和必须为 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

任何关于如何获得尊重我的约束或资源的功能的想法将不胜感激。

4

0 回答 0