哪个库可以有效地处理R中的角点解决方案?

时间:2013-02-13 23:37:54

标签: arrays r minimization

目前我正在尝试在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)

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

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

通过设置w <- c(w, 1-sum(w))将问题减少到(n-1)维度,有一种第一种不太正确的方法。最后一个组件可能小于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上),包alabama中的auglag或包nloptr中的slsqp 。但我觉得这会过度。