智能拟合python

时间:2016-12-02 16:25:02

标签: python scipy curve-fitting

Python中有比scipy.optimize.curve_fit更智能的功能吗? 我还需要定义一个函数来使数据适合。

我花了很多时间尝试使用它来配合数据。我只能拟合基本功能,并且不能用分段函数拟合两条线,而y轴具有0.01-0.05的低值和20-60的x轴值。 我知道我必须插入初始值,但它仍然需要太多时间,有时它不起作用。

修改

我添加了图表,我在哪里拟合数据,您可以看到scipy.optimize.curve_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])

初始条件每次都相同,我认为它们足够接近:

p0=[-0.001,0.2,0.005,0.] 

因为最合适的参数值是:

[-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.])

从无边界开始,以最佳边界结束

Fitting data and changing bound in scipy.optimize.curve_fit

我仍然认为,这需要花费太多时间,curve_fit可以更好地找到它。这种方式我几乎必须指定函数,看起来我很适合改变参数而不是curve_fit是合适的。

2 个答案:

答案 0 :(得分:0)

在不知道Python中的回归算法究竟是什么的情况下,很难给出明确的答案。可能微积分是迭代的并且需要初始猜测,这可能是从指定的边界导出的。因此,界限对收敛和结果有间接影响。

我建议尝试一下来自本文的更简单的算法(不是迭代,没有初步猜测):https://fr.scribd.com/document/380941024/Regression-par-morceaux-Piecewise-Regression-pdf

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

要拟合的分段函数是:enter image description here 要计算的参数是a1,p1,q1,p2和q2。

enter image description here

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

enter image description here

因此,不需要指定边界,因此没有与边界相关的问题。

注意:该方法基于方便的积分方程的拟合,如上面引用的论文所示。如果点的数量太小,则积分的数值微分受到偏差。在目前的情况下,他们是大量的积分。因此,即使分散,这也是该方法实际应用的有利案例。

答案 1 :(得分:0)

1. curve_fit背后的算法期望可微函数,因此如果给出非差分函数,它可以向南。

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