numpy.linalg.qr#

linalg.qr(a, mode='reduced')[源]#

计算矩阵的 QR 分解。

将矩阵 a 分解为 qr,其中 q 是正交的,r 是上三角的。

参数:
a类数组对象, 形状 (…, M, N)

维度至少为 2 的类数组对象。

mode{‘reduced’, ‘complete’, ‘r’, ‘raw’}, 可选, 默认: ‘reduced’

如果 K = min(M, N),则

  • ‘reduced’ : 返回维度为 (…, M, K), (…, K, N) 的 Q, R

  • ‘complete’ : 返回维度为 (…, M, M), (…, M, N) 的 Q, R

  • ‘r’ : 仅返回维度为 (…, K, N) 的 R

  • ‘raw’ : 返回维度为 (…, N, M), (…, K,) 的 h, tau

选项 ‘reduced’、‘complete’ 和 ‘raw’ 是 numpy 1.8 中新增的,更多信息请参阅注释。默认值为 ‘reduced’,为了与早期版本的 numpy 保持向后兼容性,可以省略它和旧的默认值 ‘full’。请注意,‘raw’ 模式下返回的数组 h 是转置的,以适应 Fortran 调用。‘economic’ 模式已弃用。为了向后兼容性,模式 ‘full’ 和 ‘economic’ 可以仅使用首字母传递,但所有其他模式必须完整拼写。更多说明请参阅注释。

返回:
当模式为 ‘reduced’ 或 ‘complete’ 时,结果将是一个具有
属性 QR 的命名元组。
Q浮点型或复数型的 ndarray, 可选

具有正交列的矩阵。当 mode = ‘complete’ 时,结果是一个正交/酉矩阵,具体取决于 *a* 是实数还是复数。在这种情况下,行列式可能为 +/- 1。如果输入数组的维度大于 2,则返回具有上述属性的矩阵堆栈。

R浮点型或复数型的 ndarray, 可选

上三角矩阵,如果输入数组的维度大于 2,则为上三角矩阵的堆栈。

(h, tau)np.double 或 np.cdouble 类型的 ndarray, 可选

数组 h 包含与 r 一起生成 q 的 Householder 反射器。tau 数组包含反射器的缩放因子。在已弃用的 ‘economic’ 模式中,只返回 h。

引发:
LinAlgError

如果分解失败。

另请参阅

scipy.linalg.qr

SciPy 中的类似函数。

scipy.linalg.rq

计算矩阵的 RQ 分解。

注释

这是 LAPACK 例程 dgeqrf, zgeqrf, dorgqrzungqr 的接口。

有关 QR 分解的更多信息,例如请参阅:https://en.wikipedia.org/wiki/QR_factorization

ndarray 的子类除了 ‘raw’ 模式外都会被保留。因此,如果 a 的类型是 matrix,所有返回值也将是矩阵。

NumPy 1.8.0 中新增了 ‘reduced’、‘complete’ 和 ‘raw’ 模式选项,旧的 ‘full’ 选项成为了 ‘reduced’ 的别名。此外,‘full’ 和 ‘economic’ 选项已被弃用。由于 ‘full’ 是以前的默认值,而 ‘reduced’ 是新的默认值,可以通过让 mode 保持默认值来保持向后兼容性。添加 ‘raw’ 选项是为了可以使用 LAPACK 例程,这些例程能够使用 Householder 反射器将数组乘以 q。请注意,在这种情况下,返回的数组类型为 np.double 或 np.cdouble,并且 h 数组已转置以兼容 FORTRAN。目前 numpy 没有公开使用 ‘raw’ 返回的例程,但 lapack_lite 中有一些可用的,只需等待必要的工作。

示例

>>> import numpy as np
>>> rng = np.random.default_rng()
>>> a = rng.normal(size=(9, 6))
>>> Q, R = np.linalg.qr(a)
>>> np.allclose(a, np.dot(Q, R))  # a does equal QR
True
>>> R2 = np.linalg.qr(a, mode='r')
>>> np.allclose(R, R2)  # mode='r' returns the same R as mode='full'
True
>>> a = np.random.normal(size=(3, 2, 2)) # Stack of 2 x 2 matrices as input
>>> Q, R = np.linalg.qr(a)
>>> Q.shape
(3, 2, 2)
>>> R.shape
(3, 2, 2)
>>> np.allclose(a, np.matmul(Q, R))
True

示例说明 qr 的常见用法:求解最小二乘问题

对于以下数据:{(0,1), (1,0), (1,2), (2,1)},`y = y0 + mx` 中最小二乘意义上的最佳 *m* 和 *y0* 是什么?(绘制这些点,你会发现 y0 应该是 0,m 应该是 1。) 答案通过求解超定矩阵方程 `Ax = b` 得到,其中

A = array([[0, 1], [1, 1], [1, 1], [2, 1]])
x = array([[y0], [m]])
b = array([[1], [0], [2], [1]])

如果 A = QR 使得 Q 是正交的(通过 Gram-Schmidt 总是可能的),那么 `x = inv(R) * (Q.T) * b`。(然而,在 numpy 实践中,我们通常直接使用 lstsq。)

>>> A = np.array([[0, 1], [1, 1], [1, 1], [2, 1]])
>>> A
array([[0, 1],
       [1, 1],
       [1, 1],
       [2, 1]])
>>> b = np.array([1, 2, 2, 3])
>>> Q, R = np.linalg.qr(A)
>>> p = np.dot(Q.T, b)
>>> np.dot(np.linalg.inv(R), p)
array([  1.,   1.])