0

目前我正在尝试在 R 中进行最小化(优化)问题,其中我有一个向量 X1,我想通过矩阵 X2 的加权平均值和权重向量 w 来近似它。这意味着我想最小化

wg <- function(w)
{
    t(X1 - X2 %*% w) %*% (X1 - X2 %*% w)
}

权重的约束是 w[i]>= 0 和 sum(w) = 1 。

目前我正在使用 DEoptim 包进行优化,但我觉得它不能很好地处理角落解决方案。

我正在复制经济学论文中使用的一种方法,在那篇论文中几乎所有的权重都为零。在我的案例中,我预计会有类似的结果(我想通过其他州的加权平均值来模拟亚利桑那州),尤其是由于经济形势的异质性。

目前,我觉得 DEoptim 包的问题比我的方法问题更大,而且我不太相信结果。我可以使用哪些其他软件包,最好是那些在寻找角落解决方案方面更强大的软件包?

我的 DEoptim 设置如下:

controlDE <- list(reltol=.0000000001,steptol=150, itermax = 5000,trace = 250)
#control parameters

outDEoptim <- DEoptim(fn = wg, lower = rep(0, N), upper = rep(1, N), 
    control = controlDE)

任何帮助将非常感激!

4

1 回答 1

1

随机求解器(例如DEoptimwill 本质上)难以在低维子集(例如由 定义的子集)上找到最优解sum(w) = 1

有一种第一种但不完全正确的方法是通过设置将问题减少到 (n-1) 维w <- c(w, 1-sum(w))。最后一个分量可能小于 0,但通常不会。现在申请DEoptimoptim

set.seed(1357); m <- 4; n <- 5
X2 <- round(matrix(runif(20), m, n), 2)
X1 <- X2 %*% c(0, 1, 0, 0, 0)               # solution c(0,1,0,0,0)

wg <- function(w) {                         # length(w) == 4
    w <- c(w, 1 - sum(w))
    t(X1 - X2 %*% w) %*% (X1 - X2 %*% w)    # sum((X1 - X2 %*% w)^2)
}

w0 <- rep(1/n, n-1)                         # initial point (1/n, ..., 1/n)
optim(w0, wg, lower = rep(0, n), upper = rep(1, n),
        method = "L-BFGS-B", control = list(factr = 1e-8))
## $par
## [1] 0 1 0 0                              # wmin = c(0,1,0,0,0)

或者,您在 R 中应用可以处理等式约束的求解器之一,例如Rdonlp2(在 R-Forge 上)、auglag包 alabama 或slsqp包 nloptr 中。但我觉得这会有点过头了。

于 2013-02-14T10:38:25.943 回答