#python #numpy #least-squares
#питон #тупица #наименьшие квадраты
Вопрос:
Я пытаюсь сравнить производительность numpy.linalg.lstsq с решением задачи наименьших квадратов вручную. Я написал следующий код.
import numpy as np import timeit m,n = 400,10 A = np.random.rand(m,n) b = np.random.rand(m) t1 = timeit.timeit(lambda : np.linalg.inv(A.T@A) @ A.T @ b, number=100) t2 = timeit.timeit(lambda : np.linalg.solve(A.T@A, A.T@b), number=100) t3 = timeit.timeit(lambda : np.linalg.lstsq(A,b)[0], number=100) print(t1) print(t2) print(t3)
К моему удивлению, результат таков
0.0040054810015135445 0.002654149997397326 0.010454912000568584
lstsq
примерно в 5 раз медленнее. Почему это происходит?
Комментарии:
1. Я предполагаю , что
lstsq
это предназначено для решения более общей проблемы, котораяA
не является квадратной или «хорошо сформированной». Например, если я используюpinv(A.T@A)
в первом примере, время немного медленнее, чемlstsq
.