linalg.
qr
计算矩阵的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”:返回h,tau和维数(n,m),(k,)
选项“reduced”、“complete”和“raw”在numpy 1.8中是新的,有关详细信息,请参见注释。默认值是“reduced”,为了保持与早期版本的numpy的向后兼容性,可以忽略它和旧默认值“full”。注意,在“raw”模式下返回的数组h被转换为调用fortran。不赞成“经济”模式。“完全”和“经济”模式可以只使用第一个字母传递,以实现向后兼容性,但必须对所有其他模式进行说明。更多说明请参见注释。
具有正交列的矩阵。当mode='complete'时,结果是一个正交/一元矩阵,这取决于a是否为实/复矩阵。在这种情况下,行列式可以是+/-1。
上三角矩阵。
数组h包含与r一起生成q的户主反射镜。tau数组包含反射镜的比例因子。在已弃用的“经济”模式中,只返回h。
如果保理失败。
参见
scipy.linalg.qr
在SciPy中有类似的功能。
scipy.linalg.rq
计算矩阵的RQ分解。
笔记
这是到LAPACK例程的接口 dgeqrf , zgeqrf , dorgqr 和 zungqr .
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”和“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 :解决最小二乘问题
最小二乘法最好是什么 m 和 y0 在里面 y = y0 + mx 对于以下数据:(0,1)、(1,0)、(1,2)、(2,1)。(画出点的图形,你会发现它应该是y0=0,m=1。)答案是通过解超定矩阵方程得到的。 Ax = b ,其中:
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总是可能的),那么 x = inv(r) * (q.T) * b . (然而,在 NumPy 的实践中,我们只是使用 lstsq )
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])