用python进行智能拟合

用python进行智能拟合,python,scipy,curve-fitting,Python,Scipy,Curve Fitting,Python中是否有比scipy.optimize.curve\u fit更智能的函数? 我还需要定义一个函数来适应数据 我花了很长时间试图用它来拟合数据。我只能拟合基本函数,用分段函数拟合两条直线是不可能的,而y轴的值较低,如0.01-0.05,x轴的值为20-60。 我知道我必须插入初始值,但它仍然需要太多时间,有时不起作用 编辑 我在拟合数据的地方添加了图形,您可以在scipy.optimize.curve\u fit中看到更改边界的效果 我适合的功能是: def abslines(x,a

Python中是否有比scipy.optimize.curve\u fit更智能的函数? 我还需要定义一个函数来适应数据

我花了很长时间试图用它来拟合数据。我只能拟合基本函数,用分段函数拟合两条直线是不可能的,而y轴的值较低,如0.01-0.05,x轴的值为20-60。 我知道我必须插入初始值,但它仍然需要太多时间,有时不起作用

编辑

我在拟合数据的地方添加了图形,您可以在
scipy.optimize.curve\u fit
中看到更改边界的效果

我适合的功能是:

def abslines(x,a,b,c,d):
    return np.piecewise(x, [x < -b/a, x >= -b/a], [lambda x: a*x+b+d, lambda x: c*(x+b/a)+d])
因为最佳拟合的参数值为:

[-0.00411946  0.19895546  0.00817832  0.00758401]
界限是:

没有界限

bounds=([-1.,0.,0.,0.],[0.,1.,1.,1.])
bounds=([-0.5,0.01,0.0001,0.],[-0.001,0.5,0.5,1.])
bounds=([-0.1,0.01,0.0001,0.],[-0.001,0.5,0.1,1.])
bounds=([-0.01,0.1,0.0001,0.],[-0.001,0.5,0.1,1.])
以无边界开始,以最佳边界结束


但我仍然认为,这需要太多的时间,
curve\u fit
可以找到更好的方法。通过这种方式,我几乎必须指定函数,而且似乎我是通过更改参数来拟合的,而不是
曲线拟合
拟合。

如果不知道Python中的回归算法是什么,就很难给出明确的答案。可能演算是迭代的,需要初始猜测,这些猜测可能来自指定的边界。因此,边界对收敛性和结果有间接影响

我建议尝试一种更简单的算法(不是迭代的,没有初始猜测):

代码很容易用任何计算机语言编写。我想这也可以用Python实现

拟拟合的分段函数为: 要计算的参数为a1、p1、q1、p2和q2

结果如下图所示,带有参数的近似值

因此,不需要指定任何边界,因此不存在与边界相关的问题


注:该方法基于上述参考文献中所示的方便积分方程的拟合。如果点数太少,积分的数值演算会出现偏差。在目前的情况下,它们是大量的点。因此,即使是分散的情况,这也是该方法实际应用的有利情况。

1.曲线拟合后的算法期望可微函数,因此,如果给定非微分函数,它可能会南下

  • 要获得更强大的曲线拟合界面,请查看
    lmfit

    可能是
    numpy.polyfit
    numpy.linalg.lstsq
    Hmmm,我忘了添加我适合各种函数,所以我需要定义函数来适合数据。Polyfit对我的箱子没用。我将编辑这个问题。但是谢谢:)对不起,你到底是什么意思?你说“需要定义函数来拟合数据”是什么意思?你能举一个例子说明曲线拟合不能满足你的要求吗?曲线拟合可以拟合您提供的任何函数。收敛性取决于许多参数,包括您的初始猜测。根据你的描述,我猜曲线拟合没有错,但是你没有正确地使用它。任何曲线拟合函数都会有一些限制,其中一些限制可以通过非常透彻地理解函数的工作原理来克服。我建议您阅读
    curve\u fit
    上的所有文档,然后再试一次。除此之外,如果您对它的工作方式有特定需求,那么如果您了解曲线拟合在一般情况下的工作方式,您可以使用
    numpy.linalg.lstsq
    为您想要的任何函数形式创建自己的拟合。文档中有一个拟合线性数据的非常简单的示例。
    bounds=([-1.,0.,0.,0.],[0.,1.,1.,1.])
    bounds=([-0.5,0.01,0.0001,0.],[-0.001,0.5,0.5,1.])
    bounds=([-0.1,0.01,0.0001,0.],[-0.001,0.5,0.1,1.])
    bounds=([-0.01,0.1,0.0001,0.],[-0.001,0.5,0.1,1.])