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.partial
或lambda
),并将包装后的可调用对象传递给hessian
。 f 不能修改数组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浮点数组
如果算法成功终止,则 f 在 x 处的 Hessian 矩阵。
- error浮点数组
误差估计:Hessian 矩阵的当前估计值与上一次迭代中的估计值之差的幅度。
- nfev整数数组
评估 f 的点的数量。
属性的每个元素都与 ddf 的相应元素关联。例如,nfev 的元素
[i, j]
是为了计算 ddf 的元素[i, j]
而评估 f 的点的数量。
另请参阅
注释
假设我们希望评估函数 \(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]示例
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