Вы можете использовать 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()
, который должен дать вам что-то вроде:
Не могу поверить, что раньше не думал об этом! Спасибо :) – prrao
+1 Не могу поверить, что я написал излишне сложный пример, а не помню процедуру 'polyfit'! – Chris