Как организовать список списков, чтобы быть совместимым с scipy.optimize fmin init array - PullRequest
0 голосов
/ 25 января 2020

Я очень любитель, когда дело касается scipy. Я пытаюсь использовать функцию scminy fmin в многомерной системе переменных. Для простоты я использую список из списка. Мои данные 12-мерные, когда я ввожу np.shape(DATA), он возвращает (3,2,2), я даже не уверен, может ли scipy справиться с таким количеством измерений, если нет проблем, я могу уменьшить их, дело в том, что функция optimize.fmin() не Не принимать массивы на основе списка в качестве x0 начальных параметров, поэтому мне нужна помощь либо в переписывании массива x0 в numpy совместимый, либо во весь массив DATA в 12-мерную матрицу, либо в нечто подобное.

Вот более простой пример, иллюстрирующий проблему:

from scipy import optimize
import numpy as np
def f(x): return(x[0][0]*1.5-x[0][1]*2.0+x[1][0]*2.5-x[1][1]*3.0)
result = optimize.fmin(f,[[0.1,0.1],[0.1,0.1]])
print(result)

Будет выдано сообщение об ошибке invalid index to scalar variable, которое, вероятно, происходит из-за непонимания структуры списка [[],[]], поэтому он, вероятно, понимает только numpy массивы форматов.

Итак, как переписать это, чтобы оно заработало, а также для моего (3,2,2) сформированного списка списка!?

1 Ответ

0 голосов
/ 26 января 2020

scipy.optimize.fmin требуется исходное предположение, что параметры функции должны быть одномерным массивом с количеством элементов, которые подходят для оптимизации функции. В вашем случае, возможно, вы можете использовать flatten и reshape, если вам просто нужно, чтобы выходные данные были в той же форме, что и ваши входные параметры. Пример на основе кода вашей иллюстрации:

from scipy import optimize
import numpy as np

def f(x):
    return x[0]*1.5-x[1]*2.0+x[2]*2.5-x[3]*3.0

guess = np.array([[0.1, 0.1], 
                  [0.1, 0.1]]) # guess.shape is (2,2)

out = optimize.fmin(f, guess.flatten()) # flatten upon input
# out.shape is (4,)

# reshape output according to guess
out = out.reshape(guess.shape) # out.shape is (2,2) again

или out = optimize.fmin(f, guess.flatten()).reshape(guess.shape) в одну строку. Обратите внимание, что это также работает для 3-мерного массива, как вы предлагаете:

guess = np.arange(12).reshape(3,2,2)
# array([[[ 0,  1],
#         [ 2,  3]],
#        [[ 4,  5],
#         [ 6,  7]],
#        [[ 8,  9],
#         [10, 11]]])

guess = guess.flatten()
# array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])

guess = guess.reshape(3,2,2)
# array([[[ 0,  1],
#         [ 2,  3]],
#        [[ 4,  5],
#         [ 6,  7]],
#        [[ 8,  9],
#         [10, 11]]])
...