numpy.linalg.qr#

linalg.qr(a, mode='reduced')[原始碼]#

計算矩陣的 qr 分解。

將矩陣 a 分解為 qr,其中 q 是正交矩陣,而 r 是上三角矩陣。

參數:
aarray_like,形狀 (…, M, N)

至少為 2 維的類陣列物件。

mode{‘reduced’, ‘complete’, ‘r’, ‘raw’},選用,預設值:‘reduced’

若 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」模式可以僅使用第一個字母來傳遞,以實現回溯相容性,但所有其他模式都必須完整拼寫出來。請參閱註解以取得更多說明。

傳回值:
當 mode 為 ‘reduced’ 或 ‘complete’ 時,結果會是一個具名字元組,具有
屬性 QR
Qndarray,浮點數或複數,選用

具有正交列的矩陣。當 mode = ‘complete’ 時,結果會是正交/么正矩陣,取決於 a 是實數/複數。在這種情況下,行列式可能是 +/- 1。如果輸入陣列的維度大於 2,則會傳回具有上述屬性的矩陣堆疊。

Rndarray,浮點數或複數,選用

上三角矩陣,或如果輸入陣列的維度大於 2,則為上三角矩陣堆疊。

(h, tau)np.double 或 np.cdouble 的 ndarray,選用

陣列 h 包含 Householder 反射器,這些反射器產生 q 以及 r。tau 陣列包含反射器的縮放因子。在已棄用的 ‘economic’ 模式中,僅傳回 h。

引發:
LinAlgError

如果因式分解失敗。

另請參閱

scipy.linalg.qr

SciPy 中的類似函數。

scipy.linalg.rq

計算矩陣的 RQ 分解。

註解

這是 LAPACK 常式 dgeqrfzgeqrfdorgqrzungqr 的介面。

有關 qr 分解的更多資訊,請參閱例如:https://en.wikipedia.org/wiki/QR_factorization

除了 ‘raw’ 模式外,ndarray 的子類別會被保留。因此,如果 a 的類型為 matrix,則所有傳回值也都會是矩陣。

NumPy 1.8.0 中新增了 mode 的 ‘reduced’、‘complete’ 和 ‘raw’ 選項,而舊選項 ‘full’ 則成為 ‘reduced’ 的別名。此外,‘full’ 和 ‘economic’ 選項已被棄用。由於 ‘full’ 是先前的預設值,而 ‘reduced’ 是新的預設值,因此可以透過讓 mode 預設值來維持回溯相容性。新增 ‘raw’ 選項是為了可以使用 LAPACK 常式,這些常式可以使用 Householder 反射器將陣列與 q 相乘。請注意,在這種情況下,傳回的陣列類型為 np.double 或 np.cdouble,並且 h 陣列已轉置為與 FORTRAN 相容。目前 numpy 沒有公開使用 ‘raw’ 傳回值的常式,但 lapack_lite 中提供了一些,並且只需進行必要的工作即可使用。

範例

>>> import numpy as np
>>> rng = np.random.default_rng()
>>> a = rng.normal(size=(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 的常見用法:求解最小平方問題

對於以下資料:{(0,1), (1,0), (1,2), (2,1)},y = y0 + mx 中的最小平方最佳解 my0 是什麼?(繪製點的圖表,您會看到它應該是 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) * (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, 2, 2, 3])
>>> Q, R = np.linalg.qr(A)
>>> p = np.dot(Q.T, b)
>>> np.dot(np.linalg.inv(R), p)
array([  1.,   1.])