使用scipy.curve_fit

时间:2015-08-10 14:21:49

标签: python python-2.7 numpy scipy curve-fitting

我目前正在尝试几种方法来拟合,然后使用二次多项式函数转换一些数据。我一直在使用以下代码:

import matplotlib.pyplot as plt
import numpy
from scipy.optimize import curve_fit

def fitFunc(self, x,a,b,c):
    return a*x**2 + b*x + c

def calcQuadratic(self,data):
    """ This function fits the specified function in 'fitFunc'
    to the data, using the curve_fit package from scipy.optimize.

    INPUT: A list of (m/z,int) tuples
    OUTPUT: The parameters for the fitted function
    """
    expected = []
    observed = []
    for i in data:
        expected.append(i[0])
        observed.append(i[1])
    z = curve_fit(self.fitFunc, observed, expected)
    #############
    # Plot Code #
    #############
    newX = numpy.linspace(0,400,2500)
    yNew = self.fitFunc(newX,*z[0])
    fig =  plt.figure()
    ax = fig.add_subplot(111)
    plt.scatter(expected,observed,label='raw')
    plt.plot(newX,yNew,label='obs-exp')
    plt.legend()
    plt.show()
    ###############
    # end of plot #
    ###############
    return z[0]

随后我基本上做了转换数据:

   new = []
   for i in data:
      new.append((fitFunc(i[0],*z[0]),i[1]))

问题

上述转换可导致我的Y截距具有正X值。结果是,在转换之后,我现在找到的数据值相同(见下图)

enter image description here

紫色线连接的数据点是问题情况的例子,在~5秒和~110秒观察到的数据将被强制转换为~100秒的时间。

问题

因此,我想知道是否有办法强制函数最大值(或最小值)为X = 0?我也接受其他建议来绕过这个问题(目前,我忽略了多项式的左半部分作为临时脏黑客/修复)。

其他信息

不可能删除拟合函数的b*x部分,因为此函数也应该能够返回(接近)线性拟合,请参见下图

enter image description here

1 个答案:

答案 0 :(得分:1)

如果“接近线性”和二次结果都是合法的可能性,我怀疑你正在寻找某种经验拟合。也许幂律将是一个更好的模型:a*x**b + c。这包括抛物线的可能性(b是2)和一条线(b是1)