numpy.linalg.qr #
- 利纳尔格。qr ( a , mode = 'reduced' ) [来源] #
计算矩阵的 qr 分解。
将矩阵a分解为qr,其中q是正交矩阵,r是上三角矩阵。
- 参数:
- 类似数组,形状 (..., M, N)
维数至少为 2 的类数组对象。
- 模式{'reduced', 'complete', 'r', 'raw'}, 可选
如果 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 早期版本的向后兼容性,它和旧的默认值“full”都可以被省略。请注意,以“原始”模式返回的数组 h 已转置以调用 Fortran。 “经济”模式已被弃用。为了向后兼容,可以仅使用第一个字母来传递“完整”和“经济”模式,但必须拼写出所有其他模式。请参阅注释以获取更多说明。
- 返回:
- 当模式为“reduced”或“complete”时,结果将是一个命名元组
- 属性Q和R。
- Q浮点数或复数的 ndarray,可选
具有正交列的矩阵。当 mode = 'complete' 时,结果是一个正交/酉矩阵,具体取决于 a 是否为实数/复数。在这种情况下,行列式可以是+/-1。如果输入数组中的维数大于 2,则返回具有上述属性的矩阵堆栈。
- R ndarray 浮点数或复数,可选
如果输入数组的维数大于 2,则为上三角矩阵或上三角矩阵堆栈。
- (h, tau) np.double 或 np.cdouble 的 ndarrays,可选
数组 h 包含生成 q 和 r 的 Householder 反射器。 tau 阵列包含反射器的缩放因子。在已弃用的“经济”模式中,仅返回 h。
- 加薪:
- 林算法错误
如果保理失败。
也可以看看
scipy.linalg.qr
SciPy 中的类似功能。
scipy.linalg.rq
计算矩阵的 RQ 分解。
笔记
dgeqrf
这是 LAPACK 例程、zgeqrf
、dorgqr
和 的接口zungqr
。有关 qr 分解的更多信息,请参阅例如: https://en.wikipedia.org/wiki/QR_factorization
ndarray
除“原始”模式外,的子类均被保留。因此,如果 a 的类型为matrix
,则所有返回值也将是矩阵。NumPy 1.8.0 中添加了新的模式“reduced”、“complete”和“raw”选项,旧选项“full”被设为“reduced”的别名。此外,“完整”和“经济”选项已被弃用。因为“full”是以前的默认值,“reduced”是新的默认值,所以可以通过让模式默认来保持向后兼容性。添加了“raw”选项,以便可以使用可以使用 Householder 反射器将数组乘以 q 的 LAPACK 例程。请注意,在这种情况下,返回的数组的类型为 np.double 或 np.cdouble,并且 h 数组被转置为 FORTRAN 兼容。 numpy 当前没有公开使用“原始”返回的例程,但 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
:解决最小二乘问题以下数据的最小二乘最佳 m 和 y0 是多少:{(0,1), (1,0), (1,2), ( 2,1 ) } 。(画出这些点,您会发现它应该是 y0 = 0,m = 1。)答案是通过求解超定矩阵方程 来提供的,其中:
y = y0 + mx
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 实现),则。 (然而,在 numpy 实践中,我们只是使用。)
x = inv(R) * (Q.T) * b
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.])