scipy.optimize 约束方法中的边界数组形状问题

Problem with bounds array shape in scipy.optimize constrained methods

跟进 now I have a problem with the shape of the bounds array in the constrained bfgs method

我的代码如下:

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() 中使用的首选格式,因为它很容易用嵌套 for 解析loops.Then 这个列表被压缩成一个 (15,) 形的 numpy 数组以满足 x0 参数的格式需求,但不要担心,因为 X 值在 myfunc()然后通过 X=X.reshape(origshape) 转换回我的 (3,1,5) 格式,其中 origshape 全局变量将保存原始格式。它可能看起来效率低下并且来回无用,但我找不到更容易的方法。

现在这适用于每个 fmin_ 函数,除了像 fmin_l_bfgs_b 这样的边界,我无法弄清楚边界值需要的形状。文档说:

"(min, max) pairs for each element in x, defining the bounds on that parameter."

所以我认为这意味着每个元素 1 对,所以在我的情况下是 (15,2) 形状,但是当我使用上面的代码时,它给了我以下错误:

TypeError: 'float' object is not subscriptable

所以我想我弄错了形状。请帮我解决这个问题。

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

如果不将 approx_grad 变量设置为 True,它似乎不起作用。否则我猜你需要指定 fprime 函数。

无论哪种方式,该功能似乎都已贬值,使用 scipy.optimize.minimize 功能更好。