目前我正在尝试在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)
非常感谢任何帮助!
答案 0 :(得分:1)
DEoptim
之类的随机求解器本质上难以在低维子集上找到最优解,例如由sum(w) = 1
定义的子集。
通过设置w <- c(w, 1-sum(w))
将问题减少到(n-1)维度,有一种第一种不太正确的方法。最后一个组件可能小于0,但通常不会。现在应用DEoptim
或optim
:
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
。但我觉得这会过度。