use*_*846 6 r machine-learning
我想用kernlab中的ipop函数求解下面的二次规划方程:
min 0.5*x'*H*x + f'*x
subject to: A*x <= b
Aeq*x = beq
LB <= x <= UB
Run Code Online (Sandbox Code Playgroud)
在我们的例子中,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
Run Code Online (Sandbox Code Playgroud)
我从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);
Run Code Online (Sandbox Code Playgroud)
答案是3x1等于[0.57,0.57,0.57]的向量;
然而,当我在R上尝试它时,使用来自kernlab库ipop(f,H,A,b,LB,UB,0)的ipop函数)并且我在crossprod(r,q)中面临错误:不一致的参数
我感谢任何评论
最初的问题询问错误消息Error in crossprod(r, q) : non-conformable arguments。答案是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)
Run Code Online (Sandbox Code Playgroud)
其中这些定义取决于先前定义的 R 代码。