如何组织列表列表的列表以与 scipy.optimize fmin init array 兼容

How to organize list of list of lists to be compatible with scipy.optimize fmin init array

说到scipy我很业余。我正在尝试在多维变量系统上使用 scipy 的 fmin 函数。为了简单起见,我使用列表列表的列表。我的数据是 12 维的,当我输入 np.shape(DATA) 它 returns (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) 形列表列表!?

scipy.optimize.fmin 需要函数参数的初始猜测是一个一维数组,其中包含许多适合函数优化的元素。在您的情况下,如果您只需要输出与输入参数具有相同的形状,也许您可​​以使用 flattenreshape。基于您的插图代码的示例:

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]]])