@ Бренелла кажется правильным, даже если вы выполняете наименьших квадратов, решая с помощью псевдообращения Мура-Пенроуза, это значительно быстрее, чем np.linalg.lstsq
:
import numpy as np
import time
semivariance=np.random.uniform(0,100,[5030,5030]).astype(np.float64)
prediction=np.random.uniform(0,100,[5030,1]).astype(np.float64)
start=time.time()
weights_lstsq = np.linalg.lstsq(semivariance, prediction, rcond=None)
print("Took: {}".format(time.time()-start))
>>> Took: 34.65818190574646
start=time.time()
weights_pseudo = np.linalg.solve(semivariance.T.dot(semivariance),semivariance.T.dot(prediction))
print("Took: {}".format(time.time()-start))
>>> Took: 2.0434153079986572
np.allclose(weights_lstsq[0],weights_pseudo)
>>> True
Вышесказанное относится не к вашим точным матрицам, а к образцам, скорее всего, переносится. np.linalg.lstsq
выполняет задачу оптимизации, минимизируя || b - a x ||^2
, чтобы решить для x
в ax=b
. Это обычно быстрее на очень больших матрицах, поэтому линейные модели часто решаются с использованием градиентного приличия в нейронных сетях, но в этом случае матрицы просто недостаточно велики для повышения производительности.