scipy.optimize.

check_grad#

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

透過將梯度函數與梯度的(前向)有限差分近似值進行比較,來檢查梯度函數的正確性。

參數:
funccallable func(x0, *args)

要檢查其導數的函數。

gradcallable grad(x0, *args)

func 的 Jacobian 矩陣。

x0ndarray

用於檢查 grad 相對於使用 func 的 grad 前向差分近似值的點。

args\*args, optional

傳遞給 funcgrad 的額外參數。

epsilonfloat, optional

用於有限差分近似的步長大小。預設值為 sqrt(np.finfo(float).eps),約為 1.49e-08。

directionstr, optional

如果設定為 'random',則沿著隨機向量的梯度會用於檢查 grad 相對於使用 func 的前向差分近似值。預設值為 'all',在這種情況下,會考慮所有 one-hot 方向向量來檢查 grad。如果 func 是向量值函數,則只能使用 'all'

rng{None, int, numpy.random.Generator}, optional

如果 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 中變更: 作為從使用 numpy.random.RandomState 過渡到 numpy.random.GeneratorSPEC-007 轉換的一部分,此關鍵字已從 seed 變更為 rng。在過渡期間,這兩個關鍵字將繼續運作,但一次只能指定一個。在過渡期之後,使用 seed 關鍵字的函數呼叫將發出警告。 seedrng 的行為都在上面概述,但在新程式碼中應僅使用 rng 關鍵字。

產生的隨機數會影響計算梯度以檢查 grad 的隨機向量。請注意,僅當 direction 參數設定為 ‘random’ 時,才會使用 rng

返回:
errfloat

grad(x0, *args) 與在點 x0 使用 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