当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python numpy linalg.qr用法及代码示例


本文简要介绍 python 语言中 numpy.linalg.qr 的用法。

用法:

linalg.qr(a, mode='reduced')

计算矩阵的 qr 分解。

将矩阵 a 分解为 qr,其中 q 是正交矩阵,r 是上三角矩阵。

参数

a 数组,形状(…,M,N)

维数至少为 2 的类数组对象。

mode {‘reduced’, ‘complete’, ‘r’, ‘raw’},可选

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

  • ‘reduced’ 返回 q, r 和维度

    (…, M, K), (…, K, N) (默认)

  • ‘complete’:返回 q, r,维度为 (..., M, M), (..., M, N)

  • ‘r’ :仅返回 r 尺寸(...,K,N)

  • ‘raw’ : 返回 h, tau,尺寸为 (..., N, M), (..., K,)

‘reduced’、'complete 和 ‘raw’ 选项是 numpy 1.8 中的新选项,有关更多信息,请参阅注释。默认值为‘reduced’,为了保持与早期版本的numpy的向后兼容性,可以省略它和旧的默认值‘full’。请注意,‘raw’ 模式中返回的数组 h 被转置以调用 Fortran。 ‘economic’ 模式已弃用。模式‘full’ 和‘economic’ 可以仅使用第一个字母传递以实现向后兼容性,但必须拼写所有其他字母。有关更多说明,请参阅注释。

返回

q 浮点数或复数的ndarray,可选

具有正交列的矩阵。当 mode = ‘complete’ 时,结果是正交/酉矩阵,具体取决于 a 是否为实数/复数。在这种情况下,行列式可能是 +/- 1。如果输入数组中的维数大于 2,则返回具有上述属性的矩阵堆栈。

r 浮点数或复数的ndarray,可选

如果输入数组的维数大于 2,则为上三角矩阵或上三角矩阵堆栈。

(h, tau) np.double 或 np.cdouble 的 ndarrays,可选

数组 h 包含生成 q 和 r 的 Householder 反射器。 tau 阵列包含反射器的比例因子。在已弃用的‘economic’ 模式中,仅返回 h。

抛出

LinAlgError

如果保理失败。

注意

这是 LAPACK 例程 dgeqrfzgeqrfdorgqrzungqr 的接口。

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

的子类numpy.ndarray除‘raw’ 模式外,均保留。因此,如果a是类型numpy.matrix,所有的返回值也将是矩阵。

NumPy 1.8.0 中添加了新的 ‘reduced’, ‘complete’ 和 ‘raw’ 模式选项,旧选项 ‘full’ 被设为 ‘reduced’ 的别名。此外,选项 ‘full’ 和 ‘economic’ 已弃用。由于 ‘full’ 是以前的默认值,而 ‘reduced’ 是新的默认值,因此可以通过让模式默认来保持向后兼容性。添加了 ‘raw’ 选项,以便可以使用可以使用 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
>>> 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 常见用法的示例:解决最小二乘问题

least-squares-best 是什么my0y = y0 + mx对于以下数据:{(0,1), (1,0), (1,2), (2,1)}。 (绘制点,你会看到它应该是 y0 = 0,m = 1。)答案是通过求解over-determined 矩阵方程得到的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])

相关用法


注:本文由纯净天空筛选整理自numpy.org大神的英文原创作品 numpy.linalg.qr。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。