2012-04-13 182 views
8

我有一个非常具体的要求,使用6次多项式插值非线性数据。我已经看到numpy/scipy例程(scipy.interpolate.InterpolatedUnivariateSpline),允许插值仅达到5度。6度曲线拟合与numpy/scipy

即使没有直接的函数来执行此操作,是否有办法在Excel中复制LINEST线性回归算法蟒蛇? 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(XX,*系数_)',还注意到,P0应具有至少为1的长度,为0度多项式。 – martijnn2008 2016-06-06 20:04:51