torch.linalg.qr¶
- torch.linalg.qr(A, mode='reduced', *, out=None)¶
計算矩陣的 QR 分解。
令 為 或 ,矩陣 的 完整 QR 分解 (full QR decomposition) 定義為
其中,在實數情況下, 是正交矩陣 (orthogonal),在複數情況下, 是么正矩陣 (unitary),且 是上三角矩陣 (upper triangular matrix),其對角線元素為實數 (即使在複數情況下也是如此)。
當 m > n (高矩陣,tall matrix) 時,由於 R 是上三角矩陣,因此其最後 m - n 列全為零。在這種情況下,我們可以捨棄 Q 的最後 m - n 行,形成 簡化 QR 分解 (reduced QR decomposition)
當 n >= m (寬矩陣,wide matrix) 時,簡化 QR 分解與完整 QR 分解一致。
支持 float, double, cfloat 和 cdouble 等資料類型 (dtypes) 的輸入。也支持批次矩陣 (batches of matrices) 的輸入,並且如果
A
是一個批次矩陣,則輸出具有相同的批次維度 (batch dimensions)。參數
mode
選擇完整或簡化 QR 分解。 如果A
的形狀 (shape) 為 (*, m, n),並表示 k = min(m, n)mode
= ‘reduced’ (預設):分別返回形狀為 (*, m, k), (*, k, n) 的 (Q, R)。 它始終是可微分的 (differentiable)。mode
= ‘complete’:回傳形狀分別為 (*, m, m) 和 (*, m, n) 的 (Q, R)。當 m <= n 時可微分。mode
= ‘r’:僅計算簡化的 R。回傳 (Q, R),其中 Q 為空,且 R 的形狀為 (*, k, n)。永遠不可微分。
與 numpy.linalg.qr 的差異
未實作
mode
= ‘raw’。與 numpy.linalg.qr 不同,此函式總是回傳一個包含兩個張量的 tuple。當
mode
= ‘r’ 時,Q 張量為空張量。
警告
R 的對角線元素不一定為正數。因此,回傳的 QR 分解僅在 R 的對角線符號上是唯一的。因此,不同的平台,例如 NumPy,或不同裝置上的輸入,可能會產生不同的有效分解。
警告
只有當
A
中每個矩陣的前 k = min(m, n) 個 column 是線性獨立的,QR 分解才是良好定義的。如果此條件不滿足,不會拋出任何錯誤,但產生的 QR 可能不正確,且其自動微分可能會失敗或產生不正確的結果。- 參數
- 關鍵字參數
out (tuple, optional) – 兩個張量的輸出 tuple。如果為 None,則忽略。預設值:None。
- 回傳值
一個名為 (Q, R) 的 named tuple。
範例
>>> A = torch.tensor([[12., -51, 4], [6, 167, -68], [-4, 24, -41]]) >>> Q, R = torch.linalg.qr(A) >>> Q tensor([[-0.8571, 0.3943, 0.3314], [-0.4286, -0.9029, -0.0343], [ 0.2857, -0.1714, 0.9429]]) >>> R tensor([[ -14.0000, -21.0000, 14.0000], [ 0.0000, -175.0000, 70.0000], [ 0.0000, 0.0000, -35.0000]]) >>> (Q @ R).round() tensor([[ 12., -51., 4.], [ 6., 167., -68.], [ -4., 24., -41.]]) >>> (Q.T @ Q).round() tensor([[ 1., 0., 0.], [ 0., 1., -0.], [ 0., -0., 1.]]) >>> Q2, R2 = torch.linalg.qr(A, mode='r') >>> Q2 tensor([]) >>> torch.equal(R, R2) True >>> A = torch.randn(3, 4, 5) >>> Q, R = torch.linalg.qr(A, mode='complete') >>> torch.dist(Q @ R, A) tensor(1.6099e-06) >>> torch.dist(Q.mT @ Q, torch.eye(4)) tensor(6.2158e-07)