Python curve_fit初始猜测自动化适配多组XY数据失败问题排查
关于scipy curve_fit指数拟合的自动化初始猜测问题
这是Stack Overflow相关问题的延伸,我有四组XY点需要用指数函数拟合,使用scipy.optimize.curve_fit工具,大部分数据组合拟合正常,但存在部分组合因初始猜测值不合适导致拟合失效,需要找到适配所有数据的自动化初始猜测方案。
数据集
- X数据集:
- list_x1:
[3.139, 2.53, 0.821, 0.27] - list_x2:
[859.8791936328762, 805.5080517453312, 639.2578427310567, 496.3622821767497]
- list_x1:
- Y数据集:
- list_y1:
[0.21, 0.49, 1.56, 23.97] - list_y2:
[0.01, 0.01, 0.04, 2.46]
- list_y1:
初始拟合代码
from scipy.optimize import curve_fit import matplotlib.pyplot as plt import numpy as np list_x = [859.8791936328762, 805.5080517453312, 639.2578427310567, 496.3622821767497] list_y = [0.01, 0.01, 0.04, 2.46] def func_exp(x, a, b, c, d): return a + b*np.exp(-c*(x-d)) # 自动化初始猜测 p0 = (0, max(list_x), 0, max(list_y)) list_line_info, pcov = curve_fit(func_exp, list_x, list_y, maxfev=100000, p0=p0) # 绘制拟合曲线与数据点 plot_x = np.linspace(min(list_x), max(list_x), 1000) plot_y = func_exp(plot_x, *list_line_info) plt.plot(plot_x, plot_y, linestyle="-", color="orangered") plt.plot(list_x, list_y, linestyle="--", color="dodgerblue") plt.scatter(list_x, list_y, color="black", zorder=2) plt.grid()
问题现象
- 上述初始猜测
p0 = (0, max(list_x), 0, max(list_y))对list_x1、list_x2与list_y1的所有组合拟合效果正常,但list_x2 + list_y2组合拟合失效,曲线完全偏离数据点; - 调整初始猜测为
p0 = (0, max(list_x), 0.01, max(list_y))后,list_x2 + list_y2组合拟合恢复正常,但list_x1 + list_y2组合又出现拟合偏差问题。
后续尝试的修改
根据评论建议调整了初始猜测的参数对应关系,代码如下:
from scipy.optimize import curve_fit import matplotlib.pyplot as plt import numpy as np list_x = [859.8791936328762, 805.5080517453312, 639.2578427310567, 496.3622821767497] list_y = [0.21, 0.49, 1.56, 23.97] def func_exp(x, a, b, c, d): return a + b*np.exp(-c*(x-d)) # 修改后的初始猜测 p0 = (0, max(list_y), 0, max(list_x)) list_line_info, pcov = curve_fit(func_exp, list_x, list_y, maxfev=100000, p0=p0) plot_x = np.linspace(min(list_x), max(list_x), 1000) plot_y = func_exp(plot_x, *list_line_info) plt.plot(plot_x, plot_y, linestyle="-", color="orangered") plt.plot(list_x, list_y, linestyle="--", color="dodgerblue") plt.scatter(list_x, list_y, color="black", zorder=2) plt.grid()
但该修改仍无法覆盖所有数据组合,其中一组组合的拟合曲线与数据点严重偏离。
提问
请问我遗漏了什么关键点?如何实现能适配所有四组XY数据组合的自动化初始猜测?
内容的提问来源于stack exchange,提问作者Fish1996
相关产品推荐
相关产品推荐

