scipy.optimize.

check_grad#

scipy.optimize.check_grad(func, grad, x0, *args, epsilon=np.float64(1.4901161193847656e-08), direction='all', rng=None)[源码]#

通过将梯度函数与梯度的(前向)有限差分近似进行比较,检查其正确性。

参数:
func可调用对象 func(x0, *args)

要检查其导数的函数。

grad可调用对象 grad(x0, *args)

func 的雅可比矩阵。

x0ndarray

检查 grad 与使用 func 计算的梯度前向差分近似的点。

args\*args,可选

传递给 funcgrad 的额外参数。

epsilon浮点数,可选

用于有限差分近似的步长。它默认为 sqrt(np.finfo(float).eps),约等于 1.49e-08。

direction字符串,可选

如果设置为 'random',则使用沿随机向量的梯度来检查 grad 与使用 func 的前向差分近似。默认情况下为 'all',此时,所有独热方向向量都用于检查 grad。如果 func 是一个向量值函数,则只能使用 'all'

rng{None, 整数, numpy.random.Generator},可选

如果 rng 通过关键字传递,则除 numpy.random.Generator 之外的类型将传递给 numpy.random.default_rng 以实例化一个 Generator。如果 rng 已经是一个 Generator 实例,则使用提供的实例。指定 rng 以获得可重复的函数行为。

如果此参数按位置传递,或者 seed 通过关键字传递,则适用于参数 seed 的旧行为。

  • 如果 seed 为 None(或 numpy.random),则使用 numpy.random.RandomState 单例。

  • 如果 seed 是一个整数,则使用一个新的 RandomState 实例,并以 seed 作为种子。

  • 如果 seed 已经是一个 GeneratorRandomState 实例,则使用该实例。

自 1.15.0 版本修改: 作为 SPEC-007 从使用 numpy.random.RandomState 过渡到 numpy.random.Generator 的一部分,此关键字从 seed 更改为 rng。在过渡期间,这两个关键字将继续有效,但一次只能指定一个。过渡期结束后,使用 seed 关键字的函数调用将发出警告。seedrng 的行为如上所述,但新代码中应只使用 rng 关键字。

生成的随机数会影响计算梯度以检查 grad 的随机向量。请注意,rng 仅在 direction 参数设置为 ‘random’ 时使用。

返回:
err浮点数

在点 x0 处,grad(x0, *args) 与使用 func 的 grad 的有限差分近似之间的差的平方和的平方根(即 2-范数)。

另请参阅

approx_fprime

示例

>>> import numpy as np
>>> def func(x):
...     return x[0]**2 - 0.5 * x[1]**3
>>> def grad(x):
...     return [2 * x[0], -1.5 * x[1]**2]
>>> from scipy.optimize import check_grad
>>> check_grad(func, grad, [1.5, -1.5])
2.9802322387695312e-08  # may vary
>>> rng = np.random.default_rng()
>>> check_grad(func, grad, [1.5, -1.5],
...             direction='random', seed=rng)
2.9802322387695312e-08