曲线拟合scipy不使用正弦?

时间:2014-10-13 16:28:18

标签: python numpy scipy curve-fitting data-fitting

我不明白这个数据拟合有什么问题:

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的曲线拟合来解决这个问题。有什么想法吗?

Failed Fit

2 个答案:

答案 0 :(得分:4)

这似乎是您最初猜测的问题,特别是您选择的频率太远了。根据您当前的初始猜测p0curve_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将更好地执行拟合(红色曲线): example figure

答案 1 :(得分:3)

一切正常,算法找到了本地最小值,正如它应该做的那样。 你对频率的初步猜测远非现实。

良好的拟合不仅依赖于正确的模型,还依赖于良好的起始值。 特别是对于周期性曲线,高次谐波可以形成局部最小值。

这就是为什么拟合绝不是像数据一样的黑盒子 - >结果机制。 几乎总是需要用户干扰。 如果这不是有利的,并且您有这样的数据,而是使用傅里叶分析来获取目标信息。