f_min_lbfgs打破了二次切片?

时间:2015-11-26 17:22:04

标签: scipy

跟进这个帖子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

1 个答案:

答案 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消息使我认为例行程序期望某个数组不是一个数组;之后它只是实验。)