用 R 求解约束二次规划
Solve Constrained Quadratic Programming with R
我真的很喜欢 R 但有时它真的让我头疼...
我有以下简单的二次最小化问题,可以在 Excel 中立即制定和解决(点击图片放大):
和
问题本身非常简单:我想通过找到 w1
、w2
和 b
的最佳组合来最小化 (w1^2+w2^2)/2
Y*(w1*X1+w2*X2+b) >= 1
我知道有 quadprog
包可以解决这类问题,但我发现它太不直观了,以至于我无法正确指定问题:-( 我不想这么说,但是 Excel 似乎更适合指定像这样的优化问题:-(((
我的问题
如何正确地表达上述问题,以便它可以用 R 解决(无论是哪个包)并且程序到达 w1
、w2
和 b
的正确值(因为可以见上图)。请不要只是 post 链接,但请提供实际有效的代码。如果您可以对您的代码进行注释,这样就可以清楚地了解您为什么做您所做的事情,那就太好了。谢谢!
必要的数据在这里:
data <- matrix(c(2.947814,6.626878, 1,
2.530388,7.785050, 1,
3.566991,5.651046, 1,
3.156983,5.467077, 1,
2.582346,4.457777,-1,
2.155826,6.222343,-1,
3.273418,3.520687,-1),ncol=3,byrow=T)
colnames(data) <- c("X1","X2","y")
附录
有些人在我要求提供代码(而不是简单的链接)时生气了。我为此道歉并给出了我的理由,到目前为止我没有在 SO 的答案中找到任何好的方法。更深层次的原因是,从 b
仅在约束中而不是 objective 函数中的意义上说,这个问题是不寻常的。所以我还是觉得这个题很适合SO
其实这个问题有点棘手,因为b
只存在于不等式约束矩阵中,而没有出现在objective函数中。因此二次规划问题中的矩阵只是半正定的而不是正定的。
因此,我的方法是将对应于 b
的矩阵条目设置为一个非常小的值 - 在我的例子中是 1e-9
。其他更熟悉此类优化问题的人可能知道如何正确解决问题...
计算solve.QP
输入
c1=data[,"X1"]*data[,"y"]
c2=data[,"X2"]*data[,"y"]
#I use 1e-9 for the b entry
Dmat=matrix(`[<-`(numeric(9),c(1,5,9),c(1,1,1e-9)),3,3)
dvec=rep(0,3)
Amat=cbind(c1,c2,data[,"y"])
bvec=rep(1,nrow(Amat))
用solve.QP
求解
library(quadprog)
sol=solve.QP(Dmat=Dmat,dvec=dvec,Amat=t(Amat),bvec=bvec)$solution
sol
#[1] 2.903910 1.201258 -14.734964
与excel相同。
我真的很喜欢 R 但有时它真的让我头疼...
我有以下简单的二次最小化问题,可以在 Excel 中立即制定和解决(点击图片放大):
和
问题本身非常简单:我想通过找到 w1
、w2
和 b
的最佳组合来最小化 (w1^2+w2^2)/2
Y*(w1*X1+w2*X2+b) >= 1
我知道有 quadprog
包可以解决这类问题,但我发现它太不直观了,以至于我无法正确指定问题:-( 我不想这么说,但是 Excel 似乎更适合指定像这样的优化问题:-(((
我的问题
如何正确地表达上述问题,以便它可以用 R 解决(无论是哪个包)并且程序到达 w1
、w2
和 b
的正确值(因为可以见上图)。请不要只是 post 链接,但请提供实际有效的代码。如果您可以对您的代码进行注释,这样就可以清楚地了解您为什么做您所做的事情,那就太好了。谢谢!
必要的数据在这里:
data <- matrix(c(2.947814,6.626878, 1,
2.530388,7.785050, 1,
3.566991,5.651046, 1,
3.156983,5.467077, 1,
2.582346,4.457777,-1,
2.155826,6.222343,-1,
3.273418,3.520687,-1),ncol=3,byrow=T)
colnames(data) <- c("X1","X2","y")
附录
有些人在我要求提供代码(而不是简单的链接)时生气了。我为此道歉并给出了我的理由,到目前为止我没有在 SO 的答案中找到任何好的方法。更深层次的原因是,从 b
仅在约束中而不是 objective 函数中的意义上说,这个问题是不寻常的。所以我还是觉得这个题很适合SO
其实这个问题有点棘手,因为b
只存在于不等式约束矩阵中,而没有出现在objective函数中。因此二次规划问题中的矩阵只是半正定的而不是正定的。
因此,我的方法是将对应于 b
的矩阵条目设置为一个非常小的值 - 在我的例子中是 1e-9
。其他更熟悉此类优化问题的人可能知道如何正确解决问题...
计算solve.QP
输入
c1=data[,"X1"]*data[,"y"]
c2=data[,"X2"]*data[,"y"]
#I use 1e-9 for the b entry
Dmat=matrix(`[<-`(numeric(9),c(1,5,9),c(1,1,1e-9)),3,3)
dvec=rep(0,3)
Amat=cbind(c1,c2,data[,"y"])
bvec=rep(1,nrow(Amat))
用solve.QP
library(quadprog)
sol=solve.QP(Dmat=Dmat,dvec=dvec,Amat=t(Amat),bvec=bvec)$solution
sol
#[1] 2.903910 1.201258 -14.734964
与excel相同。