scipy.differentiate.

hessian#

scipy.differentiate.hessian(f, x, *, tolerances=None, maxiter=10, order=8, initial_step=0.5, step_factor=2.0)[源代码]#

数值评估函数的 Hessian 矩阵。

参数:
f可调用对象

需要计算 Hessian 矩阵的函数。签名必须是

f(xi: ndarray) -> ndarray

其中 xi 的每个元素都是有限实数。 如果要微分的函数接受其他参数,请将其包装(例如,使用 functools.partiallambda),并将包装后的可调用对象传递给 hessianf 不能修改数组 xi。有关矢量化以及输入和输出的维度的信息,请参见“注释”。

x浮点数组形式

计算 Hessian 矩阵的点。必须至少具有一个维度。有关维度和矢量化的信息,请参见“注释”。

tolerances浮点数字典,可选

绝对和相对容差。字典的有效键是

  • atol - 导数的绝对容差

  • rtol - 导数的相对容差

res.error < atol + rtol * abs(res.df) 时,迭代将停止。默认 atol 是适当数据类型的最小正规数,默认 rtol 是适当数据类型的精度的平方根。

order整数,默认值:8

要使用的有限差分公式的(正整数)阶数。奇数将被向上舍入到下一个偶数。

initial_step浮点数,默认值:0.5

用于有限差分导数近似的(绝对)初始步长。

step_factor浮点数,默认值:2.0

步长在每次迭代中减少的因子;即,迭代 1 中的步长为 initial_step/step_factor。如果 step_factor < 1,则后续步骤将大于初始步骤;如果不需要小于某个阈值的步骤(例如,由于减法抵消误差),这可能会很有用。

maxiter整数,默认值:10

要执行的算法的最大迭代次数。请参见“注释”。

返回值:
res_RichResult

类似于 scipy.optimize.OptimizeResult 实例的对象,具有以下属性。这些描述的编写方式就好像这些值是标量;但是,如果 f 返回一个数组,则输出将是相同形状的数组。

success布尔数组

算法成功终止(状态为 0)的位置为 True;否则为 False

status整数数组

表示算法退出状态的整数。

  • 0:算法收敛到指定的容差。

  • -1:误差估计增加,因此终止迭代。

  • -2:达到最大迭代次数。

  • -3:遇到非有限值。

ddf浮点数组

如果算法成功终止,则 fx 处的 Hessian 矩阵。

error浮点数组

误差估计:Hessian 矩阵的当前估计值与上一次迭代中的估计值之差的幅度。

nfev整数数组

评估 f 的点的数量。

属性的每个元素都与 ddf 的相应元素关联。例如,nfev 的元素 [i, j] 是为了计算 ddf 的元素 [i, j] 而评估 f 的点的数量。

另请参阅

derivative, jacobian

注释

假设我们希望评估函数 \(f: \mathbf{R}^m \rightarrow \mathbf{R}\) 的 Hessian 矩阵,并且我们将正整数 \(m\) 的值分配给变量 m。如果我们希望在单个点评估 Hessian 矩阵,则

  • 参数 x 必须是形状为 (m,) 的数组

  • 参数 f 必须进行矢量化,以接受形状为 (m, ...) 的数组。第一个轴表示 \(f\)\(m\) 个输入;省略号表示的剩余轴用于在单个调用中评估多个横坐标处的函数。

  • 参数 f 必须返回形状为 (...) 的数组。

  • 结果对象的属性 dff 将是一个形状为 (m, m) 的数组,即 Hessian 矩阵。

此函数也以以下意义进行矢量化:Hessian 矩阵可以在单个调用中在 k 个点处进行评估。在这种情况下,x 将是形状为 (m, k) 的数组,f 将接受形状为 (m, ...) 的数组并返回形状为 (...) 的数组,并且结果的 ddf 属性将具有形状 (m, m, k)。请注意,与 k 个点关联的轴包含在由 (...) 表示的轴中。

目前,hessian 是通过嵌套调用 jacobian 来实现的。 传递给 hessian 的所有选项都用于内部和外部调用,只有一个例外:内部 jacobian 调用中使用的 rtol 被缩小了 100 倍,期望可以忽略内部误差。 因此,rtol 不应设置为小于 x 的 dtype 精度值的 100 倍; 否则会发出警告。

参考文献

[1]

黑塞矩阵,维基百科https://en.wikipedia.org/wiki/Hessian_matrix

示例

Rosenbrock 函数的映射关系为 \(\mathbf{R}^m \rightarrow \mathbf{R}\); SciPy 的实现 scipy.optimize.rosen 被向量化以接受形状为 (m, ...) 的数组,并返回形状为 ... 的数组。假设我们希望在 [0.5, 0.5, 0.5] 处评估黑塞矩阵。

>>> import numpy as np
>>> from scipy.differentiate import hessian
>>> from scipy.optimize import rosen, rosen_hess
>>> m = 3
>>> x = np.full(m, 0.5)
>>> res = hessian(rosen, x)
>>> ref = rosen_hess(x)  # reference value of the Hessian
>>> np.allclose(res.ddf, ref)
True

hessian 被向量化,以便在单个调用中评估多个点的黑塞矩阵。

>>> rng = np.random.default_rng()
>>> x = rng.random((m, 10))
>>> res = hessian(rosen, x)
>>> ref = [rosen_hess(xi) for xi in x.T]
>>> ref = np.moveaxis(ref, 0, -1)
>>> np.allclose(res.ddf, ref)
True