从CVX到CVXPY或CVXOPT

12

我一直在试图将Matlab中的一些代码转移到Python中。我已经使用Matlab解决了相同的凸优化问题,但是我在尝试将它传递到CVXPY或CVXOPT时遇到了问题。

n = 1000;
i = 20;
y = rand(n,1);
A = rand(n,i);
cvx_begin
variable x(n);
variable lambda(i);
minimize(sum_square(x-y));
subject to
    x == A*lambda;
    lambda >= zeros(i,1);
    lambda'*ones(i,1) == 1;
cvx_end

这是我用PythonCVXPY尝试的方法。

import numpy as np
from cvxpy import *

# Problem data.
n = 100
i = 20
np.random.seed(1)
y = np.random.randn(n)
A = np.random.randn(n, i)

# Construct the problem.
x = Variable(n)
lmbd = Variable(i)
objective = Minimize(sum_squares(x - y))
constraints = [x == np.dot(A, lmbd),
               lmbd <= np.zeros(itr),
               np.sum(lmbd) == 1]

prob = Problem(objective, constraints)

print("status:", prob.status)
print("optimal value", prob.value)

尽管如此,它没有起作用。 你们有没有任何想法如何使它工作? 我相当确定我的问题在约束条件中。 并且最好能够使用CVXOPT。

1个回答

8
我想我理解了,我的约束条件错了=),我添加了一个随机种子号码来比较结果,并检查两种语言的结果是否相同。我在此留下数据,也许将来会有用;) Matlab
rand('twister', 0);
n = 100;
i = 20;
y = rand(n,1);
A = rand(n,i);
cvx_begin
variable x(n);
variable lmbd(i);
minimize(sum_square(x-y));
subject to
    x == A*lmbd;
    lmbd >= zeros(i,1);
    lmbd'*ones(i,1) == 1;
cvx_end

CVXPY

import numpy as np
import cvxpy as cp

# random seed
np.random.seed(0)

# Problem data.
n = 100
i = 20
y = np.random.rand(n)
# A = np.random.rand(n, i)  # normal
A = np.random.rand(i, n).T  # in this order to test random numbers

# Construct the problem.
x = cp.Variable(n)
lmbd = cp.Variable(i)
objective = cp.Minimize(cp.sum_squares(x - y))
constraints = [x == A*lmbd,
               lmbd >= np.zeros(i),
               cp.sum(lmbd) == 1]

prob = cp.Problem(objective, constraints)
result = prob.solve(verbose=True)

CVXOPT正在进行中......



2
没错,你不能在cvxpy对象上使用NumPy函数,比如np.sum - steven
6
根据cvxpy的说法,他们使用cvxopt库来解决问题。在cvxopt中,您必须按照所需求解器的标准方式编写问题,而cvxpy应该根据您为问题使用的结构自适应地调整您的问题(他们应该根据您的问题选择cvxopt求解器的类型,并以标准的cvxopt方式传递变量)。最终,CVXPY是一个尝试使事情更简单的包装器。 - silgon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接