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\) 是埃尔米特矩阵,则对特征值应用符号函数。
存在几种计算极分解的方法。目前支持两种:
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"
,则忽略此参数。
- 返回:
一个
(unitary, posdef)
元组,其中unitary
是酉因子 (\(m \times n\)),而posdef
是半正定因子。posdef
是 \(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)