python - scipy.optimize.minimize 雅可比函数导致 'Value Error: The truth value of an array with more than one element is ambiguous'

标签 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 的梯度,就会出现错误。另请注意,虽然我在下面的 SE_der 函数(梯度/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 \

相关代码如下:

gp_hp_guess = [1.0] * 3 # initial guess
res = minimize(self.SE_NLL, gp_hp_guess, method='bfgs', jac=self.SE_der)

# other stuff

def SE_der(self, args):

    [f_err, l_scale, n_err] = args
    L = self.L_create(f_err, l_scale, n_err)
    alpha = linalg.solve(L.T, (linalg.solve(L, self.y))) # save for use with derivative func
    aaT = alpha.dot(alpha.T)
    K_inv = np.linalg.inv(L.T).dot(np.linalg.inv(L))
    # self.K_inv = np.linalg.inv(self.L.T).dot(np.linalg.inv(self.L))
    dK_dtheta = np.gradient(self.K_se(self.X, self.X, f_err, l_scale))[0]
    der = 0.5 * np.matrix.trace((aaT - K_inv).dot(dK_dtheta))
    return -der

def SE_NLL(self, args):

    [f_err, l_scale, n_err] = args
    L = self.L_create(f_err, l_scale, n_err)

    alpha = linalg.solve(L.T, (linalg.solve(L, self.y))) # save for use with derivative func
    nll = (
        0.5 * self.y.T.dot(alpha) + 
        np.matrix.trace(L) + # sum of diagonal
        L.shape[0]/2 * math.log(2*math.pi)
            )
    return nll

我省略了辅助函数的源代码,因为当不使用梯度函数时 NLL 工作正常,并且它们共享相同的辅助函数。

事后调用 SE_der 函数直接传入优化后的参数(而不是在优化中实际使用梯度)时,它会按预期输出单个数字(或者至少我认为这是预期的),所以我'未能发现问题。

这个错误是我对 scipy 对其雅可比函数的期望的误解,还是其他什么?我尝试挖掘 Python 源代码,但处理函数的实际函数调用隐藏在 Github 上的 Python 代码中似乎不存在的函数后面——我不确定它们是否在私有(private)/C++ 存储库中别处。

最佳答案

看侧边栏。查看关于相同 ValueError 的所有 SO 问题?

虽然情况各不相同,但在几乎所有情况下,都是在需要标量 bool 值的 Python 上下文中使用 bool 数组的结果。

一个简单的例子是

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()

np.arange(10)>5产生一个 bool 数组,np.array([False, False, ...]) .

组合 bool 表达式也可以产生这个。 np.arange(10)>5 | np.arange(10)<2产生这个,(np.arange(10)>5) | (np.arange(10)<2)不会——因为逻辑运算符的存在。使用 and而不是 |在这种情况下是没有希望的。

我会更详细地查看您的代码,但与此同时,这可能会帮助您自己找到问题。

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

来自错误堆栈:

if (phi_a1 > phi0 + c1 * alpha1 * derphi0) or \

此时的代码需要 (phi_a1 > phi0 + c1 * alpha1 * derphi0) (以及 or 之后的任何内容)成为标量。大概这些变量之一是具有多个值的数组。不可否认,这是在调用堆栈的下方发生的,因此很难将这些值追溯到您的代码。

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

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

为什么要使用 np.matrix.trace ?在我的测试中,生成一个 2d 单个元素 np.matrix .它会产生这个 ValueError 并不明显,但它仍然很可疑。

关于python - scipy.optimize.minimize 雅可比函数导致 'Value Error: The truth value of an array with more than one element is ambiguous',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38380022/

相关文章:

python 如何在不重新下载的情况下将 tika 与现有的 jar 文件一起使用

python - 使用 Chapel 处理海量矩阵

python - 全局变量是 None 而不是实例 - Python

python - cx_freeze python sqlite3 数据库在 build.exe 后不起作用?

tensorflow - 当数据集不平衡时多类分类的最佳损失函数?

machine-learning - WEKA GUI 中没有包管理器

python - 没有函数形式的给定数据集的泰勒展开式

machine-learning - 推理分析和预测分析有什么区别?

python - 在亚马逊 ec2 linux 微型实例上的 virtualenv 中安装 scipy 时遇到问题

scipy - 值错误 : invalid shape for input data points in griddata operation