scipy.optimize.

check_grad#

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

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

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

要检查其导数的函数。

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

func 的雅可比矩阵。

x0ndarray

使用 func 针对梯度的前向差分近似检查 grad 的点。

args*args, 可选

传递给 funcgrad 的额外参数。

epsilonfloat,可选

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

directionstr,可选

如果设置为 'random',则沿随机向量的梯度用于使用 func 针对前向差分近似检查 grad 。 默认情况下,它是 'all',在这种情况下,将考虑所有 one hot 方向向量来检查 grad。 如果 func 是一个向量值函数,则只能使用 'all'

rng{None, int, 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 是一个 int,则使用一个新的 RandomState 实例,并使用 seed 进行初始化。

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

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

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

返回:
errfloat

grad(x0, *args) 与使用 func 在 x0 点的 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