當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。