numpy.linalg.qr

原文:https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.qr.html

译者:飞龙 UsyiyiCN

校对:(虚位以待)

numpy.linalg.qr(a, mode='reduced')[source]

计算矩阵的qr因式分解。

将矩阵a定义为qr,其中q是正交的,r是上三角形。

参数:

a:array_like,shape(M,N)

矩阵作为因子。

mode:{'reduced','complete','r','raw','full','economic'

如果K = min(M,N),那么

'reduced':返回具有维度(M,K),(K,N)(默认)的q,r' r返回h从'原始':返回h从'原始':返回h从'原始'返回h' ,已弃用。

选项“reduced”,“complete”和“raw”在numpy 1.8中是新增的,有关详细信息,请参见注释。默认值是'reduced',并且为了保持与numpy的早期版本的向后兼容性,它和旧的默认'full'可以省略。注意,以'原始'模式返回的数组h被转置以调用Fortran。“经济”模式已被弃用。模式“完全”和“经济”可以仅使用第一个字母向后兼容,但所有其他必须拼写出来。有关更多说明,请参阅注释。

返回:

q:float或complex的ndarray,可选

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

r:浮点数或复数的数组,可选

上三角矩阵。

(h,tau):n.pdouble或np.cdouble的ndarrays,可选

数组h包含产生q和R的Householder反射器。 tau数组包含反射器的缩放因子。在已弃用的“经济”模式中,仅返回h。

上升:

LinAlgError

如果分解失败。

笔记

这是LAPACK例程dgeqrf,zgeqrf,dorgqr和zungqr的接口。

有关qr因式分解的更多信息,请参见例如:http://en.wikipedia.org/wiki/QR_factorization

ndarray的子类保留,除了“raw”模式。因此,如果a的类型为matrix,所有返回值都将是矩阵。

在Numpy 1.8中添加了用于模式的新'reduced','complete'和'raw'选项,旧选项'full'被作为'reduced'的别名。此外,期权“完全”和“经济”被废弃。因为“full”是以前的默认值,“reduced”是新的默认值,所以通过让mode默认值可以保持向后兼容性。添加了'raw'选项,以便可以使用可以使用Householder反射器将数组乘以q的LAPACK例程。请注意,在这种情况下,返回的数组类型为np.double或np.cdouble,h数组转置为FORTRAN兼容。没有使用'raw'返回的例程目前由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')
>>> r3 = np.linalg.qr(a, mode='economic')
>>> np.allclose(r, r2)  # mode='r' returns the same r as mode='full'
True
>>> # But only triu parts are guaranteed equal when mode='economic'
>>> np.allclose(r, np.triu(r3[:6,:6], k=0))
True

示例说明qr的常见用法:求解最小二乘问题

What are the least-squares-best m and y0 in y = y0 + mx for the following data: {(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) t3 > * (qT) * 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 = LA.qr(A)
>>> p = np.dot(q.T, b)
>>> np.dot(LA.inv(r), p)
array([  1.1e-16,   1.0e+00])