Spec-Zone.ru › PyTorch 1

torch.linalg.eigh

torch.linalg.eigh(A, UPLO='L', *, out=None)

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

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

A=Qdiag⁡(Λ)QHQ∈Kn×n,Λ∈RnA = Q \operatorname{diag}(\Lambda) Q^{\text{H}}\mathrlap{\qquad Q \in \mathbb{K}^{n \times n}, \Lambda \in \mathbb{R}^n}

где QHQ^{\text{H}} — сопряжённый транспонированный, если QQ комплексный, и транспонированный, если QQ вещественный. QQ ортогонален в вещественном случае и унитарный в комплексном случае.

Поддерживает входные типы float, double, cfloat и cdouble. Также поддерживает пакетные матрицы; если A — пакет матриц, то выход имеет те же размерности пакета.

A предполагается эрмитовой (соответственно, симметричной), но это не проверяется внутри, вместо этого:

  • Если UPLO= ‘L’ (по умолчанию), в вычислениях используется только нижняя треугольная часть матрицы.
  • Если UPLO= ‘U’, используется только верхняя треугольная часть матрицы.

Собственные значения возвращаются в порядке возрастания.

Примечание

При вводе на устройстве CUDA эта функция синхронизирует это устройство с процессором.

Примечание

Собственные значения вещественных симметричных или комплексных эрмитовых матриц всегда вещественные.

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

Собственные векторы симметричной матрицы не уникальны и не непрерывны относительно A. Из-за этого отсутствия уникальности разное аппаратное и программное обеспечение могут вычислять разные собственные векторы.

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

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

Градиенты, вычисленные с использованием eigenvectors тензора, будут конечными только тогда, когда A имеет различные собственные значения. Кроме того, если расстояние между любыми двумя собственными значениями близко к нулю, градиент будет числово неустойчивым, поскольку он зависит от собственных значений λi\lambda_i через вычисление 1min⁡i≠jλi−λj\frac{1}{\min_{i \neq j} \lambda_i - \lambda_j}.

См. также

torch.linalg.eigvalsh() вычисляет только собственные значения эрмитовой матрицы. В отличие от torch.linalg.eigh(), градиенты eigvalsh() всегда числово устойчивы.

torch.linalg.cholesky() для другого разложения эрмитовой матрицы. Разложение Холецкого даёт меньше информации о матрице, но вычисляется намного быстрее, чем разложение по собственным значениям.

torch.linalg.eig() для (медленной) функции, вычисляющей разложение по собственным значениям не обязательно эрмитовой квадратной матрицы.

torch.linalg.svd() для (медленной) функции, вычисляющей более общее разложение SVD матриц любой формы.

torch.linalg.qr() для другого (значительно более быстрого) разложения, работающего с общими матрицами.

Параметры:
  • A (Tensor) – тензор формы (*, n, n) , где * — одна или более размерности пакета, состоящие из симметричных или эрмитовых матриц.
  • UPLO ('L', 'U', необязательно) – управляет тем, использовать ли верхнюю или нижнюю треугольную часть A в вычислениях. По умолчанию: ‘L’.
Ключевые аргументы:

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

Возвращает:

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

eigenvalues всегда будет вещественным, даже если A комплексный. Он также будет отсортирован в порядке возрастания.

eigenvectors будет иметь тот же тип данных, что и A, и будет содержать собственные векторы в качестве своих столбцов.

Примеры::
>>> A = torch.randn(2, 2, dtype=torch.complex128)
>>> A = A + A.T.conj()  # creates a Hermitian matrix
>>> A
tensor([[2.9228+0.0000j, 0.2029-0.0862j],
        [0.2029+0.0862j, 0.3464+0.0000j]], dtype=torch.complex128)
>>> L, Q = torch.linalg.eigh(A)
>>> L
tensor([0.3277, 2.9415], dtype=torch.float64)
>>> Q
tensor([[-0.0846+-0.0000j, -0.9964+0.0000j],
        [ 0.9170+0.3898j, -0.0779-0.0331j]], dtype=torch.complex128)
>>> torch.dist(Q @ torch.diag(L.cdouble()) @ Q.T.conj(), A)
tensor(6.1062e-16, dtype=torch.float64)
>>> A = torch.randn(3, 2, 2, dtype=torch.float64)
>>> A = A + A.mT  # creates a batch of symmetric matrices
>>> L, Q = torch.linalg.eigh(A)
>>> torch.dist(Q @ torch.diag_embed(L) @ Q.mH, A)
tensor(1.5423e-15, 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.eigh.html

Spec-Zone.ru

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