我有如下图表,我想用两条线对其进行拟合。使用Python,我成功地拟合了上半部分:
def func(x,a,b): x=np.array(x) return a*(x**b)popt,pcov=curve_fit(func,up_x,up_y)
我想用另一条线拟合下半部分,但我希望这条线通过红色线开始的点,这样我就可以得到一个连续的函数。所以我的问题是,如何使用curve_fit来指定函数必须通过的点,同时让Python计算线的斜率?(或者使用其他能够完成此任务的Python包?)
回答:
在对数空间中,你的模型的一个可能的分步参数化方法如下:
(x>q)*((x-q)*a)+(x<q)*((x-q)*c)+b
其中q
是拐点的位移,a
和c
是两部分的斜率,b
是全局的y偏移。由于模型存在不连续性,基于梯度的优化器可能不是找到最佳拟合的最佳选择。尽管如此,我尝试了scipy.optimize.leastsq
和scipy.odr
,都取得了不错的结果。