jax.scipy.linalg.polar#
- jax.scipy.linalg.polar(a, side='right', *, method='qdwh', eps=None, max_iterations=None)[原始碼]#
計算極分解。
給定 \(m \times n\) 矩陣 \(a\),傳回極分解的因子 \(u\) (也是 \(m \times n\)) 和 \(p\),使得 \(a = up\) (如果 side 為
"right"
;\(p\) 為 \(n \times n\)) 或 \(a = pu\) (如果 side 為"left"
;\(p\) 為 \(m \times m\)),其中 \(p\) 是半正定矩陣。如果 \(a\) 是非奇異矩陣,則 \(p\) 是正定矩陣且分解是唯一的。\(u\) 具有正交列,除非 \(n > m\),在這種情況下,它具有正交行。將 \(a\) 的 SVD 寫成 \(a = u_\mathit{svd} \cdot s_\mathit{svd} \cdot v^h_\mathit{svd}\),我們有 \(u = u_\mathit{svd} \cdot v^h_\mathit{svd}\)。因此,么正因子 \(u\) 可以建構為符號函數應用於 \(a\) 的奇異值;或者,如果 \(a\) 是 Hermitian 矩陣,則應用於特徵值。
存在幾種計算極分解的方法。目前支援兩種方法
method="svd"
:計算 \(a\) 的 SVD,然後形成 \(u = u_\mathit{svd} \cdot v^h_\mathit{svd}\)。
method="qdwh"
:應用 QDWH (基於 QR 的動態加權 Halley) 演算法。
- 參數:
a (ArrayLike) – \(m \times n\) 輸入矩陣。
side (str) – 決定計算右極分解還是左極分解。如果
side
為"right"
則 \(a = up\)。如果side
為"left"
則 \(a = pu\)。預設值為"right"
。method (str) – 決定使用的演算法,如上所述。
precision –
Precision
物件,指定矩陣乘法精度。eps (float | None) – 最終結果將滿足 \(\left|x_k - x_{k-1}\right| < \left|x_k\right| (4\epsilon)^{\frac{1}{3}}\),其中 \(x_k\) 是 QDWH 迭代。如果
method
不是"qdwh"
,則忽略。max_iterations (int | None) – 即使不滿足上述條件,迭代也會在此步驟數後終止。如果
method
不是"qdwh"
,則忽略。
- 傳回值:
一個
(么正, 正定)
元組,其中么正
是么正因子 (\(m \times n\)),而正定
是半正定因子。正定
要么是 \(n \times n\) 要么是 \(m \times m\),具體取決於side
是"right"
還是"left"
。- 傳回型別:
範例
3x3 矩陣的極分解
>>> a = jnp.array([[1., 2., 3.], ... [5., 4., 2.], ... [3., 2., 1.]]) >>> U, P = jax.scipy.linalg.polar(a)
U 是么正矩陣
>>> jnp.round(U.T @ U) Array([[ 1., -0., -0.], [-0., 1., 0.], [-0., 0., 1.]], dtype=float32)
P 是半正定矩陣
>>> with jnp.printoptions(precision=2, suppress=True): ... print(P) [[4.79 3.25 1.23] [3.25 3.06 2.01] [1.23 2.01 2.91]]
原始矩陣可以通過將 U 和 P 相乘來重建
>>> a_reconstructed = U @ P >>> jnp.allclose(a, a_reconstructed) Array(True, dtype=bool)