Python fmin_l_bfgs_b将NaN作为函数值返回,但我不返回';我不明白

Python fmin_l_bfgs_b将NaN作为函数值返回,但我不返回';我不明白,python,numpy,scipy,Python,Numpy,Scipy,免责声明:我知道如果不展示一个简洁、简单、可复制的样本,我无法完全解决这个问题,但我希望即使没有这个,我也能得到一些提示 我的代码是这样的 from scipy import optimize x, foo, result = optimize.fmin_l_bfgs_b(myFunc, x0, approx_grad=True, bounds=someBounds) 我从哪里得到第二个输出是 f:浮点-func的最小

免责声明:我知道如果不展示一个简洁、简单、可复制的样本,我无法完全解决这个问题,但我希望即使没有这个,我也能得到一些提示

我的代码是这样的

from scipy import optimize
x, foo, result = optimize.fmin_l_bfgs_b(myFunc, x0, approx_grad=True,
                                      bounds=someBounds)
我从哪里得到第二个输出是

f:浮点-func的最小值

给,我明白了

>> print foo
nan
但是如果我试图用
fmin_l_bfgs_b
给我的最小值来恢复函数值,我得到

>> myFunc(x)
20520.965701409703
下面是
结果

{'warnflag': 2, 'task': 'ABNORMAL_TERMINATION_IN_LNSRCH', 'grad': array([  1.27146321e+12,   5.25635627e+11,   8.94617519e+11,
         2.90637658e+12,   1.16159650e+12]), 'nit': 5, 'funcalls': 490}

当最小化程序声称它是
NaN
时,我怎么可能得到一个数值最小值?

返回的
warnflag
值不是0。最小值告诉您优化没有收敛。您应该在假设找到最小值之前检查返回状态。

我以前也遇到过类似的问题,我发现如果
x0
float32
类型,则无法达到收敛。将其转换为np.float64后,它将像一个符咒一样工作。
这可能不是你问题的解决办法,但我认为值得一试。

我不太理解你的问题。结果是,
x
处的梯度甚至不接近零,因此当前x不能是局部最小值。它还告诉您在线路搜索过程中出现了问题。如果我不得不猜测的话,我会说,你的函数产生nan。也许你除以零,或者你除以inf/inf?如果你没有给出你的问题,我想这是无法回答的。@cel如果我的函数产生了
nan
,那么当我尝试最小化
x
,也就是
myFunc(x)
,我怎么会得不到
nan
?你已经看到了
结果的'warnfag'和'task'键的描述,是吗?我怀疑“LNSRCH”代表“线路搜索”。@FooBar,我没明白。您无法知道在行搜索过程中计算了哪些函数值
func(x)
。我不明白您想用函数求值测试什么
myFunc(x)
。它只是表明,对于某些任意点,
x
f(x)
不是
nan
。表明这一点毫无意义:你必须确保所有可行的
x
func(x)!=nan
..@cel
x
不是任意的,
x
是最小值的返回值。这就是极小值所声称的函数输出为nan的确切向量,不是吗?