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.partial
或lambda
) 並將包裝後的可呼叫物件傳遞給hessian
。f 不得改變陣列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 陣列
如果演算法成功終止,則為 f 在 x 處的 Hessian 矩陣。
- errorfloat 陣列
誤差的估計值:目前 Hessian 矩陣的估計值與前一次迭代中的估計值之間的差異大小。
- nfevint 陣列
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]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