用R求解二次规划

时间:2012-09-09 22:48:17

标签: r machine-learning

我想使用kernlab的ipop函数解决以下二次规划方程:

min 0.5*x'*H*x + f'*x  
subject to:  A*x <= b   
Aeq*x = beq  
LB <= x <= UB 

其中在我们的例子H 3x3矩阵中,f是3x1,A是2x3,b是2x1,LB和UB都是3x1。

编辑1 我的R代码是:

library(kernlab)
H <- rbind(c(1,0,0),c(0,1,0),c(0,0,1))
f = rbind(0,0,0)
A = rbind(c(1,1,1), c(-1,-1,-1))
b = rbind(4.26, -1.73)
LB = rbind(0,0,0)
UB = rbind(100,100,100)
> ipop(f,H,A,b,LB,UB,0)
Error in crossprod(r, q) : non-conformable arguments

我从matlab知道这是这样的:

H = eye(3);
f = [0,0,0];
nsamples=3;
eps = (sqrt(nsamples)-1)/sqrt(nsamples);
A=ones(1,nsamples);
A(2,:)=-ones(1,nsamples);
b=[nsamples*(eps+1); nsamples*(eps-1)];

Aeq = [];
beq = [];
LB = zeros(nsamples,1);
UB = ones(nsamples,1).*1000;

[beta,FVAL,EXITFLAG] = quadprog(H,f,A,b,Aeq,beq,LB,UB);

并且答案是3x1的向量等于[0.57,0.57,0.57];

然而,当我在R上尝试它时,使用来自kernlab库的ipop函数 ipop(f,H,A,b,LB,UB,0))我正在面对错误的crossprod(r,q):不一致的参数

我感谢任何评论

1 个答案:

答案 0 :(得分:3)

原始问题询问错误消息错误的crossprod(r,q):不一致的参数。答案是必须使用与r相同的尺寸指定b。因此,如果b为2x1,则r也必须为2x1。

第二个问题(来自评论)询问为什么原始问题中提出的系统在Matlab中有效而在R中无效。答案是R和Matlab以不同方式指出问题。 Matlab允许不等式约束与等式约束分开输入。但是在R中,约束必须都是b<=Ax<=b+r形式(至少在kernlab函数ipop内)。那么我们怎么能模仿原始的不平等约束呢?简单的方法是使b非常消极并制作r'=-b+r,其中r'是您的新r向量。现在我们仍然在约束上有相同的上限,因为r'+b=-b+r+b=r。但是,我们也对约束设置了下限。我的建议是尝试使用b的几个不同值来解决系统,看看解决方案是否一致。

编辑:

这可能是处理解决方案的更好方法:

library(quadprog);
dvec <- -f;
Dmat <- H;
Amat <- -t(A);
bvec <- -rbind(4.26,-1.73);
solve.QP(Dmat, dvec, Amat, bvec)

这些定义取决于先前定义的R代码。