SciPy:使用多项式的通用拟合函数

时间:2013-09-19 08:01:13

标签: python scipy functools

我尝试使用SciPy的curve_fit方法生成通用拟合多项式。我目前的简化代码如下所示:

import functools
import scipy.optimize

def __fit_polynom_order_6(self, data):
    def func(x, c1=None, c2=None, c3=None, c4=None, c5=None, c6=None):
        return c1*x + c2*x**2 + c3*x**3 + c4*x**4 + c5*x**5 + c6*x**6

    x, y = data[:,0], data[:,1]
    popt, pcov = scipy.optimize.curve_fit(func, x, y)

    func_fit = functools.partial(func, c1=popt[0],c2=popt[1],c3=popt[2],c4=popt[3],c5=popt[4],c6=popt[5])

    return func_fit

现在我还想要使用n的多项式进行拟合,从而生成一个自动生成多项式的泛型函数__fit_polynom_order_n(self, n, data),它与上面的函数基本相同,但具有任意多项式。

我这样做的尝试都没有结果。你能帮我吗?提前谢谢!

1 个答案:

答案 0 :(得分:2)

已有一个功能,np.polyfit

fit = np.polyfit(x, y, n)

另一方面,您的func没有一个常数。这是故意的吗?

如果您希望编写自己的polyfit类型方法,则可能需要学习source code for np.polyfit。您会看到问题被设置为线性矩阵方程,并使用np.linalg.lstsq求解,而不是更通用的scipy.optimize.curve_fit

# set up least squares equation for powers of x
lhs = vander(x, order)
rhs = y
c, resids, rank, s = lstsq(lhs, rhs, rcond)

有用的参考:

  • np.vander - 啊哈,这可以用来评估x处的多项式。如果您想要消除常数项,则必须删除np.vander返回的最右列。