【问题标题】:Curve fit of scipy not working with sines?scipy 的曲线拟合不与正弦一起使用?
【发布时间】:2014-10-14 05:04:39
【问题描述】:

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

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

【问题讨论】:

  • 看来你做对了......它在一个玩具示例中对我有用,用data = 10 + 3*np.sin(t + 1.)播种输入数据

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


【解决方案1】:

这似乎是您最初猜测的问题,尤其是您选择的频率离得太远了。在您当前的初始猜测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 会更好地执行拟合(红色曲线):

【讨论】:

    【解决方案2】:

    一切正常,算法找到了一个局部最小值,正如它应该做的那样。 您对频率的初步猜测与现实相差甚远。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-05
      • 1970-01-01
      • 1970-01-01
      • 2018-06-02
      • 2021-02-16
      • 2017-04-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多