나는이 목록을보고 여기 와 최소 제곱를 해결하기 위해 많은 방법이 있었다 믿을 수 없었다. Wikipedia 의 "정상 방정식" 은 매우 간단 해 보입니다 :
왜 그냥 사용하지 않습니까? Stone L은 위의 첫 번째 링크에서 SVD 또는 QR이 통계 소프트웨어에서 널리 사용되는 방법이며 정규 방정식은 "신뢰성과 수치 정확도 관점에서 끔찍합니다"라고 언급하면서 계산 또는 정밀도 문제가 있다고 가정했습니다. 그러나 다음 코드에서 일반적인 방정식은 세 가지 인기있는 파이썬 함수와 비교할 때 ~ 12 소수 자리까지 정확도를 제공합니다. numpy 's polyfit ; scipy의 회귀 ; scikit-learn의 LinearRegression .
더 흥미로운 것은 n = 100000000 일 때 정규 방정식 방법이 가장 빠르다는 것입니다. 저의 계산 시간은 다음과 같습니다. polyfit의 경우 12.9s; LinearRegression의 경우 4.2s; 정규 방정식의 경우 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)