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 中的新增功能,更多信息请参阅 notes。默认值为 ‘reduced’,为保持与早期 numpy 版本的向后兼容性,可以省略它和旧的默认值 ‘full’。请注意,在‘raw’模式下返回的数组 h 是转置的,以便调用 Fortran。‘economic’模式已弃用。为了向后兼容,可以使用‘full’和‘economic’模式的首字母,但其他模式必须拼写完整。更多解释请参阅 Notes。
- 返回:
- Qndarray of float or complex, optional
一个具有正交列的矩阵。当 mode = ‘complete’ 时,结果是一个正交/酉矩阵,具体取决于 a 是否为实数/复数。在这种情况下,行列式可能为 +/- 1。如果输入数组的维数大于 2,则返回上述属性的矩阵堆栈。
- Rndarray of float or complex, optional
上三角矩阵,如果输入数组的维数大于 2,则为上三角矩阵的堆栈。
- (h, tau)ndarrays of np.double or np.cdouble, optional
数组 h 包含生成 q 和 r 的 Householder 反射。tau 数组包含反射的缩放因子。在已弃用的‘economic’模式下,只返回 h。
- 引发:
- LinAlgError
如果分解失败。
另请参阅
scipy.linalg.qrSciPy 中的类似函数。
scipy.linalg.rq计算矩阵的 RQ 分解。
备注
当 mode 为 ‘reduced’ 或 ‘complete’ 时,结果将是一个命名元组,包含属性
Q和R。这是 LAPACK 例程
dgeqrf,zgeqrf,dorgqr和zungqr的接口。有关 QR 分解的更多信息,请参阅例如:https://en.wikipedia.org/wiki/QR_factorization
除‘raw’模式外,
ndarray的子类均会被保留。因此,如果 a 是matrix类型,则所有返回值也将是矩阵。NumPy 1.8.0 中新增了 mode 的‘reduced’、‘complete’和‘raw’选项,旧选项‘full’被设置为‘reduced’的别名。此外,‘full’和‘economic’选项已被弃用。由于‘full’是之前的默认值,而‘reduced’是新的默认值,可以通过让 mode 保持默认值来维持向后兼容性。添加‘raw’选项是为了能够使用可以利用 Householder 反射矩阵与数组相乘的 LAPACK 例程。请注意,在这种情况下,返回的数组类型为 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.])