1

我真的很喜欢R,但有时它真的让我头疼……

我有以下简单的二次最小化问题,可以在 Excel 中立即制定和解决(点击图片放大):

在此处输入图像描述

![在此处输入图像描述

问题本身非常简单:我想(w1^2+w2^2)/2通过找到 的最佳组合w1来最小w2bY*(w1*X1+w2*X2+b) >= 1

我知道有quadprog解决这类问题的包,但我发现它太不直观了,我无法正确指定问题:-( 我不想这么说,但 Excel 似乎更适合指定像这些优化问题:-(((

我的问题
如何正确制定上述问题,以便可以用 R (无论哪个包)解决,并且程序得出正确的值w1w2b(如上图所示)。请不要只发布链接,但请提供有效的实际代码。如果您可以评论您的代码,那就太好了,这样您就可以清楚地知道您为什么要做这些事情。谢谢!

必要的数据在这里:

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它只存在于约束中而不存在于目标函数中。所以我仍然认为这个问题很适合SO。

4

1 回答 1

5

实际上,这个问题有点棘手,因为b它只存在于不等式约束矩阵中,而不存在于目标函数中。因此,二次规划问题中的矩阵只有半正定而不是正定。

因此,我的方法是将矩阵条目设置为对应于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一样。

于 2015-11-15T17:31:22.017 回答