6-й градус кривой кривой с NumPy/ Scipy

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

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

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

2 ответа

Решение

Используйте программу numpys polyfit.

http://docs.scipy.org/doc/numpy-1.3.x/reference/generated/numpy.polyfit.html

Ты можешь использовать 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()

что должно дать вам что-то вроде:

Другие вопросы по тегам