torch.linalg.lstsq
-
torch.linalg.lstsq(A, B, rcond=None, *, driver=None) -
Вычисляет решение задачи наименьших квадратов для системы линейных уравнений.
Пусть будет или . Задача наименьших квадратов для линейной системы с определяется как
где обозначает норму Фробениуса.
Поддерживает входы 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’). В этом случае, если являются сингулярными значениямиAв порядке убывания, будут округлены до нуля, если . Еслиrcond= None(по умолчанию), тоrcondустанавливается равным машинной точности типа данныхAумноженной наmax(m, n).Эта функция возвращает решение задачи и некоторую дополнительную информацию в именованном кортеже из четырех тензоров
(solution, residuals, rank, singular_values). Для входовA,Bформы(*, m, n),(*, m, k)соответственно, он содержит-
solution: решение задачи наименьших квадратов. Имеет форму(*, n, k). -
residuals: квадратные остатки решений, то есть, . Имеет форму, равную размерностям пакета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.
-
A (Tensor) – тензор левой части уравнения формы
- 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