Spec-Zone.ru › PyTorch 2.14

torch.linalg.pinv

torch.linalg.pinv(A, *, atol=None, rtol=None, hermitian=False, out=None) → Tensor [исходный код]

Вычисляет псевдообратную матрицу (обратную матрицу Мура — Пенроуза).

Псевдообратную матрицу можно определить алгебраически, однако вычислительно удобнее рассматривать её через SVD

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

Если hermitian= True, предполагается, что A является эрмитовой матрицей, если она комплексная, или симметричной, если она вещественная, однако это не проверяется внутри функции. Вместо этого при вычислениях используется только нижняя треугольная часть матрицы.

Сингулярные значения (или нормы собственных значений, если hermitian= True), которые меньше порога max⁡(atol,σ1⋅rtol)\max(\text{atol}, \sigma_1 \cdot \text{rtol}), считаются нулевыми и отбрасываются при вычислениях, где σ1\sigma_1 — наибольшее сингулярное значение (или собственное значение).

Если rtol не задан и A — матрица размерности (m, n), относительный допуск устанавливается равным rtol=max⁡(m,n)ε\text{rtol} = \max(m, n) \varepsilon, а ε\varepsilon — значение эпсилон для типа данных A (см. finfo). Если rtol не задан, а atol задано больше нуля, то rtol устанавливается равным нулю.

Если atol или rtol — это torch.Tensor, его форма должна быть совместима с формой сингулярных значений A, возвращаемых функцией torch.linalg.svd().

Примечание

Эта функция использует torch.linalg.svd(), если hermitian= False, и torch.linalg.eigh(), если hermitian= True. Для входных данных CUDA эта функция синхронизирует устройство с ЦП.

Примечание

Если это возможно, для умножения матрицы слева на псевдообратную рекомендуется использовать torch.linalg.lstsq(), например:

torch.linalg.lstsq(A, B).solution == A.pinv() @ B

По возможности всегда предпочтительно использовать lstsq(), поскольку этот способ быстрее и численно устойчивее, чем явное вычисление псевдообратной матрицы.

Примечание

Эта функция имеет вариант, совместимый с NumPy, linalg.pinv(A, rcond, hermitian=False). Однако использование позиционного аргумента rcond устарело; вместо него следует использовать rtol.

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

Внутри функция использует torch.linalg.svd() (или torch.linalg.eigh(), если hermitian= True), поэтому её производная подвержена тем же проблемам, что и производные этих функций. Подробнее см. предупреждения в документации функций torch.linalg.svd() и torch.linalg.eigh().

См. также

torch.linalg.inv() вычисляет обратную матрицу для квадратной матрицы.

torch.linalg.lstsq() вычисляет A.pinv() @ B с помощью численно устойчивого алгоритма.

Параметры:
  • A (Tensor) – тензор формы (*, m, n), где * — ноль или более пакетных размерностей.
  • rcond (float, Tensor, необязательный) – [Совместимость с NumPy]. Псевдоним для rtol. По умолчанию: None.
Именованные аргументы:
  • atol (float, Tensor, необязательный) – абсолютный допуск. Если None, считается равным нулю. По умолчанию: None.
  • rtol (float, Tensor, необязательный) – относительный допуск. Значение, которое он принимает при None, см. выше. По умолчанию: None.
  • hermitian (bool, необязательный) – указывает, является ли A эрмитовой матрицей, если она комплексная, или симметричной, если она вещественная. По умолчанию: False.
  • out (Tensor, необязательный) – выходной тензор. Игнорируется, если None. По умолчанию: None.

Примеры:

>>> A = torch.randn(3, 5)
>>> A
tensor([[ 0.5495,  0.0979, -1.4092, -0.1128,  0.4132],
        [-1.1143, -0.3662,  0.3042,  1.6374, -0.9294],
        [-0.3269, -0.5745, -0.0382, -0.5922, -0.6759]])
>>> torch.linalg.pinv(A)
tensor([[ 0.0600, -0.1933, -0.2090],
        [-0.0903, -0.0817, -0.4752],
        [-0.7124, -0.1631, -0.2272],
        [ 0.1356,  0.3933, -0.5023],
        [-0.0308, -0.1725, -0.5216]])

>>> A = torch.randn(2, 6, 3)
>>> Apinv = torch.linalg.pinv(A)
>>> torch.dist(Apinv @ A, torch.eye(3))
tensor(8.5633e-07)

>>> A = torch.randn(3, 3, dtype=torch.complex64)
>>> A = A + A.T.conj()  # creates a Hermitian matrix
>>> Apinv = torch.linalg.pinv(A, hermitian=True)
>>> torch.dist(Apinv @ A, torch.eye(3))
tensor(1.0830e-06)

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

Spec-Zone.ru

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