Я видел этот список здесь и не мог поверить, что было так много способов решить наименьших квадратов. «Нормальные уравнения» на Википедии , казалось, довольно прямым
Так почему бы просто не использовать их? Я предположил, что должна быть проблема с вычислениями или точностью, учитывая, что в первой ссылке выше Марк Л. Стоун упоминает, что SVD или QR являются популярными методами в статистическом программном обеспечении и что нормальные уравнения «УЖАСНЫ с точки зрения надежности и численной точности». Однако в следующем коде нормальные уравнения дают мне точность ~ 12 десятичных знаков по сравнению с тремя популярными функциями python: полифит numpy ; регресс Сципи ; и scikit-Learn LinearRegression .
Что еще интереснее, метод нормальных уравнений самый быстрый, когда n = 100000000. Время вычислений для меня: 2,5 с для линейного хода; 12,9 с для полифита; 4.2s для LinearRegression; и 1,8 с для нормального уравнения.
Код:
import numpy as np
from sklearn.linear_model import LinearRegression
from scipy.stats import linregress
import timeit
b0 = 0
b1 = 1
n = 100000000
x = np.linspace(-5, 5, n)
np.random.seed(42)
e = np.random.randn(n)
y = b0 + b1*x + e
# scipy
start = timeit.default_timer()
print(str.format('{0:.30f}', linregress(x, y)[0]))
stop = timeit.default_timer()
print(stop - start)
# numpy
start = timeit.default_timer()
print(str.format('{0:.30f}', np.polyfit(x, y, 1)[0]))
stop = timeit.default_timer()
print(stop - start)
# sklearn
clf = LinearRegression()
start = timeit.default_timer()
clf.fit(x.reshape(-1, 1), y.reshape(-1, 1))
stop = timeit.default_timer()
print(str.format('{0:.30f}', clf.coef_[0, 0]))
print(stop - start)
# normal equation
start = timeit.default_timer()
slope = np.sum((x-x.mean())*(y-y.mean()))/np.sum((x-x.mean())**2)
stop = timeit.default_timer()
print(str.format('{0:.30f}', slope))
print(stop - start)
источник
Ответы:
Иногда вам не хватает нормальных уравнений, а иногда нет.
источник
Если вам нужно решить только эту проблему с одной переменной, то используйте формулу. В этом нет ничего плохого. Я мог видеть, как вы пишете несколько строк кода в ASM для встроенного устройства, например. На самом деле, я использовал такое решение в некоторых ситуациях. Конечно, вам не нужно перетаскивать большие статистические библиотеки, чтобы решить эту маленькую проблему.
Числовая нестабильность и производительность - это проблемы больших проблем и общей настройки. Если вы решаете многомерный метод наименьших квадратов и т. Д. Для общей проблемы вы, конечно, не будете использовать это.
источник
Ни один современный статистический пакет не решит линейную регрессию с помощью нормальных уравнений. Нормальные уравнения существуют только в статистических книгах.
Нормальные уравнения не должны использоваться, поскольку вычисление обратной матрицы очень проблематично.
Зачем использовать градиентный спуск для линейной регрессии, когда доступно математическое решение замкнутой формы?
источник