Spec-Zone.ru › PyTorch 1

torch.linalg.lstsq

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

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

Пусть 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 выбирает функцию LAPACK/MAGMA, которая будет использоваться. Для входных данных на CPU допустимые значения — ‘gels’, ‘gelsy’, ‘gelsd, ‘gelss’. Для входных данных CUDA единственный допустимый драйвер — ‘gels’, который предполагает, что A имеет полный ранг. Для выбора лучшего драйвера на CPU следует учитывать:

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

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

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

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

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. Его форма совпадает с размерами пакета A. Он вычисляется, когда 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 (Тензор) – тензор слева формы (*, m, n) , где * — ноль или более размерностей пакета.
  • B (Тензор) – тензор справа формы (*, m, k) , где * — ноль или более размерностей пакета.
  • rcond (float, необязательно) – используется для определения эффективного ранга A. Если rcond= None, rcond устанавливается в машинной точности типа данных A умноженной на max(m, n). По умолчанию: None.
Ключевые аргументы:

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

Возвращает:

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

Примеры:

>>> A = torch.tensor([[[10, 2, 3], [3, 10, 5], [5, 6, 12]]], dtype=torch.float) # shape (1, 3, 3)
>>> B = torch.tensor([[[2, 5, 1], [3, 2, 1], [5, 1, 9]],
                      [[4, 2, 9], [2, 0, 3], [2, 5, 3]]], dtype=torch.float) # shape (2, 3, 3)
>>> X = torch.linalg.lstsq(A, B).solution # A is broadcasted to shape (2, 3, 3)
>>> torch.dist(X, torch.linalg.pinv(A) @ B)
tensor(2.0862e-07)

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

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

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

Spec-Zone.ru

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