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.])
从无边界开始,以最佳边界结束
我仍然认为,这需要花费太多时间,curve_fit
可以更好地找到它。这种方式我几乎必须指定函数,看起来我很适合改变参数而不是curve_fit
是合适的。
答案 0 :(得分:0)
在不知道Python中的回归算法究竟是什么的情况下,很难给出明确的答案。可能微积分是迭代的并且需要初始猜测,这可能是从指定的边界导出的。因此,界限对收敛和结果有间接影响。
我建议尝试一下来自本文的更简单的算法(不是迭代,没有初步猜测):https://fr.scribd.com/document/380941024/Regression-par-morceaux-Piecewise-Regression-pdf
代码很容易用任何计算机语言编写。我想这也可以用Python完成。
要拟合的分段函数是:
要计算的参数是a1,p1,q1,p2和q2。
结果如下图所示,带有参数的近似值。
因此,不需要指定边界,因此没有与边界相关的问题。
注意:该方法基于方便的积分方程的拟合,如上面引用的论文所示。如果点的数量太小,则积分的数值微分受到偏差。在目前的情况下,他们是大量的积分。因此,即使分散,这也是该方法实际应用的有利案例。
答案 1 :(得分:0)
1. curve_fit背后的算法期望可微函数,因此如果给出非差分函数,它可以向南。
lmfit
。