本文简要介绍 python 语言中 numpy.linalg.qr
的用法。
用法:
linalg.qr(a, mode='reduced')
计算矩阵的 qr 分解。
将矩阵 a 分解为 qr,其中 q 是正交矩阵,r 是上三角矩阵。
- a: 数组,形状(…,M,N)
维数至少为 2 的类数组对象。
- mode: {‘reduced’, ‘complete’, ‘r’, ‘raw’},可选
如果 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’ 可以仅使用第一个字母传递以实现向后兼容性,但必须拼写所有其他字母。有关更多说明,请参阅注释。
- q: 浮点数或复数的ndarray,可选
具有正交列的矩阵。当 mode = ‘complete’ 时,结果是正交/酉矩阵,具体取决于 a 是否为实数/复数。在这种情况下,行列式可能是 +/- 1。如果输入数组中的维数大于 2,则返回具有上述属性的矩阵堆栈。
- r: 浮点数或复数的ndarray,可选
如果输入数组的维数大于 2,则为上三角矩阵或上三角矩阵堆栈。
- (h, tau): np.double 或 np.cdouble 的 ndarrays,可选
数组 h 包含生成 q 和 r 的 Householder 反射器。 tau 阵列包含反射器的比例因子。在已弃用的‘economic’ 模式中,仅返回 h。
- LinAlgError
如果保理失败。
参数:
返回:
抛出:
注意:
这是 LAPACK 例程
dgeqrf
、zgeqrf
、dorgqr
和zungqr
的接口。有关 qr 分解的更多信息,请参见例如:https://en.wikipedia.org/wiki/QR_factorization
的子类numpy.ndarray除‘raw’ 模式外,均保留。因此,如果a是类型numpy.matrix,所有的返回值也将是矩阵。
NumPy 1.8.0 中添加了新的 ‘reduced’, ‘complete’ 和 ‘raw’ 模式选项,旧选项 ‘full’ 被设为 ‘reduced’ 的别名。此外,选项 ‘full’ 和 ‘economic’ 已弃用。由于 ‘full’ 是以前的默认值,而 ‘reduced’ 是新的默认值,因此可以通过让模式默认来保持向后兼容性。添加了 ‘raw’ 选项,以便可以使用可以使用 Householder 反射器将数组乘以 q 的 LAPACK 例程。请注意,在这种情况下,返回的数组的类型为 np.double 或 np.cdouble,并且 h 数组被转置为与 FORTRAN 兼容。 numpy 目前没有公开使用 ‘raw’ 返回的例程,但lapack_lite 中提供了一些例程,只是等待必要的工作。
例子:
>>> a = np.random.randn(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
常见用法的示例:解决最小二乘问题least-squares-best 是什么m和y0在
y = y0 + mx
对于以下数据:{(0,1), (1,0), (1,2), (2,1)}。 (绘制点,你会看到它应该是 y0 = 0,m = 1。)答案是通过求解over-determined 矩阵方程得到的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, 0, 2, 1]) >>> q, r = np.linalg.qr(A) >>> p = np.dot(q.T, b) >>> np.dot(np.linalg.inv(r), p) array([ 1.1e-16, 1.0e+00])
相关用法
- Python numpy linalg.svd用法及代码示例
- Python numpy linalg.pinv用法及代码示例
- Python numpy linalg.eigh用法及代码示例
- Python numpy linalg.tensorinv用法及代码示例
- Python numpy linalg.LinAlgError用法及代码示例
- Python numpy linalg.matrix_rank用法及代码示例
- Python numpy linalg.solve用法及代码示例
- Python numpy linalg.det用法及代码示例
- Python numpy linalg.cond用法及代码示例
- Python numpy linalg.inv用法及代码示例
- Python numpy linalg.eig用法及代码示例
- Python numpy linalg.lstsq用法及代码示例
- Python numpy linalg.norm用法及代码示例
- Python numpy linalg.slogdet用法及代码示例
- Python numpy linalg.multi_dot用法及代码示例
- Python numpy linalg.tensorsolve用法及代码示例
- Python numpy linalg.matrix_power用法及代码示例
- Python numpy linalg.cholesky用法及代码示例
- Python numpy linalg.eigvals用法及代码示例
- Python numpy linalg.eigvalsh用法及代码示例
- Python numpy linspace用法及代码示例
- Python numpy lib.NumpyVersion用法及代码示例
- Python numpy lib.Arrayterator用法及代码示例
- Python numpy legendre.legint用法及代码示例
- Python numpy laguerre.lagone用法及代码示例
注:本文由纯净天空筛选整理自numpy.org大神的英文原创作品 numpy.linalg.qr。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。