Python中带递增振荡余弦函数的数据拟合优化咨询
曲线拟合优化建议
优化初始参数猜测
curve_fit的拟合结果高度依赖初始参数guess,若初始值偏离最优解,极易陷入局部最优。针对你的函数,可根据数据特征设置更合理的初始值:
- 观察x趋近于0时的y值(如x=0.1时y≈0.91),
i0可设为接近该稳态值的数(比如0.9); w1是指数衰减与余弦项的共同尺度,从x>0.8的波动周期看,初始值可设为0.2;a为余弦项振幅,参考x>0.8区域y值的波动范围(-7.46到0.06),初始值设为5左右;ph(相位偏移)初始值设为0.1,off(整体偏移)参考y的平均水平设为-2。
示例初始猜测代码:
guess = [0.9, 5, 0.2, 0.1, -2]
拆分函数共享参数
当前函数中指数衰减项和余弦项共享同一个w1,这可能限制拟合灵活性——指数衰减的特征尺度与余弦波动的周期未必一致。建议将两者的尺度参数分离,修改函数为:
def expcos(x, i0, a, w_exp, w_cos, ph, off): return i0 + (1-i0)*np.exp(-x/w_exp) + a*np.cos((2*np.pi/w_cos)*(x - ph)) + off
这样指数衰减速率和余弦波动周期可独立拟合,更适配x>0.8区域的波动与衰减特征。
为高关注区域添加拟合权重
x>0.8部分数据波动大,但默认curve_fit采用等权重拟合。可手动设置权重,让拟合更侧重该区域:
import numpy as np from scipy.optimize import curve_fit # 生成权重数组:x>0.8的点权重设为2,其余为1 weights = np.where(np.array(x) > 0.8, 2, 1) # 带权重拟合 popt, pcov = curve_fit(expcos, x, y, guess, sigma=1/weights)
排查数据异常值
观察x>0.8的y值,x=1.14990234对应的y=-7.46744701与相邻点偏差显著,可能是异常值。尝试移除该点后再拟合,验证是否能提升效果:
# 过滤异常点 x_filtered = [val for val in x if val != 1.14990234] y_filtered = [y[i] for i, val in enumerate(x) if val != 1.14990234] # 重新拟合 popt, pcov = curve_fit(expcos, x_filtered, y_filtered, guess)
内容的提问来源于stack exchange,提问作者Krystal
相关产品推荐
相关产品推荐

