Из 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.


person silgon    schedule 04.06.2015    source источник


Ответы (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 ожидает рассмотрения .....

person silgon    schedule 04.06.2015
comment
Правильно, вы не можете использовать функции NumPy, такие как np.sum, на объектах cvxpy. - person steven; 14.09.2015
comment
Согласно cvxpy, они используют библиотеки cvxopt для решения проблем. В cvxopt вы должны написать свою проблему более стандартным способом для типа решателя, который вы хотите использовать, тогда как cvxpy должен адаптировать вашу проблему на основе структуры, которую вы используете для своей проблемы (они должны выбрать тип cvxopt решатель в зависимости от вашей проблемы и передайте переменные стандартным способом cvxopt). В конце концов, CVXPY - это оболочка, которая пытается упростить задачу. - person silgon; 20.04.2016