numpy.linalg.qr#
- linalg.qr(a, mode='reduced')[源代码]#
计算矩阵的 qr 分解.
将矩阵 a 分解为 qr,其中 q 是正交矩阵, r 是上三角矩阵.
- 参数:
- aarray_like, shape (…, M, N)
具有至少 2 个维度的类数组对象.
- 模式{‘reduced’, ‘complete’, ‘r’, ‘raw’}, optional, default: ‘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” 模式可以仅使用第一个字母传递以实现向后兼容,但所有其他模式都必须拼写出来.有关更多说明,请参见“注释”.
- 返回:
- 当 mode 为 ‘reduced’ 或 ‘complete’ 时,结果将是一个 namedtuple,
- 具有属性 Q 和 R .
- 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 分解.
注释
这是 LAPACK 例程
dgeqrf,zgeqrf,dorgqr和zungqr的接口.有关 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 默认为来保持向后兼容性. 添加 ‘raw’ 选项是为了可以使用 Householder 反射器将数组乘以 q 的 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.])