如何组织列表列表以兼容 scipy.optimize fmin 初始化数组



说到scipy,我非常业余。我正在尝试在多维变量系统上使用 scipy 的 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( 形状的列表列表!?

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)在一行中。请注意,这也适用于您建议的三维数组:

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

最新更新