Spec-Zone.ru › PyTorch 2.14

torch.linalg.lstsq

torch.linalg.lstsq(A, B, rcond=None, *, driver=None) [source]

Вычисляет решение задачи наименьших квадратов для системы линейных уравнений.

Пусть K\mathbb{K} — это R\mathbb{R} или C\mathbb{C}, тогда задача наименьших квадратов для линейной системы AX=BAX = B, где A∈Km×n,B∈Km×kA \in \mathbb{K}^{m \times n}, B \in \mathbb{K}^{m \times k}, определяется следующим образом:

min⁡X∈Kn×k∥AX−B∥F\min_{X \in \mathbb{K}^{n \times k}} \|AX - B\|_F

где ∥−∥F\|-\|_F обозначает норму Фробениуса.

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

driver выбирает используемую функцию бэкенда. Для входных данных на CPU допустимы значения ‘gels’, ‘gelsy’, ‘gelsd, ‘gelss’. При выборе оптимального драйвера для CPU учитывайте следующее:

  • Если A хорошо обусловлена (её число обусловленности не слишком велико) или вас не беспокоит некоторая потеря точности.

    • Для матрицы общего вида: ‘gelsy’ (QR-разложение с выбором ведущего элемента) (по умолчанию)
    • Если A имеет полный ранг: ‘gels’ (QR-разложение)
  • Если A плохо обусловлена.

    • ‘gelsd’ (тридиагональное приведение и SVD)
    • Если возникают проблемы с памятью: ‘gelss’ (полное SVD).

Для входных данных CUDA допустим только драйвер ‘gels’, который предполагает, что A имеет полный ранг.

См. также полное описание этих драйверов

rcond используется для определения эффективного ранга матриц в A, если driver имеет одно из значений (‘gelsy’, ‘gelsd’, ‘gelss’). В этом случае, если σi\sigma_i — сингулярные значения A в порядке убывания, то σi\sigma_i будет округлено до нуля, если σi≤rcond⋅σ1\sigma_i \leq \text{rcond} \cdot \sigma_1. Если rcond= None (по умолчанию), rcond устанавливается равным машинной точности типа данных A, умноженной на max(m, n).

Эта функция возвращает решение задачи и дополнительную информацию в виде именованного кортежа из четырёх тензоров (solution, residuals, rank, singular_values). Для входных данных A, B формы (*, m, n), (*, m, k) соответственно, он содержит:

  • solution: решение задачи наименьших квадратов. Его форма — (*, n, k).
  • residuals: квадраты невязок решений, то есть ∥AX−B∥F2\|AX - B\|_F^2. Его форма — (*, k). Он вычисляется, если m > n и каждая матрица в A имеет полный ранг; в противном случае возвращается пустой тензор. Если A — пакет матриц и хотя бы одна матрица в пакете не имеет полного ранга, возвращается пустой тензор. Это поведение может измениться в одном из будущих выпусков PyTorch.
  • rank: тензор рангов матриц в A. Его форма совпадает с размерами пакета A. Он вычисляется, если driver имеет одно из значений (‘gelsy’, ‘gelsd’, ‘gelss’); в противном случае возвращается пустой тензор.
  • singular_values: тензор сингулярных значений матриц в A. Его форма — (*, min(m, n)). Он вычисляется, если driver имеет одно из значений (‘gelsd’, ‘gelss’); в противном случае возвращается пустой тензор.

Примечание

Эта функция вычисляет X = A.pinverse() @ B быстрее и с большей численной устойчивостью, чем при выполнении вычислений по отдельности.

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

Значение rcond по умолчанию может измениться в одном из будущих выпусков PyTorch. Поэтому рекомендуется использовать фиксированное значение, чтобы избежать потенциальных нарушений совместимости.

Параметры:
  • A (Tensor) – тензор левой части формы (*, m, n), где * — ноль или более измерений пакета.
  • B (Tensor) – тензор правой части формы (*, m, k), где * — ноль или более измерений пакета.
  • rcond (float, необязательный) – используется для определения эффективного ранга A. Если rcond= None, rcond устанавливается равным машинной точности типа данных A, умноженной на max(m, n). По умолчанию: None.
Именованные аргументы:

driver (str, необязательный) – имя используемого метода LAPACK/MAGMA. Если None, для входных данных CPU используется ‘gelsy’, а для входных данных CUDA — ‘gels’. По умолчанию: None.

Возвращает:

Именованный кортеж (solution, residuals, rank, singular_values).

Примеры:

>>> A = torch.randn(1,3,3)
>>> A
tensor([[[-1.0838,  0.0225,  0.2275],
     [ 0.2438,  0.3844,  0.5499],
     [ 0.1175, -0.9102,  2.0870]]])
>>> B = torch.randn(2,3,3)
>>> B
tensor([[[-0.6772,  0.7758,  0.5109],
     [-1.4382,  1.3769,  1.1818],
     [-0.3450,  0.0806,  0.3967]],
    [[-1.3994, -0.1521, -0.1473],
     [ 1.9194,  1.0458,  0.6705],
     [-1.1802, -0.9796,  1.4086]]])
>>> X = torch.linalg.lstsq(A, B).solution # A is broadcasted to shape (2, 3, 3)
>>> torch.dist(X, torch.linalg.pinv(A) @ B)
tensor(1.5152e-06)

>>> S = torch.linalg.lstsq(A, B, driver='gelsd').singular_values
>>> torch.dist(S, torch.linalg.svdvals(A))
tensor(2.3842e-07)

>>> A[:, 0].zero_()  # Decrease the rank of A
>>> rank = torch.linalg.lstsq(A, B).rank
>>> rank
tensor([2])

© 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.lstsq.html

Spec-Zone.ru

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