Spec-Zone.ru › PyTorch 2

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

  • Если 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. Имеет форму, равную размерностям пакета 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. Поэтому рекомендуется использовать фиксированное значение, чтобы избежать потенциальных несовместимостей.

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

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

Returns

Именованный кортеж (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])

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

Spec-Zone.ru

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