R:二次规划/等渗回归

时间:2015-06-21 21:41:15

标签: r mathematical-optimization minimization quadratic-programming

我想最小化以下等式:

F=SUM{u 1:20}sum{w 1:10}   Quw(ruw-yuw)^2

具有以下约束:

yuw >= yu,w+1
yuw >= yu-1,w
y20,0 = 100
y0,10 = 0
yu,10 = 0

我有一个20 * 10 ruw和20 * 10 quw矩阵,我现在需要生成一个符合约束条件的yuw矩阵。我在R编码,熟悉lpsolve,optimx和quadprog包,但不知道如何使用它们来解决这个问题。我知道我必须使用quadprog软件包,因为这是一个二次规划问题。我不是在寻找一个完整的答案,我想要如何构建约束矩阵以及解决问题的最佳方法。

1 个答案:

答案 0 :(得分:4)

鉴于此处优化问题与your previous question的相似性,我将直接从我对该问题的回答中借用一些语言。然而它们有点不同(前一个问题是线性规划问题,这是一个二次规划问题,而且约束条件不同),所以它们不是重复的。

扩展优化目标,我们得到Quw*ruw^2 - 2*Quw*ruw*yuw + Quw*yuw^2。我们看到这是决策变量yuw的二次函数,因此solve.QP包的quadProg方法可用于解决优化问题。

为了抽象出来,我们假设R=20C=10描述了输入矩阵的维数。然后有R*C个决策变量,我们可以为它们分配顺序y11, y21, ... yR1, y12, y22, ... yR2, ..., y1C, y2C, ..., yRC,读取变量矩阵的列。

?solve.QP开始,我们读到目标采用-d'b + 0.5b'Db形式作为决策变量b。与决策变量d对应的yuw元素的值为2*Quw*ruwD为对角矩阵,其元素对应于决策变量yuw,其值为{{} 1}}。请注意,2*Quw函数要求solve.QP矩阵为正定,因此对于每个D对,我们需要Quw > 0

第一个u, w约束对应R*(C-1)约束,下一个yuw >= yu,w+1约束对应(R-1)*C约束。下一个yuw >= yu-1,w约束对应于2*R约束(输入为yuC = 0yuC >= 0),最后一个约束为-yuC >= 0(在逻辑上等效)到-yR1 >= -100)。

我们可以使用随机输入数据,使用以下R命令将此模型输入到yR0 = 100包中:

quadProg

我们现在可以访问模型解决方案:

# Sample data
set.seed(144)
Quw <- matrix(runif(200), nrow=20)
ruw <- matrix(runif(200), nrow=20)
R <- nrow(Quw)
C <- ncol(Quw)

# Build constraint matrix
part1 <- matrix(0, nrow=R*(C-1), ncol=R*C)
part1[cbind(1:(R*C-R), 1:(R*C-R))] <- 1
part1[cbind(1:(R*C-R), (R+1):(R*C))] <- -1
part2 <- matrix(0, nrow=(R-1)*C, ncol=R*C)
pos2 <- as.vector(sapply(2:R, function(r) r+seq(0, R*(C-1), by=R)))
part2[cbind(1:nrow(part2), pos2)] <- 1
part2[cbind(1:nrow(part2), pos2-1)] <- -1
part3 <- matrix(0, nrow=2*R, ncol=R*C)
part3[cbind(1:R, (R*C-R+1):(R*C))] <- 1
part3[cbind((R+1):(2*R), (R*C-R+1):(R*C))] <- -1
part4 <- rep(0, R*C)
part4[R] <- -1
const.mat <- rbind(part1, part2, part3, part4)

library(quadProg)
mod <- solve.QP(Dmat = 2*diag(as.vector(Quw)),
                dvec = 2*as.vector(ruw)*as.vector(Quw),
                Amat = t(const.mat),
                bvec = c(rep(0, nrow(const.mat)-1), -100))