快捷鍵

torch.linalg.eig

torch.linalg.eig(A, *, out=None)

計算方陣的特徵值分解(如果存在)。

K\mathbb{K}R\mathbb{R}C\mathbb{C},方陣 AKn×nA \in \mathbb{K}^{n \times n}特徵值分解(如果存在)定義為

A=Vdiag(Λ)V1VCn×n,ΛCnA = V \operatorname{diag}(\Lambda) V^{-1}\mathrlap{\qquad V \in \mathbb{C}^{n \times n}, \Lambda \in \mathbb{C}^n}

此分解存在若且唯若 AA可對角化的。當其所有特徵值都不同時,就是這種情況。

支援 float、double、cfloat 和 cdouble 資料類型作為輸入。 也支援批次矩陣,如果 A 是一批矩陣,則輸出具有相同的批次維度。

不保證返回的特徵值具有任何特定順序。

注意

實數矩陣的特徵值和特徵向量可能為複數。

注意

當輸入位於 CUDA 裝置上時,此函數會將該裝置與 CPU 同步。

警告

此函數假設 A可對角化的(例如,當所有特徵值都不同時)。 如果它不可對角化,則返回的特徵值將是正確的,但 AVdiag(Λ)V1A \neq V \operatorname{diag}(\Lambda)V^{-1}

警告

返回的特徵向量經過正規化,使其範數為 1。 即使這樣,矩陣的特徵向量也不是唯一的,也不會隨著 A 而連續。 由於這種缺乏唯一性,不同的硬體和軟體可能會計算出不同的特徵向量。

這種非唯一性是因為將特徵向量乘以 eiϕ,ϕRe^{i \phi}, \phi \in \mathbb{R} 會產生矩陣的另一組有效特徵向量。因此,損失函數不應取決於特徵向量的相位,因為這個量沒有明確的定義。在計算此函數的梯度時會檢查這一點。因此,當輸入位於 CUDA 裝置上時,此函數的梯度計算會將該裝置與 CPU 同步。

警告

僅當 A 具有不同的特徵值時,使用 eigenvectors 張量計算的梯度才會是有限的。此外,如果任意兩個特徵值之間的距離接近於零,則梯度在數值上將是不穩定的,因為它取決於通過計算 1minijλiλj\frac{1}{\min_{i \neq j} \lambda_i - \lambda_j} 的特徵值。

參見

torch.linalg.eigvals() 僅計算特徵值。與 torch.linalg.eig() 不同,eigvals() 的梯度在數值上始終是穩定的。

torch.linalg.eigh() 提供了一個(更快)的函數,用於計算埃爾米特矩陣和對稱矩陣的特徵值分解。

torch.linalg.svd() 提供了一個函數,用於計算另一種類型的譜分解,該譜分解適用於任何形狀的矩陣。

torch.linalg.qr() 提供了另一種(快得多)的分解,該分解適用於任何形狀的矩陣。

參數

A (Tensor) – 形狀為 (*, n, n) 的張量,其中 * 是由可對角化矩陣組成的零個或多個批次維度。

關鍵字參數

out (tuple, optional) – 兩個張量的輸出元組。如果為 None,則忽略。預設值:None

返回

一個名為 (eigenvalues, eigenvectors) 的命名元組,它對應於上面的 Λ\LambdaVV

即使 A 是實數,eigenvalueseigenvectors 也將始終是複數值。特徵向量將由 eigenvectors 的各列給出。

範例

>>> A = torch.randn(2, 2, dtype=torch.complex128)
>>> A
tensor([[ 0.9828+0.3889j, -0.4617+0.3010j],
        [ 0.1662-0.7435j, -0.6139+0.0562j]], dtype=torch.complex128)
>>> L, V = torch.linalg.eig(A)
>>> L
tensor([ 1.1226+0.5738j, -0.7537-0.1286j], dtype=torch.complex128)
>>> V
tensor([[ 0.9218+0.0000j,  0.1882-0.2220j],
        [-0.0270-0.3867j,  0.9567+0.0000j]], dtype=torch.complex128)
>>> torch.dist(V @ torch.diag(L) @ torch.linalg.inv(V), A)
tensor(7.7119e-16, dtype=torch.float64)

>>> A = torch.randn(3, 2, 2, dtype=torch.float64)
>>> L, V = torch.linalg.eig(A)
>>> torch.dist(V @ torch.diag_embed(L) @ torch.linalg.inv(V), A)
tensor(3.2841e-16, dtype=torch.float64)

文件

取得 PyTorch 的完整開發人員文件

檢視文件

教學

取得針對初學者和高級開發人員的深入教學課程

檢視教學

資源

尋找開發資源並取得您問題的解答

檢視資源