2012-04-13 26 views
8

Tengo un requisito muy específico para la interpolación de datos no lineales utilizando un polinomio de 6 ° grado. He visto rutinas numpy/scipy (scipy.interpolate.InterpolatedUnivariateSpline) que permiten la interpolación solo hasta el grado 5.Ajuste de curva de 6 ° grado con numpy/scipy

Aunque no haya una función directa para hacer esto, ¿hay alguna forma de replicar el algoritmo de regresión lineal ESTIMACION.LINEAL de Excel en ¿Pitón? ESTIMACION.LINEAL permite el ajuste de curvas de 6º grado, pero NO quiero usar Excel para nada, ya que este cálculo es parte de un script de Python mucho más grande.

¡Cualquier ayuda sería apreciada!

Respuesta

17

Puede usar scipy.optimize.curve_fit para adaptar la función que desee (dentro de lo razonable) a sus datos. La firma de esta función es

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

y utiliza mínimos cuadrados no lineales ajustada para adaptarse a una función f a los datos ydata(xdata). En su caso me gustaría probar algo como:

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

que se debe dar algo como:

enter image description here

+0

Puede usar 'yfit = _polynomial (xx, * Coef)', también cuenta que p0 debe tener al menos una longitud de 1, por un polinomio de 0 grados. – martijnn2008

Cuestiones relacionadas