मैंने इस सूची को यहाँ देखा और विश्वास नहीं कर सकता था कि कम से कम वर्गों को हल करने के बहुत सारे तरीके थे। "सामान्य समीकरण" पर विकिपीडिया एक काफी सीधे आगे रास्ता लग रहा
तो क्यों नहीं बस उनका उपयोग करें? मुझे लगा कि मार्क एल। स्टोन के ऊपर पहली कड़ी में एक कम्प्यूटेशनल या सटीक मुद्दा होना चाहिए जिसमें बताया गया है कि एसवीडी या क्यूआर सांख्यिकीय सॉफ्टवेयर में लोकप्रिय तरीके हैं और सामान्य समीकरण "विश्वसनीयता और संख्यात्मक सटीकता दृष्टिकोण से कठिन" हैं। हालांकि , निम्नलिखित कोड में, सामान्य समीकरण मुझे तीन लोकप्रिय अजगर कार्यों की तुलना में ~ 12 दशमलव स्थानों के लिए सटीकता दे रहे हैं: संख्यात्मक पॉलीफ़िट ; scipy का linregress ; और स्किकिट-लर्न ऑफ लीनियरग्रेडेशन ।
क्या अधिक दिलचस्प है कि सामान्य समीकरण विधि सबसे तेज है जब n = 100000000। मेरे लिए कम्प्यूटेशनल समय हैं: रेखीय प्रगति के लिए 2.5; पॉलीफ़िट के लिए 12.9; LinearRegression के लिए 4.2 s; और सामान्य समीकरण के लिए 1.8 s।
कोड:
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)