numpy.linalg.qr#

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

计算矩阵的qr分解.

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

参数:
aarray_like, 形状 (…, M, N)

一个类似数组的对象,其维数至少为2.

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

如果 K = min(M, N),那么

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

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

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

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

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

返回:
当模式为 ‘reduced’ 或 ‘complete’ 时,结果将是一个命名元组.
属性 QR.
Qfloat 或 complex 的 ndarray,可选

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

Rfloat 或 complex 的 ndarray,可选

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

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

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

引发:
LinAlgError

如果因式分解失败.

参见

scipy.linalg.qr

SciPy 中的类似功能.

scipy.linalg.rq

计算矩阵的 RQ 分解.

备注

这是一个对 LAPACK 例程 dgeqrfzgeqrfdorgqrzungqr 的接口.

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

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

在 NumPy 1.8.0 中为模式添加了新的 ‘reduced’、’complete’ 和 ‘raw’ 选项,旧选项 ‘full’ 被设为 ‘reduced’ 的别名.此外,选项 ‘full’ 和 ‘economic’ 已被弃用.由于 ‘full’ 是之前的默认值,而 ‘reduced’ 是新的默认值,通过让 mode 默认值可以保持向后兼容性.添加了 ‘raw’ 选项,以便可以使用可以乘以 q 数组的 LAPACK 例程,这些数组使用 Householder 反射器.请注意,在这种情况下,返回的数组类型为 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.])