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