Более быстрый способ поиска решения методом наименьших квадратов для большой матрицы - PullRequest
0 голосов
/ 11 мая 2018

Я хочу найти решение матрицы наименьших квадратов и использую функцию numpy linalg.lstsq;

weights = np.linalg.lstsq(semivariance, prediction, rcond=None)

Размерность для моих переменных:

semivariance - это число размером 5030 x 5030

prediction - это одномерный массив длиной 5030

У меня проблема в том, что для возврата значения weights требуется примерно 80 секунд, и мне приходится повторять вычисления weights примерно в 10000 раз, поэтому время вычислений просто увеличивается.

Есть ли более быстрый способ / питоническая функция для этого?

1 Ответ

0 голосов
/ 14 мая 2018

@ Бренелла кажется правильным, даже если вы выполняете наименьших квадратов, решая с помощью псевдообращения Мура-Пенроуза, это значительно быстрее, чем 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. Это обычно быстрее на очень больших матрицах, поэтому линейные модели часто решаются с использованием градиентного приличия в нейронных сетях, но в этом случае матрицы просто недостаточно велики для повышения производительности.

...