numpy.linalg.qr#

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

计算矩阵的 qr 分解.

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

参数:
aarray_like, shape (…, M, N)

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

mode{‘reduced’, ‘complete’, ‘r’, ‘raw’}, optional, default: ‘reduced’

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

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

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

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

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

选项 ‘reduced’,’complete’ 和 ‘raw’ 在 numpy 1.8 中是新增的,有关更多信息,请参见注释. 默认值为 ‘reduced’,并且为了保持与早期版本的 numpy 的向后兼容性,可以省略它和旧的默认值 ‘full’. 请注意,在 ‘raw’ 模式下返回的数组 h 是转置的,用于调用 Fortran. ‘economic’ 模式已弃用. 可以仅使用第一个字母传递模式 ‘full’ 和 ‘economic’ 以实现向后兼容性,但所有其他模式都必须拼写出来. 有关更多说明,请参见注释.

返回:
当 mode 为 ‘reduced’ 或 ‘complete’ 时,结果将是一个 namedtuple,具有
属性 QR .
Qndarray of float or complex, optional

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

Rndarray of float or complex, optional

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

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

数组 h 包含生成 q 和 r 的 Householder 反射器.tau 数组包含反射器的比例因子.在已弃用的 ‘economic’ 模式下,仅返回 h.

Raises:
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 中添加了 mode 的新 ‘reduced’,’complete’ 和 ‘raw’ 选项,旧选项 ‘full’ 已成为 ‘reduced’ 的别名.此外,选项 ‘full’ 和 ‘economic’ 已被弃用.由于 ‘full’ 是之前的默认值,而 ‘reduced’ 是新的默认值,因此可以通过让 mode 默认为 ‘reduced’ 来保持向后兼容性.添加 ‘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 中最小二乘最佳的 my0 是什么?(绘制这些点,你会看到它应该是 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.])