torch.linalg.eigh
-
torch.linalg.eigh(A, UPLO='L', *, out=None) -
Вычисляет разложение по собственным значениям комплексной эрмитовой или вещественной симметричной матрицы.
Пусть — или , разложение по собственным значениям комплексной эрмитовой или вещественной симметричной матрицы определяется как
где — сопряжённый транспонированный, когда комплексный, и транспонированный, когда вещественный. — ортогонален в вещественном случае и унитарный в комплексном.
Поддерживает типы данных float, double, cfloat и cdouble. Также поддерживает пакетные матрицы, и если
A— пакет матриц, то результат имеет те же размерности пакета.Aпредполагается эрмитовой (соответственно, симметричной), но это не проверяется внутри, вместо этого:- Если
UPLO= ‘L’(по умолчанию), используется только нижняя треугольная часть матрицы в вычислениях. - Если
UPLO= ‘U’, используется только верхняя треугольная часть матрицы.
Собственные значения возвращаются в порядке возрастания.
Примечание
Когда входные данные находятся на устройстве CUDA, эта функция синхронизирует это устройство с процессором.
Примечание
Собственные значения вещественных симметричных или комплексных эрмитовых матриц всегда вещественные.
Предупреждение
Собственные векторы симметричной матрицы не уникальны и не непрерывны относительно
A. Из-за отсутствия уникальности различное оборудование и программное обеспечение могут вычислять разные собственные векторы.Это отсутствие уникальности вызвано тем, что умножение собственного вектора на
-1в вещественном случае или на в комплексном случае даёт другой набор допустимых собственных векторов матрицы. По этой причине функция потерь не должна зависеть от фазы собственных векторов, так как эта величина не определена. Это проверяется для комплексных входных данных при вычислении градиентов этой функции. Таким образом, когда входные данные комплексные и находятся на устройстве CUDA, вычисление градиентов этой функции синхронизирует это устройство с процессором.Предупреждение
Градиенты, вычисленные с помощью
eigenvectorsтензора, будут конечными только тогда, когдаAимеет различные собственные значения. Кроме того, если расстояние между любыми двумя собственными значениями близко к нулю, градиент будет численно нестабильным, поскольку он зависит от собственных значений через вычисление .Предупреждение
Пользователь может наблюдать сбои pytorch при запуске
eighна устройствах CUDA с версиями CUDA до 12.1 обновления 1 с большими плохо обусловленными матрицами в качестве входных данных. Для получения более подробной информации см. Численная устойчивость линейной алгебры. В этом случае пользователь может (1) настроить входные матрицы так, чтобы они были менее плохо обусловлены, или (2) использоватьtorch.backends.cuda.preferred_linalg_library(), чтобы попробовать другие поддерживаемые бэкэнды.См. также
torch.linalg.eigvalsh()вычисляет только собственные значения эрмитовой матрицы. В отличие отtorch.linalg.eigh(), градиентыeigvalsh()всегда численно устойчивы.torch.linalg.cholesky()для другого разложения эрмитовой матрицы. Разложение Холецкого даёт меньше информации о матрице, но вычисляется намного быстрее, чем разложение по собственным значениям.torch.linalg.eig()для (более медленной) функции, вычисляющей разложение по собственным значениям не обязательно эрмитовой квадратной матрицы.torch.linalg.svd()для (более медленной) функции, вычисляющей более общее разложение SVD матриц любой формы.torch.linalg.qr()для другого (намного более быстрого) разложения, которое работает с общими матрицами.- Parameters
-
-
A (Tensor) – тензор формы
(*, n, n), где*— ноль или более размерностей пакета, состоящих из симметричных или эрмитовых матриц. -
UPLO ('L', 'U', optional) – определяет, использовать ли верхнюю или нижнюю треугольную часть
Aв вычислениях. По умолчанию:‘L’.
-
A (Tensor) – тензор формы
- Keyword Arguments
-
out (tuple, optional) – кортеж выходных тензоров. Игнорируется, если
None. По умолчанию:None. - Returns
-
именованный кортеж
(eigenvalues, eigenvectors), соответствующий и выше.eigenvaluesвсегда будет вещественным, даже когдаAкомплексный. Он также будет упорядочен по возрастанию.eigenvectorsбудет иметь тот же тип данных, что иAи будет содержать собственные векторы в качестве своих столбцов.
- Examples::
-
>>> 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/2.1/generated/torch.linalg.eigh.html