От CVX к CVXPY или CVXOPT

Я пытался передать некоторый код из 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

Это то, что я пробовал с Python и CVXPY.

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 ответ

Я думаю, что получил, у меня было одно из ограничений неправильно =), я добавил случайное число семян, чтобы сравнить результаты и проверить, что на самом деле одинаковы для обоих языков. Я оставляю здесь данные, так что, может быть, это когда-нибудь кому-нибудь пригодится;)

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
from cvxpy import *

# 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 = Variable(n)
lmbd = Variable(i)
objective = Minimize(sum_squares(x - y))
constraints = [x == A*lmbd,
               lmbd >= np.zeros(i),
               sum_entries(lmbd) == 1]

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

CVXOPT находится на рассмотрении.....

Другие вопросы по тегам