2015-06-04 5 views
2

Я пытался передать некоторый код из Matlab в Python. У меня такая же проблема с выпуклой оптимизацией, которая работает над Matlab, но у меня проблемы с передачей ее CVXPY или CVXOPT.От CVX до 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.

ответ

2

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

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 в ожидании .....

+1

Правильно, вы не можете использовать функции NumPy, такие как '' np.sum'' на cvxpy o bjects. – steven

+0

Итак, как CVXPY и CVXOPT работают вместе? – jmcmahon443

+1

Согласно cvxpy, они используют библиотеки cvxopt для решения проблем. В cvxopt вы должны написать свою проблему более стандартным способом для типа решателя, который хотите использовать, тогда как cvxpy должен адаптировать вашу проблему на основе структуры, которую вы используете для своей проблемы (они должны выбрать тип cvxopt решатель в зависимости от вашей проблемы и передайте переменные стандартным способом cvxopt). В конце дня CVXPY - это обертка, которая пытается облегчить ситуацию. – silgon

 Смежные вопросы

  • Нет связанных вопросов^_^