numpy.linalg.lstsq слишком медленный

#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 .