Spec-Zone.ru › PyTorch 1

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×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, эта функция синхронизирует это устройство с процессором.

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

Эта функция предполагает, что 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() для другого (намного более быстрого) разложения, которое работает с матрицами любой формы.

Параметры:

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

Ключевые аргументы:

out (tuple, необязательно) – выходной кортеж из двух тензоров. Игнорируется, если None. По умолчанию: None.

Возвращаемое значение:

Именованный кортеж (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/1.13/generated/torch.linalg.eig.html

Spec-Zone.ru

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