2013-03-30 16 views

cevap

20

, ekstra bilgileri içerecektir:

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

döndü kalıntı değeri uyum hataların karelerinin toplamı, bu ne olduğundan emin değilse sonra: sürümünde 1.7 olarak

>>> np.sum((np.polyval(np.polyfit(x, y, 2), x) - y)**2) 
7.1926072073491056 

size uygun katsayılar kendilerinin belirsizliği hesaplamak için kullanabilirsiniz senin katsayıları için kovaryans matrisi döndürür bir cov kelime de vardır.

+0

Eğer np.polyfit anlarım En iyi uyumu bulmak için TLS (Ortogonal En Küçük Kareler olarak da bilinen Toplam En Küçük Kareler) veya OLS (Sıradan En Küçük Kareler) kullanır? –

16

Eğer documentation görebileceğiniz gibi:

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`. 

bir uyum yapmak gibi artıklar alabilirsiniz Eğer Anlamı: Sonra

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) 

, p sizin uygun parametrelerdir, ve res, yukarıda açıklandığı gibi artıklar olacaktır. _'lar, son üç parametreyi kaydetmeniz gerekmediğinden, bunları kullanamayacağınız _ değişkenine kaydedebilirsiniz. Bu bir sözleşmedir ve gerekli değildir.


@ Jaime'nin cevabı, artıkların ne anlama geldiğini açıklar. Yapabileceğiniz diğer bir şey de, bu kare sapmalara bir fonksiyon olarak bakmaktır (toplamı res). Bu, yeterince uymayan bir eğilim görmek için özellikle yararlıdır. Şekilde Yani

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') 

x = 0 yakın kötü uyum not: res örneğin, çünkü istatistiksel gürültü, ya da muhtemelen sistematik kötü armatürün büyük olabilir
polyfit