Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用numpy/scipy进行六次曲线拟合_Python_Numpy_Scipy_Curve Fitting_Linear Regression - Fatal编程技术网

Python 使用numpy/scipy进行六次曲线拟合

Python 使用numpy/scipy进行六次曲线拟合,python,numpy,scipy,curve-fitting,linear-regression,Python,Numpy,Scipy,Curve Fitting,Linear Regression,我对使用6次多项式插值非线性数据有一个非常具体的要求。我见过numpy/scipy例程(scipy.interpolate.InterpolatedUnivariateSpline),它只允许5次以内的插值 即使没有直接函数来实现这一点,有没有办法在Python中复制Excel的LINEST线性回归算法?LINEST允许6次曲线拟合,但我不想使用Excel进行任何操作,因为此计算是更大Python脚本的一部分 任何帮助都将不胜感激 您可以使用它(在合理的范围内)将您想要的任何函数适配到您的数据中

我对使用6次多项式插值非线性数据有一个非常具体的要求。我见过numpy/scipy例程(scipy.interpolate.InterpolatedUnivariateSpline),它只允许5次以内的插值

即使没有直接函数来实现这一点,有没有办法在Python中复制Excel的LINEST线性回归算法?LINEST允许6次曲线拟合,但我不想使用Excel进行任何操作,因为此计算是更大Python脚本的一部分

任何帮助都将不胜感激

您可以使用它(在合理的范围内)将您想要的任何函数适配到您的数据中。此函数的签名是

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()
这会给你一些类似的东西:

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

使用numpys polyfit例行程序


我不敢相信我以前没有想到这一点!谢谢:)+1我简直不敢相信我写出了一个不必要的复杂示例,竟然忘记了
polyfit
例程!您可以使用
yfit=_多项式(xx,*coeff)
,还请注意,对于0次多项式,p0的长度至少应为1。