我正在研究使用正弦波数据的曲线拟合优化问题。我有大约 16 个几乎相同的正弦波数据周期,但我遇到了 y 轴偏移问题。偏移量总是略有偏差,我不确定是什么导致了这种差异。
以下是我的数据和方法的简要描述:
如果您能就可能导致此问题的原因以及如何解决该问题提供任何见解或建议,我将不胜感激。谢谢!
from scipy.optimize import curve_fit
def sine_wave(t, A, phi_beta, phi_alpha, C):
return A * np.sin(2 * np.pi * primary_frequency * t + phi_beta*t +phi_alpha) + C
initial_guess = [np.ptp(CH2) / 2, 800, 200, np.mean(CH2)]
params, _ = curve_fit(sine_wave, time, CH2, p0=initial_guess, maxfev=10000)
A, phi_beta,phi_alpha, C = params
fitted_CH2_with_primary_freq = sine_wave(time, average_amplitude, phi_beta, phi_alpha, C)
输出如下:
如果没有手头的数据,我将不得不进行一些推测,但根据经验,我猜测您遇到以下问题之一
我认为这是最有可能的。这意味着您的数据不是正弦波,这实际上是最合适的。您是否有任何理论表明您的数据应该遵循正弦波? (并不是所有的周期函数都是正弦波。我见过很多本科生都犯过这样的错误。)
Scipy
curve_fit
使用 scipy.optimize.minimize
函数,这是一个局部最小化器。如果您的 X² 在参数空间中是非凸的,您可能会陷入局部最小值。您可以尝试单独衡量您的系统偏差并将其设置为约束。 (或者只需将 C 替换为您测量的数字)计算两者的减少卡方并选择更好的选择。或者,您可以定义自己的损失函数并运行全局搜索算法,例如 scipy.optimize.dual_annealing()
。 (我已在我的 fitting_toolkit 存储库中实现了此分布拟合)
3.不稳定的损失函数scipy.optimize.curvefit
使用最小二乘拟合,这对于非多项式模型来说非常不稳定。在这种情况下,您可能需要使用另一种优化,例如最大似然估计