2017-01-17 2 views
0

Я пытаюсь найти оптимизированную матрицу с бинарными записями (0,1), чтобы моя объектная функция была максимизирована.Оптимизация в scipy для матрицы

My X input - это двумерная матрица с 0 и 1 элементами.

Моя целевая функция выглядит так:

def objective(x): 
    w=[[2,3],[4,6],[1,0],[2,8]] 
    return -1* (x[0][0]*w[0][0]+x[0][1]*w[0][1]+x[1][0]*w[1][0]+x[1][1]*w[1][1]) 

А вот моя начальная X:

x0=[[1,0],[1,0],[0,1],[0,0]] 

Здесь я определить границы для X:

b=(0,1) 
bnds=((b,b),(b,b)) 

И, наконец, проблема максимизации

sol=minimize(objective2,x0,method='SLSQP',bounds=bnds) 

Но у меня есть две проблемы:

Первое: bnds имеет другое измерение, чем мой X, и я получаю сообщение об ошибке для этого. Во-вторых, когда я запускаю функцию минимизации, которую я получаю, и ошибка, которая говорит о некорректном индексе для скалярной переменной.

+0

Я думаю, что ваш 'x0' должен быть 1d. Я ответил на недавний вопрос по этой линии. – hpaulj

+0

@hpaulj Итак, вы имеете в виду, что нет способа, чтобы это могло быть двухмерным? – HimanAB

+0

Это не серьезное ограничение, так как вы можете разгадать и изменить его в своей функции по мере необходимости. – hpaulj

ответ

1

Вот переформирования, что я имел в виду

In [293]: objective(x0) 
Out[293]: -6 
In [294]: def foo(x): 
    .....:  return objective(x.reshape(-1,2)) 
    .....: 
In [295]: foo(np.array(x0).ravel()) 
Out[295]: -6 
In [296]: from scipy.optimize import minimize 
In [297]: minimize(foo, x0, method='SLSQP') 
Out[297]: 
    fun: -801353716.84727359 
    jac: array([ 0., 0., 0., 0., 0., 0., 0., 0., 0.]) 
message: 'Optimization terminated successfully.' 
    nfev: 130 
    nit: 13 
    njev: 13 
    status: 0 
success: True 
     x: array([ 2.46570281e+07, 3.69855528e+07, 4.93140795e+07, 
     7.39711140e+07, 0.00000000e+00, 1.00000000e+00, 
     0.00000000e+00, 0.00000000e+00]) 

Я have't включил границы еще

In [290]: np.array(bnds).shape 
Out[290]: (2, 2, 2) 

Они должны быть совместимы с уплощенной x0

In [298]: np.array(x0).ravel() 
Out[298]: array([1, 0, 1, 0, 0, 1, 0, 0]) 

Например, это ограничивает все значения от 0 до 1

In [301]: bnds=np.array((np.zeros(8),np.ones(8))).T 
In [302]: bnds 
Out[302]: 
array([[ 0., 1.], 
     [ 0., 1.], 
     [ 0., 1.], 
     [ 0., 1.], 
     [ 0., 1.], 
     [ 0., 1.], 
     [ 0., 1.], 
     [ 0., 1.]]) 
In [303]: minimize(foo, x0, method='SLSQP',bounds=bnds) 
Out[303]: 
    fun: -14.999999999999773 
    jac: array([-2., -3., -4., -6., 0., 0., 0., 0., 0.]) 
message: 'Optimization terminated successfully.' 
    nfev: 20 
    nit: 2 
    njev: 2 
    status: 0 
success: True 
     x: array([ 1., 1., 1., 1., 0., 1., 0., 0.]) 
+0

Спасибо, мой друг, но ваш ответ не совсем понятен. Я ценю, если вы могли бы сделать это немного яснее и организованно. – HimanAB

+0

Большая часть моего ответа копируется с фактического интерактивного сеанса Ipython. – hpaulj

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