我不明白这个数据拟合有什么问题:
from scipy.optimize import curve_fit
def sin_fit(x, *p):
a,b,c,d= p
return a + b*np.sin(c*x+ d)
# p0 is the initial guess for the fitting coefficients
p0 = [0.1, 1., 1., 0.1]
coeff, var_matrix = curve_fit(sin_fit, t, data, p0=p0)
我想要么是有一些明显的错误,我现在缺少了,或者我不能使用scipy的曲线拟合来解决这个问题。有什么想法吗?
答案 0 :(得分:4)
这似乎是您最初猜测的问题,特别是您选择的频率太远了。根据您当前的初始猜测p0
,curve_fit
无法快速收敛到一个好答案,因此您需要选择更好的p0
。这是我的意思的一个例子:
t = np.linspace(0,50,1000)
data = 0.275 * (np.random.rand(len(t)) * 0.2 + 1.) * np.sin(2. * np.pi / 15. * t - 7.5)
p0 = [0.2, 0.5, 1.5 * np.pi / 14, 0.]
coeff, var_matrix = curve_fit(sin_fit, t, data, p0=p0)
plt.plot(t, data, 'bo')
plt.plot(t, sin_fit(t, *p0), 'g-')
plt.plot(t, sin_fit(t, *coeff), 'r-')
下面你可以看到,通过更接近的初始猜测(绿色曲线)curve_fit
将更好地执行拟合(红色曲线):
答案 1 :(得分:3)
一切正常,算法找到了本地最小值,正如它应该做的那样。 你对频率的初步猜测远非现实。
良好的拟合不仅依赖于正确的模型,还依赖于良好的起始值。 特别是对于周期性曲线,高次谐波可以形成局部最小值。
这就是为什么拟合绝不是像数据一样的黑盒子 - >结果机制。 几乎总是需要用户干扰。 如果这不是有利的,并且您有这样的数据,而是使用傅里叶分析来获取目标信息。