NumPy参考 >例行程序 >线性代数(numpy.linalg) > numpy.linalg.qr
numpy.linalg.
qr
(a,mode ='reduced' )[源代码] ¶计算矩阵的qr因式分解。
将矩阵a分解为qr,其中q是正交的,r是上三角的。
矩阵要分解。
如果K = min(M,N),则
'reduced':返回尺寸为(M,K),(K,N)的q,r(默认)
'complete':返回尺寸为(M,M),(M,N)的q,r
'r':仅返回尺寸为(K,N)的r
'raw':返回尺寸为(N,M),(K,)的h,tau
numpy 1.8中新增了“ reduced”,“ complete”和“ raw”选项,有关更多信息,请参见注释。默认值是'reduced',并且为了保持与numpy早期版本的向后兼容性,可以忽略它和旧的默认值'full'。请注意,以“原始”模式返回的数组h已转置以调用Fortran。不建议使用“经济”模式。为了向后兼容,可以仅使用第一个字母来传递“完全”和“经济”模式,但是必须清楚说明所有其他模式。有关更多说明,请参见注释。
具有正交列的矩阵。当mode ='complete'时,结果取决于是否为实数/复数为正交/ unit矩阵。在这种情况下,行列式可以为+/- 1。
上三角矩阵。
数组h包含与q一起生成q的Householder反射器。tau数组包含反射器的比例因子。在已弃用的“经济”模式下,仅返回h。
如果保理失败。
笔记
这是对LAPACK程序的接口dgeqrf
,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”是新的默认值,因此可以通过将mode设置为default 来保持向后兼容性。添加了“原始”选项,以便可以使用可以使用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
举例说明以下的常见用法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, 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])