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”时,结果将是一个命名元组
属性QR
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 例程、zgeqrfdorgqr和 的接口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 + mxAx = 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) * blstsq

>>> 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.])