Chcę użyć do obliczeń fizycznych numpy.polyfit
, dlatego potrzebuję wielkości błędu.Jaki jest błąd numpy.polyfit?
Odpowiedz
Jeśli podasz full=True
w wywołaniu polyfit
będzie zawierać dodatkowe informacje:
>>> x = np.arange(100)
>>> y = x**2 + 3*x + 5 + np.random.rand(100)
>>> np.polyfit(x, y, 2)
array([ 0.99995888, 3.00221219, 5.56776641])
>>> np.polyfit(x, y, 2, full=True)
(array([ 0.99995888, 3.00221219, 5.56776641]), # coefficients
array([ 7.19260721]), # residuals
3, # rank
array([ 11.87708199, 3.5299267 , 0.52876389]), # singular values
2.2204460492503131e-14) # conditioning threshold
Wartość rezydualna jest zwracana suma kwadratów nadające błędów, nie wiem, czy to jest to, czego po:
>>> np.sum((np.polyval(np.polyfit(x, y, 2), x) - y)**2)
7.1926072073491056
w wersji 1.7 jest również cov
kluczowe że zwróci macierz kowariancji dla współczynników, które można użyć do obliczenia niepewności pasowania samych współczynników.
Jak widać w documentation:
Returns
-------
p : ndarray, shape (M,) or (M, K)
Polynomial coefficients, highest power first.
If `y` was 2-D, the coefficients for `k`-th data set are in ``p[:,k]``.
residuals, rank, singular_values, rcond : present only if `full` = True
Residuals of the least-squares fit, the effective rank of the scaled
Vandermonde coefficient matrix, its singular values, and the specified
value of `rcond`. For more details, see `linalg.lstsq`.
Co oznacza, że jeśli można zrobić dopasowanie i uzyskać pozostałości jak:
import numpy as np
x = np.arange(10)
y = x**2 -3*x + np.random.random(10)
p, res, _, _, _ = numpy.polyfit(x, y, deg, full=True)
Następnie p
są o dopasowanie parametrów, a res
będzie pozostałością, jak opisano powyżej. _
są dlatego, że nie trzeba zapisywać ostatnich trzech parametrów, więc można po prostu zapisać je w zmiennej _
, której nie będziecie używać. Jest to konwencja i nie jest wymagana.
@ Odpowiedź Jaime'a wyjaśnia, co oznacza wartość rezydualna. Inną rzeczą, którą możesz zrobić, to przyjrzeć się kwadratowym odchyleniom jako funkcji (której suma wynosi res
). Jest to szczególnie pomocne, aby zobaczyć trend, który nie pasował dostatecznie. res
mogą być duże, ponieważ hałas statystycznych, ewentualnie systematycznym złym montażu, na przykład:
x = np.arange(100)
y = 1000*np.sqrt(x) + x**2 - 10*x + 500*np.random.random(100) - 250
p = np.polyfit(x,y,2) # insufficient degree to include sqrt
yfit = np.polyval(p,x)
figure()
plot(x,y, label='data')
plot(x,yfit, label='fit')
plot(x,yfit-y, label='var')
Więc na rysunku, należy zwrócić uwagę na złe dopasowanie pobliżu x = 0
:
wiesz, jeśli np.polyfit używa TLS (Total Least Squares, znany również jako Orthogonal Least Squares), lub OLS (Ordinary Least Squares), aby znaleźć najlepsze dopasowanie? –