2012-04-13 3 views
8

У меня есть очень специфическое требование для интерполяции нелинейных данных с использованием полинома 6-й степени. Я видел numpy/scipy подпрограммы (scipy.interpolate.InterpolatedUnivariateSpline), которые допускают интерполяцию только до степени 5.Подбор кривой 6-й степени с numpy/scipy

Даже если для этой функции нет прямой функции, существует ли способ репликации алгоритма линейной регрессии LINEST в LINUE Python? LINEST допускает установку кривой 6-го уровня, но я НЕ хочу использовать Excel для чего-либо, поскольку этот расчет является частью гораздо более крупного сценария Python.

Любая помощь будет оценена!

ответ

17

Вы можете использовать scipy.optimize.curve_fit, чтобы соответствовать любой функции, которую вы хотите (в пределах разумного), к вашим данным. Сигнатура этой функции

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

и использует нелинейные по методу наименьших квадратов, чтобы соответствовать функции f данным ydata(xdata). В вашем случае я хотел бы попробовать что-то вроде:

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

Вы можете использовать 'yfit = _polynomial (хх, * коэфф)', также отмечают, что p0 должен иметь по крайней мере длину 1, для 0 степени полинома. – martijnn2008

Смежные вопросы