Spec-Zone.ru › PyTorch 2

torch.linalg.eig

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

Вычисляет разложение по собственным значениям квадратной матрицы, если оно существует.

Пусть K\mathbb{K} — R\mathbb{R} или C\mathbb{C}. Разложение по собственным значениям квадратной матрицы A∈Kn×nA \in \mathbb{K}^{n \times n} (если оно существует) определяется как

A=Vdiag⁡(Λ)V−1V∈Cn×mi,Λ∈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, эта функция синхронизирует это устройство с процессором.

Предупреждение

Эта функция предполагает, что A является диагонализуемой (например, когда все собственные значения различны). Если она не диагонализуема, возвращаемые собственные значения будут корректными, но A≠Vdiag⁡(Λ)V−1A \neq V \operatorname{diag}(\Lambda)V^{-1}.

Предупреждение

Возвращаемые собственные векторы нормированы до нормы 1. Даже в таком случае, собственные векторы матрицы не уникальны и не непрерывны относительно A. Из-за этой неоднозначности различные аппаратные и программные средства могут вычислять разные собственные векторы.

Эта неоднозначность вызвана тем, что умножение собственного вектора на eiϕ,ϕ∈Re^{i \phi}, \phi \in \mathbb{R} производит другой набор допустимых собственных векторов матрицы. По этой причине функция потерь не должна зависеть от фазы собственных векторов, поскольку эта величина не определена. Это проверяется при вычислении градиентов этой функции. Таким образом, когда входные данные находятся на устройстве CUDA, эта функция синхронизирует это устройство с процессором при вычислении градиентов. Это проверяется при вычислении градиентов этой функции. Таким образом, при вычислении градиентов функции на устройстве CUDA, вычисление синхронизируется с процессором.

Предупреждение

Вычисленные с помощью eigenvectors тензора градиенты будут конечными только тогда, когда A имеет различные собственные значения. Кроме того, если расстояние между любыми двумя собственными значениями близко к нулю, градиент будет числово нестабильным, так как он зависит от собственных значений λi\lambda_i через вычисление 1min⁡i≠jλ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() для другого (гораздо более быстрого) разложения, работающего над матрицами любой формы.

Parameters

A (Tensor) – тензор формы (*, n, n) где * — ноль или более размерностей пакета, состоящие из диагонализуемых матриц.

Keyword Arguments

out (tuple, optional) – кортеж из двух тензоров. Игнорируется, если None. Значение по умолчанию: None.

Returns

Именованный кортеж (eigenvalues, eigenvectors) , который соответствует Λ\Lambda и VV выше.

eigenvalues и eigenvectors всегда будут комплекснозначными, даже когда A вещественные. Собственные векторы будут заданы столбцами 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)

© 2024, PyTorch Contributors
PyTorch has a BSD-style license, as found in the LICENSE file.
https://pytorch.org/docs/2.1/generated/torch.linalg.eig.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API