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’ 时,结果将是一个命名元组.
- 属性 Q 和 R.
- 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 例程
dgeqrf
、zgeqrf
、dorgqr
和zungqr
的接口.有关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
中,最优的 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.])