jax.scipy.linalg.polar

目录

jax.scipy.linalg.polar#

jax.scipy.linalg.polar(a, side='right', *, method='qdwh', eps=None, max_iterations=None)[源代码][源代码]#

计算极分解。

给定 \(m imes n\) 矩阵 \(a\),返回极分解的因子 \(u`(也是 :math:`m imes n\))和 \(p\),使得 \(a = up`(如果 side 是 `\)”right”;:math:`p` :math:`n        imes n`)或 :math:`a = pu`(如果 side ``"left"\(p\)\(m imes 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 imes n\)

  • side (str) – 确定计算的是右极分解还是左极分解。如果 side"right"\(a = up\)。如果 side"left"\(a = pu\)。默认值是 "right"

  • method (str) – 确定所使用的算法,如上所述。

  • precisionPrecision 对象指定矩阵乘法的精度。

  • 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 的大小取决于 side"right" 还是 "left",分别为 \(n \times n\)\(m \times m\)

返回类型:

tuple[Array, Array]

示例

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)