2012-04-13 27 views
8

6. dereceden bir polinom kullanarak doğrusal olmayan verileri enterpolasyon için çok özel bir gereksinim var. Sayısal/scipy rutinlerini (scipy.interpolate.InterpolatedUnivariateSpline) interpolasyonu yalnızca 5. dereceye kadar sağladığını gördüm.Numune/scipy ile 6 derecelik eğri uydurma

Bunu yapmak için doğrudan bir işlev olmasa bile, Excel'in LINEST doğrusal regresyon algoritmasını çoğaltmanın bir yolu var mı? Python? LINEST 6 derecelik eğri uydurma sağlar, ancak bu hesaplama çok daha büyük bir Python betiğinin parçası olduğu için Excel'i hiçbir şey için kullanmak istemiyorum.

Herhangi bir yardım için teşekkür ederiz!

cevap

17

scipy.optimize.curve_fit nolu verileri, verilerinize istediğiniz herhangi bir şekilde (nedensiz) verilerinize sığdırmak için kullanabilirsiniz. Bu fonksiyonun imza

curve_fit(f, xdata, ydata, p0=None, sigma=None, **kw) 

ve bu veri ydata(xdata) bir fonksiyon f uyacak şekilde uyan lineer-olmayan en küçük kareler kullanılır. Size böyle bir şey vermelidir

import numpy 
from scipy.optimize import curve_fit 
import matplotlib.pyplot as plt 

def _polynomial(x, *p): 
    """Polynomial fitting function of arbitrary degree.""" 
    poly = 0. 
    for i, n in enumerate(p): 
     poly += n * x**i 
    return poly 

# Define some test data: 
x = numpy.linspace(0., numpy.pi) 
y = numpy.cos(x) + 0.05 * numpy.random.normal(size=len(x)) 

# p0 is the initial guess for the fitting coefficients, set the length 
# of this to be the order of the polynomial you want to fit. Here I 
# have set all the initial guesses to 1., you may have a better idea of 
# what values to expect based on your data. 
p0 = numpy.ones(6,) 

coeff, var_matrix = curve_fit(_polynomial, x, y, p0=p0) 

yfit = [_polynomial(xx, *tuple(coeff)) for xx in x] # I'm sure there is a better 
                # way of doing this 

plt.plot(x, y, label='Test data') 
plt.plot(x, yfit, label='fitted data') 

plt.show() 

:

enter image description here

+0

Ayrıca, 'yfit = _polynomial (xx * Katsayıların) 'kullanan p0 bir 0 derece polinomun, 1, en az bir uzunluğa sahip olmalıdır belirtebiliriz. – martijnn2008

İlgili konular