本文簡要介紹 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 例程
dgeqrf
、zgeqrf
、dorgqr
和zungqr
的接口。有關 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 是什麽m和y0在
y = 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])
相關用法
- Python numpy linalg.svd用法及代碼示例
- Python numpy linalg.pinv用法及代碼示例
- Python numpy linalg.eigh用法及代碼示例
- Python numpy linalg.tensorinv用法及代碼示例
- Python numpy linalg.LinAlgError用法及代碼示例
- Python numpy linalg.matrix_rank用法及代碼示例
- Python numpy linalg.solve用法及代碼示例
- Python numpy linalg.det用法及代碼示例
- Python numpy linalg.cond用法及代碼示例
- Python numpy linalg.inv用法及代碼示例
- Python numpy linalg.eig用法及代碼示例
- Python numpy linalg.lstsq用法及代碼示例
- Python numpy linalg.norm用法及代碼示例
- Python numpy linalg.slogdet用法及代碼示例
- Python numpy linalg.multi_dot用法及代碼示例
- Python numpy linalg.tensorsolve用法及代碼示例
- Python numpy linalg.matrix_power用法及代碼示例
- Python numpy linalg.cholesky用法及代碼示例
- Python numpy linalg.eigvals用法及代碼示例
- Python numpy linalg.eigvalsh用法及代碼示例
- Python numpy linspace用法及代碼示例
- Python numpy lib.NumpyVersion用法及代碼示例
- Python numpy lib.Arrayterator用法及代碼示例
- Python numpy legendre.legint用法及代碼示例
- Python numpy laguerre.lagone用法及代碼示例
注:本文由純淨天空篩選整理自numpy.org大神的英文原創作品 numpy.linalg.qr。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。