解决 R 中具有复杂约束的二次优化问题
Solving quadratic optimization problems with complex constraints in R
有谁知道如何在 R 中实现回归,我们的目标是在所有残差均为非负且受系数约束的情况下最小化残差平方和?具体来说,我问的是具有二次项的单变量回归,其中 b_0 <=0,b_1>=0 且 b_2>=0。
我能够解决类似的问题,目标是使用 lpSolve 包最小化残差和。在 R 中求解平方和似乎要困难得多。有什么想法吗?
也有人在 Cross Validated 上提出问题:
步骤 1. 制定模型。这是在post中完成的。虽然我认为完整的模型应该是这样的:
观察这是一个纯二次规划问题。决策变量是 beta0、beta1、beta2 和 r(i)。我们对决策变量和线性等式有限制(记住 y 和 x 在这里是数据)。
标准 QP 模型如下所示:
这里新的 x 是变量 beta0、beta1、beta2 和 r(i)。矩阵 A 由
组成
A = [1 x(i) x(i)^2 I ]
其中 x(i) 又是数据。最后一部分是恒等子矩阵。 Q 矩阵是单位矩阵(对应于 beta、beta1、beta2 的变量为零):
Q = [ 0 0 ]
[ 0 I ]
第 2 步。使用 QP 求解器求解。像 QuadProg、Gurobi 或 Cplex 这样的求解器应该没有问题。
这里是一个代码片段,试图实现上面给出的解决方案:
library(quadprog)
xvec <- c(8.1,6.4,6.8,13.3,0.7,2.4,3.5,6.5,1.9,2.8,8.0,6.8,4.6,18.6,1.1,9.5,1.4,3.8,0.7,11.5,7.1,8.2,7.0,7.0,2.2,9.8,0.3,2.5,10.6,1.4,31.0)
yvec <- c(15.8,10.6,12.8,26.5,1.3,3.9,6.2,13.1,3.1,4.4,12.6,11.6,9.3,35.3,1.8,16.0,2.7,6.4,1.3,18.9,12.0,14.3,13.5,11.3,3.5,16.0,0.6,4.8,17.7,2.5,71.0)
K <- length(xvec)
# decision vars: c(beta0, beta1, beta2, r1, ..., rK)
Amat <- cbind(rep(1,K), xvec, xvec^2, diag(rep(1, K)))
Amat <- rbind(Amat, c(-1, rep(0,K+2)), c(0,1, rep(0,K+1)), c(0,0,1, rep(0,K)))
bvec <- c(yvec, rep(0,3))
Dmat <- diag(rep(1, K+3))
Dmat[1:3, 1:3] <- diag(rep(0.000001, 3))
s <- solve.QP(Dmat=Dmat, dvec=rep(0, K+3), Amat=t(Amat), bvec=bvec, meq=K)
s$solution
有谁知道如何在 R 中实现回归,我们的目标是在所有残差均为非负且受系数约束的情况下最小化残差平方和?具体来说,我问的是具有二次项的单变量回归,其中 b_0 <=0,b_1>=0 且 b_2>=0。
我能够解决类似的问题,目标是使用 lpSolve 包最小化残差和。在 R 中求解平方和似乎要困难得多。有什么想法吗?
也有人在 Cross Validated 上提出问题:
步骤 1. 制定模型。这是在post中完成的。虽然我认为完整的模型应该是这样的:
观察这是一个纯二次规划问题。决策变量是 beta0、beta1、beta2 和 r(i)。我们对决策变量和线性等式有限制(记住 y 和 x 在这里是数据)。 标准 QP 模型如下所示:
这里新的 x 是变量 beta0、beta1、beta2 和 r(i)。矩阵 A 由
组成A = [1 x(i) x(i)^2 I ]
其中 x(i) 又是数据。最后一部分是恒等子矩阵。 Q 矩阵是单位矩阵(对应于 beta、beta1、beta2 的变量为零):
Q = [ 0 0 ]
[ 0 I ]
第 2 步。使用 QP 求解器求解。像 QuadProg、Gurobi 或 Cplex 这样的求解器应该没有问题。
这里是一个代码片段,试图实现上面给出的解决方案:
library(quadprog)
xvec <- c(8.1,6.4,6.8,13.3,0.7,2.4,3.5,6.5,1.9,2.8,8.0,6.8,4.6,18.6,1.1,9.5,1.4,3.8,0.7,11.5,7.1,8.2,7.0,7.0,2.2,9.8,0.3,2.5,10.6,1.4,31.0)
yvec <- c(15.8,10.6,12.8,26.5,1.3,3.9,6.2,13.1,3.1,4.4,12.6,11.6,9.3,35.3,1.8,16.0,2.7,6.4,1.3,18.9,12.0,14.3,13.5,11.3,3.5,16.0,0.6,4.8,17.7,2.5,71.0)
K <- length(xvec)
# decision vars: c(beta0, beta1, beta2, r1, ..., rK)
Amat <- cbind(rep(1,K), xvec, xvec^2, diag(rep(1, K)))
Amat <- rbind(Amat, c(-1, rep(0,K+2)), c(0,1, rep(0,K+1)), c(0,0,1, rep(0,K)))
bvec <- c(yvec, rep(0,3))
Dmat <- diag(rep(1, K+3))
Dmat[1:3, 1:3] <- diag(rep(0.000001, 3))
s <- solve.QP(Dmat=Dmat, dvec=rep(0, K+3), Amat=t(Amat), bvec=bvec, meq=K)
s$solution