Python scipy.optimize.minimize雅可比函数原因';值错误:包含多个元素的数组的真值不明确';

Python scipy.optimize.minimize雅可比函数原因';值错误:包含多个元素的数组的真值不明确';,python,machine-learning,scipy,Python,Machine Learning,Scipy,我使用BFGS方法,给出平方指数/RBF核的负对数似然,以及它的梯度(雅可比)。不考虑梯度,使用第一个差异可以很好地工作-但是 ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 一旦我尝试使用NLL的梯度,就会出现错误。还要注意的是,虽然我在下面的seu_der函数(gradient/Jacobian)中的源代码没有在结果中使用.any(

我使用BFGS方法,给出平方指数/RBF核的负对数似然,以及它的梯度(雅可比)。不考虑梯度,使用第一个差异可以很好地工作-但是

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
一旦我尝试使用NLL的梯度,就会出现错误。还要注意的是,虽然我在下面的seu_der函数(gradient/Jacobian)中的源代码没有在结果中使用.any()或.all(),但我也尝试了这两种方法,只得到了完全相同的错误

前面的跟踪是:

Traceback (most recent call last):
File "loaddata.py", line 107, in <module>
gp.fit(X, y)
File "/home/justinting/programming/bhm/ML/gp.py", line 33, in fit
res = minimize(self.SE_NLL, gp_hp_guess, method='bfgs', jac=True)
File "/usr/lib/python3.5/site-packages/scipy/optimize/_minimize.py", line 441, in minimize
return _minimize_bfgs(fun, x0, args, jac, callback, **options)
File "/usr/lib/python3.5/site-packages/scipy/optimize/optimize.py", line 865, in _minimize_bfgs
old_fval, old_old_fval)
File "/usr/lib/python3.5/site-packages/scipy/optimize/optimize.py", line 706, in _line_search_wolfe12
old_fval, old_old_fval)
File "/usr/lib/python3.5/site-packages/scipy/optimize/linesearch.py", line 282, in line_search_wolfe2
phi, derphi, old_fval, old_old_fval, derphi0, c1, c2, amax)
File "/usr/lib/python3.5/site-packages/scipy/optimize/linesearch.py", line 379, in scalar_search_wolfe2
if (phi_a1 > phi0 + c1 * alpha1 * derphi0) or \
我省略了helper函数的源代码,因为当不使用梯度函数时NLL可以正常工作,并且它们共享相同的helper函数

当调用seu_der函数时,直接在事后传递优化参数(而不是在优化中实际使用梯度),它会按预期输出一个数字(或者至少我认为这是预期的),因此我无法发现问题


这个错误是我对scipy期望的雅可比函数的误解,还是其他什么?我试着翻阅Python源代码,但处理函数的实际函数调用隐藏在Github上Python代码中似乎没有的函数后面——我不确定它们是否在其他地方的私有/C++repos中。

查看侧栏。看到所有关于同一
值错误的问题了吗

尽管情况各不相同,但在几乎所有情况下,它都是在Python上下文中使用布尔数组的结果,该数组需要标量布尔值

一个简单的例子是

In [236]: if np.arange(10)>5:print('yes')
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-236-633002262b65> in <module>()
----> 1 if np.arange(10)>5:print('yes')

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
此时的代码期望
(phi_a1>phi0+c1*alpha1*derphi0)
(以及
后面的任何内容)为标量。其中一个变量可能是具有多个值的数组。诚然,这是在调用堆栈中发生的,因此很难将这些值追溯到代码中

着重于可变类型和形状的印刷品可能是最有用的。有时在这些迭代解算器上,代码在一个循环中运行良好,然后对数组进行一些变量更改,并在下一个循环中阻塞

==================


为什么要使用
np.matrix.trace
?在我的测试中,生成了一个二维单元素
np.matrix
。它是否会产生此值错误并不明显,但仍然值得怀疑。

为什么您认为服务器应该返回单个数字?梯度是一个向量,它的分量和变量的分量一样多(我看到三个变量:f_err,l_scale,n_err)。谢谢@Bookend。如果这是一篇博文,我会将其标记为被接受的答案,因为它证实了我在Rasmussen和Williams的书中错误地解释了对数可能性的导数,该导数是一个单一值(因此是matrix.trace)。这确实是导致问题的不正确形状,因此我将接受这一回答。我误解了我正在实现的等式中的一些东西,它将目标函数的导数作为单个值,所以我需要重新讨论一下。
In [236]: if np.arange(10)>5:print('yes')
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-236-633002262b65> in <module>()
----> 1 if np.arange(10)>5:print('yes')

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
if (phi_a1 > phi0 + c1 * alpha1 * derphi0) or \