跟进这个帖子here,似乎有人遇到了同样的问题:
import numpy as np
from scipy.optimize import fmin_l_bfgs_b
def f(x):
return x[0] ** 2
def g(x):
return 2 * x[0]
x0 = np.array([-1.])
fmin_l_bfgs_b(f, x0, fprime=g)
给出
309 _lbfgsb.setulb(m, x, low_bnd, upper_bnd, nbd, f, g, factr,
310 pgtol, wa, iwa, task, iprint, csave, lsave,
--> 311 isave, dsave)
312 task_str = task.tostring()
313 if task_str.startswith(b'FG'):
TypeError: failed to initialize intent(inout|inplace|cache) array, input not an array
```
有谁知道这里发生了什么?使用调试器无法进入任何有趣的范围级别。
发生这种情况的scipy版本:0.16
答案 0 :(得分:2)
我认为你在g
中返回的渐变应该是一个数组,而不是一个标量:
>>> def f(x): return x[0] ** 2
>>> def g(x): return 2*x
>>> fmin_l_bfgs_b(f, [-1.0], fprime=g)
(array([ 0.]), 0.0, {'warnflag': 0, 'grad': array([ 0.]), 'funcalls': 2, 'nit': 1, 'task': b'CONVERGENCE: NORM_OF_PROJECTED_GRADIENT_<=_PGTOL'})
或者更有趣的事情:
>>> def f(x): return (x[0]-3) ** 2
>>> def g(x): return 2*x - 6
>>> fmin_l_bfgs_b(f, [-1.0], fprime=g)
(array([ 3.]), 0.0, {'warnflag': 0, 'grad': array([ 0.]), 'funcalls': 3, 'nit': 2, 'task': b'CONVERGENCE: NORM_OF_PROJECTED_GRADIENT_<=_PGTOL'})
(input not an array
消息使我认为例行程序期望某个数组不是一个数组;之后它只是实验。)