我一直在try 使用scipy.curve_fit来拟合一条曲线,但它似乎坚持某个局部最小值(非常接近初始参数猜测),并且没有try 任何其他组合.通常在100-200次迭代后停止. 正如你所看到的,这种情况往往很糟糕. 预期形状为:短恒定线、斜坡线、(可选恒定线)、下斜线、短恒定线
def piecewise_linear(X, x1, x2, x22, x3, y1, y2, y3):
return np.piecewise(X, [(X < x1), (x1 <= X) & (X < x2), (x2 <= X) & (X <= x22), (x22 < X) & (X < x3), X >= x3],
[lambda X: y1, lambda X: y1 + (y2 - y1) / (x2 - x1) * (X - x1),
lambda X: y2, lambda X: y2 + (y3 - y2) / (x3 - x22) * (X - x22), lambda X: y3])
for i in range(num of vectors):
bounds = ([0, global_min_left_x, global_max_x, global_max_x, -np.inf, -np.inf,-np.inf],
[global_max_x, global_max_x, global_min_right_x, vector_length, np.inf,np.inf, np.inf])
additional_kwargs = {'method': 'dogbox', 'ftol': 1e-15, 'xtol': 1e-15, 'maxfev': 100000}
params, _ = curve_fit(piecewise_linear, X, Z, bounds=bounds,
p0=(global_min_left_x, global_max_x,global_max_x, global_min_right_x,
global_min_left_z, global_max_z, global_min_right_z),
**additional_kwargs)
fitted_curve = [piecewise_linear(x, *params) for x in X]
也许解决方案是设置正确的kwargs(tbh,我真的不确定我是否理解正确).我也try 了不同的P0,但问题是一样的-几乎没有拟合,基本上只是连接P0点.
也许看看我试图拟合的数据会有用,所以有一个例子 https://pastebin.com/f0xF9fsd