我正在尝试将用MATLAB CVX编写的优化代码转换为直接调用求解器MOSEK的Python代码。我的优化由以下类型的方程组成:
|Ax-b||+正则化。
X是一个三维变量,需要计算其最佳值。我在MATLAB中将A定义为函数,如下所示:
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然而,我得到了一个错误:
File "C:\Users\Anaconda\lib\site-packages\mosek\fusion\impl\_implementation.py", line 13779, in reshape
return mosek_fusion_Var._reshape_alt_Lmosek_4fusion_4Variable_2_3I(*args)
File "C:\Users\Anaconda\lib\site-packages\mosek\fusion\impl\_implementation.py", line 13967, in _reshape_alt_Lmosek_4fusion_4Variable_2_3I
_1 = mosek_fusion_Var._reshape_Lmosek_4fusion_4Variable_2_3I(_0,_1)
File "C:\Users\Anaconda\lib\site-packages\mosek\fusion\impl\_implementation.py", line 13976, in _reshape_Lmosek_4fusion_4Variable_2_3I
return (_0._reshape__3I(_1))
File "C:\Users\Anaconda\lib\site-packages\mosek\fusion\impl\_implementation.py", line 10897, in _reshape__3I
raise mosek_fusion_LengthError._ctor_S("Shape size does not match variable size")
LengthError: Shape size does not match variable size我在这个重塑中做错了什么?
发布于 2020-10-06 18:07:36
这一点:
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支持部门,我们将针对您的其他问题提供更多详细信息。
https://stackoverflow.com/questions/64218456
复制相似问题