Проблема с формой массива bounds в ограниченных методах scipy.optimize - PullRequest
0 голосов
/ 26 января 2020

Продолжение моего предыдущего вопроса Теперь у меня проблема с формой массива bounds в методе ограниченного bfgs .

Мой код следующий:

nr      = 5
lag     = 1


guess       =numpy.array([[[ random.uniform(-1.0,1.0) for k in range(nr)] for l in range(lag)],
                          [[ random.uniform( 0.0,1.0) for k in range(nr)] for l in range(lag)],
                          [[ random.uniform(-1.0,1.0) for k in range(nr)] for l in range(lag)]])

bounds      =numpy.array([[[ [-1.0,1.0] for k in range(nr)] for l in range(lag)],
                          [[ [ 0.0,1.0] for k in range(nr)] for l in range(lag)],
                          [[ [-1.0,1.0] for k in range(nr)] for l in range(lag)]])

result      =   optimize.fmin_l_bfgs_b( myfunc,guess.flatten(),bounds=bounds.reshape(15,2) ) 

Как вы можете видеть, я начинаю с (3,1,5) -образного списка списков, который является моим предпочтительным форматом, с которым я работаю внутри myfunc(), потому что с ним легко разбираться вложенный в циклы. Затем этот список сокращается в массив numpy (15,) в форме для удовлетворения потребностей формата x0, но не беспокойтесь, потому что значение X внутри myfunc() затем преобразуется обратно в мой (3,1,5) формат через X=X.reshape(origshape), где глобальная переменная origshape сохранит исходный формат. Это может показаться неэффективным и бесполезным, но я не мог найти способ сделать это проще.

Теперь это работает с каждой fmin_ функцией, кроме как с границами вроде fmin_l_bfgs_b, я не мог понять, в какой форме должны быть ограниченные значения. Документация гласит:

"(min, max) пары для каждого элемента в x, определяя границы для этого параметра."

Поэтому я подумал, что это означает 1 пару для каждого элемента, поэтому a (15, 2) форма в моей ситуации, но когда я использую код выше, это дает мне следующую ошибку:

TypeError: 'float' object is not subscriptable

Так что, я думаю, я неправильно понял форму. Пожалуйста, помогите мне исправить это.

1 Ответ

0 голосов
/ 02 февраля 2020
result      =   optimize.fmin_l_bfgs_b( myfunc,guess.flatten(),bounds=bounds.reshape(15,2),approx_grad=True ) 

Похоже, что это не сработает, если для переменной approx_grad не задано значение True. В противном случае, я полагаю, вам нужно указать функцию fprime.

В любом случае функция кажется устаревшей, и использование функции scipy.optimize.minimize лучше.

...