用python进行智能拟合
Python中是否有比scipy.optimize.curve\u fit更智能的函数? 我还需要定义一个函数来适应数据 我花了很长时间试图用它来拟合数据。我只能拟合基本函数,用分段函数拟合两条直线是不可能的,而y轴的值较低,如0.01-0.05,x轴的值为20-60。 我知道我必须插入初始值,但它仍然需要太多时间,有时不起作用 编辑 我在拟合数据的地方添加了图形,您可以在用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
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.])