numpy.linalg.qr

linalg.qr(a, mode='reduced')[源代码]

计算矩阵的qr因子分解。

矩阵因子 a 作为 qr 在哪里 q 是正态的并且 r 是上三角形。

参数
a阵列状,形状(m,n)

要分解的矩阵。

mode{'reduced','complete','r','raw'},可选

如果k=min(m,n),则

  • “reduced”:返回带有尺寸(m,k),(k,n)的q,r(默认)

  • “complete”:返回带有尺寸(m,m),(m,n)的q,r

  • “r”:仅返回带有维度(k,n)的r

  • “raw”:返回h,tau和维数(n,m),(k,)

选项“reduced”、“complete”和“raw”在numpy 1.8中是新的,有关详细信息,请参见注释。默认值是“reduced”,为了保持与早期版本的numpy的向后兼容性,可以忽略它和旧默认值“full”。注意,在“raw”模式下返回的数组h被转换为调用fortran。不赞成“经济”模式。“完全”和“经济”模式可以只使用第一个字母传递,以实现向后兼容性,但必须对所有其他模式进行说明。更多说明请参见注释。

返回
q浮动或复杂的日数组,可选

具有正交列的矩阵。当mode='complete'时,结果是一个正交/一元矩阵,这取决于a是否为实/复矩阵。在这种情况下,行列式可以是+/-1。

r浮动或复杂的日数组,可选

上三角矩阵。

(H,τ)np.double或np.cdouble的天数,可选

数组h包含与r一起生成q的户主反射镜。tau数组包含反射镜的比例因子。在已弃用的“经济”模式中,只返回h。

加薪
LinAlgError

如果保理失败。

参见

scipy.linalg.qr

在SciPy中有类似的功能。

scipy.linalg.rq

计算矩阵的RQ分解。

笔记

这是到LAPACK例程的接口 dgeqrfzgeqrfdorgqrzungqr .

有关QR分解的更多信息,请参见例如:https://en.wikipedia.org/wiki/QR_factorization

亚类 ndarray 保留,但“原始”模式除外。所以如果 a 属于类型 matrix ,所有返回值也将是矩阵。

在numpy 1.8.0中添加了模式的新“reduced”、“complete”和“raw”选项,并将旧选项“full”作为“reduced”的别名。此外,选项“full”和“economic”被弃用。因为“full”是以前的默认值,“reduced”是新的默认值,所以可以通过 mode 违约。增加了“raw”选项,这样就可以使用lapack例程,使用户主反射镜将数组乘以q。注意,在这种情况下,返回的数组是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

示例说明了 qr :解决最小二乘问题

最小二乘法最好是什么 my0 在里面 y = y0 + mx 对于以下数据:(0,1)、(1,0)、(1,2)、(2,1)。(画出点的图形,你会发现它应该是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, 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])