2013-03-30 9 views

Odpowiedz

20

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.

+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? –

16

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:
polyfit