如何在 MOSEK 中重塑变量

我正在尝试将用 MATLAB CVX 编写的优化代码转换为直接调用求解器 MOSEK 的 Python 代码。我的优化由以下类型的方程组成:


||斧头-b|| +正则化器。


x是一个三维变量,需要评估其最佳值。我将 A 定义为 MATLAB 中的函数,如下所示:


function D = A(X)   


n = size(X,1);

m = size(X,2);

nim = size(X,3);

for t = 1:nim

    temp = X(:,:,t);

    D(:,:,t) = squeeze(sum(sum(reshape(temp,7,19,7,19),1),3));

end

end

所以,||Ax-b|| 在 MATLAB CVX 中变为


norm((vec(A(x)-b)))

现在,当我直接调用 MOSEK 转换为 python 时,我写道:


def lseReg(b,I,n,m,d,n1,m1,alpha,beta):

    M = Model("LSE-REG")

    x = M.variable("x", [n,m,d] )

    t = M.variable("t")

    

    y = M.variable("y",[n1,m1,d])

    for i in range(0,d):

        temp = x.slice([0,0,i],[n,m,i])

        temp2 = Var.reshape(temp,[19,7,19,7])

        y.slice[[0,0,i],[n1,m1,i]] =  Expr.sum(Expr.sum(temp2,3),1)

        

    r = Expr.sub(b,y)

    M.constraint(Expr.vstack(0.5,t,r),Domain.inRotatedQCone())

    t2 = M.variable("t2")

    r2 = Expr.sub(I,Expr.sum(x,2))

    M.constraint(Expr.vstack(0.5,t2,r2),Domain.inRotatedQCone())

    #the Objective

    ObjExpr1 = t.asExpr()

    ObjExpr2 = t2.asExpr()

    ObjExpr3 = Expr.mul(alpha,lassoVar(M,x,n,m,d))

    ObjExpr4 = Expr.mul(beta,lassoTV(M,x,n,m,d))

    objExpr = Expr.add(ObjExpr1,ObjExpr2,ObjExpr3,ObjExpr4)

    M.objective(ObjectiveSense.Minimize,objExpr)

    return M


我这次重塑做错了什么?


aluckdog
浏览 105回答 1
1回答

暮色呼如

这:x.slice([0,0,i],[n,m,i])会给你一个大小为 0 的对象,你可能的意思是x.slice([0,0,i],[n,m,i+1])请记住,“最后一个”索引是您想要的切片的最后一个元素后面的 1。你不能将事物分配给切片,这是非法的:y.slice[[0,0,i],[n1,m1,i]] =相反,您可能想要做出限制。这些是可能对其他人有用的一般评论。我们知道您已将问题发送给 MOSEK 支持人员,我们将针对您的其他问题提供更多详细信息进行答复。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python