scipy.differentiate.

hessian#

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

數值計算函數的 Hessian 矩陣。

參數:
f可呼叫物件

想要計算 Hessian 矩陣的函數。簽名必須是

f(xi: ndarray) -> ndarray

其中 xi 的每個元素都必須是有限實數。如果想要微分的函數接受額外參數,請將其包裝 (例如使用 functools.partiallambda) 並將包裝後的可呼叫物件傳遞給 hessianf 不得改變陣列 xi。請參閱「Notes」章節關於向量化以及輸入和輸出的維度的說明。

xfloat 類陣列

計算 Hessian 矩陣的點。必須至少有一個維度。請參閱「Notes」章節關於維度和向量化的說明。

tolerances浮點數字典,選用

絕對和相對容差。字典的有效鍵為

  • atol - 導數的絕對容差

  • rtol - 導數的相對容差

res.error < atol + rtol * abs(res.df) 時,迭代將停止。預設的 atol 是適當 dtype 的最小正規數,而預設的 rtol 是適當 dtype 精度的平方根。

orderint,預設值:8

要使用的有限差分公式的(正整數)階數。奇數整數將向上捨入到下一個偶數整數。

initial_stepfloat,預設值:0.5

用於有限差分導數近似的(絕對)初始步長。

step_factorfloat,預設值:2.0

每次迭代中步長減少的因子;也就是說,迭代 1 中的步長為 initial_step/step_factor。如果 step_factor < 1,則後續步驟將大於初始步長;如果小於某個閾值的步長是不希望出現的(例如,由於減法抵消誤差),這可能會很有用。

maxiterint,預設值:10

要執行的演算法的最大迭代次數。請參閱「Notes」章節。

返回:
res_RichResult

一個類似於 scipy.optimize.OptimizeResult 實例的物件,具有以下屬性。描述的寫法就好像值是純量一樣;但是,如果 f 返回陣列,則輸出將是相同形狀的陣列。

successbool 陣列

True 如果演算法成功終止(狀態 0);否則為 False

statusint 陣列

一個表示演算法退出狀態的整數。

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

  • -1 : 誤差估計值增加,因此迭代終止。

  • -2 : 已達到最大迭代次數。

  • -3 : 遇到非有限值。

ddffloat 陣列

如果演算法成功終止,則為 fx 處的 Hessian 矩陣。

errorfloat 陣列

誤差的估計值:目前 Hessian 矩陣的估計值與前一次迭代中的估計值之間的差異大小。

nfevint 陣列

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]

Hessian 矩陣,維基百科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] 處評估 Hessian 矩陣。

>>> 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 已向量化,可在單次呼叫中評估多個點的 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