【问题标题】:Problems with sinusoidal curve fitting: amplitude and frequency come out too low正弦曲线拟合的问题:幅度和频率太低
【发布时间】:2021-12-15 06:11:21
【问题描述】:

我有一些时间序列数据,对应于图像中的黑线(它是滚动平均值)。我试图拟合正弦曲线但没有成功;浅蓝色,几乎是直线是当前结果。 (深蓝色的是多项式拟合,暂时忽略它)。

我尝试的是这个。我从here.得到了这个函数的想法

def objective(x, a, b, c, d):
    return a * np.sin(b - x) + c * x**2 + d

[..]

from scipy import optimize

X = X.ravel() # 1D array of ordinal dates
y = y.ravel() # 1D array of temperature values

# Curvefit with the objective function.
params, _ = optimize.curve_fit(objective, X, y)

# Plot the curvefit
plt.plot(X_extended, objective(
    X, params[0], params[1], params[2], params[3]))

即使我添加了频率非常低或幅度非常高的猜测,也几乎没有任何变化。

任何想法都值得赞赏。如有必要,我可以尝试在其他地方重现该问题。


应用答案中给出的 p0 值和函数,图表现在如下所示:

谢谢!

【问题讨论】:

    标签: python scipy curve-fitting


    【解决方案1】:

    没有要测试的数据,很难准确判断。但是,一个很好的猜测是您的起始参数已关闭,然后广义最小二乘拟合可能(很容易)失败。您甚至没有给curve_fit 提供一组初始参数,因此abcd 的初始起始值都将设置为1。

    仅处理正弦拟合,对于您的幅度a,您可能需要大约 7 的值,而对于偏移量 d,大约是 27。b 更难猜测,所以最初可以保留为 0(或 1)。

    但是,等式的二次部分会使事情变得一团糟:x 值很大,所以它会变化得非常快,或者更确切地说,c 应该非常接近于零(接近,如非常小, 顺序1/x^2, 所以说~ 1e-12, 以抵消大二次变化的影响. 任何这样小的数字也会有拟合问题: 预先规范化你的公式/参数 (为 1 阶) 是总是个好主意。

    事实上,我不明白为什么你的函数中有二次函数。也许是底层模型需要这样做,但该图本身根本没有显示二次行为的迹象。我会删除它。

    最后,虽然您有一个 x 偏移量 b,但您没有周期参数。结果,它将被固定在 2π,这绝对不是。这将是拟合数据的最大障碍,仅次于方程的二次部分。周期看起来大约是 300(或一年?),或大约 50 * 2π。

    所以,试试下面的函数:

    def objective(x, a, b, c, d):
        return a * np.sin(b - c*x/50) + d
    

    带有起始参数,非常粗略:

    p0 = [7, 0, 1, 27]
    

    看看你会得到什么。

    (如果您对公式中的 50 感到疑惑:在这些数量级上这并不是真正需要的,但它可以作为将 c 标准化为 1 级的示例。您可以对 @987654336 进行同样的处理@ 将其替换为 10*d,然后将其初始猜测设置为 3。或者,如果您这样做,您现在可以完全省略 p0,所有参数猜测为 1。)

    【讨论】:

    • 效果非常好,你的帖子对我很有洞察力!如果您有兴趣,请检查问题中的编辑以获取您的建议情节。我一字不差地使用了你的价值观,它们非常适合。
    • 确实如此。是年度行为吗?最重要的是每月的行为吗?几乎很想用较短的周期在其上放置另一个正弦。这确实需要良好的初始猜测,否则您最终只会对较大的曲线进行两次正弦拟合,每个都占一半。
    • 这是年度行为。我不相信有很多每月的行为可以找到,如果是的话,它与我的目标没有那么相关。我试图在未来找到一个违反某个正温度阈值的日期。我相信该功能现在没有显示趋势,对吗?这将是我需要的,因为我预计会逐渐变暖。 (编辑:我添加了一个线性组件。必须评估。再次感谢您的帮助!)
    • 如果您谈论的是(世界)气候温度行为,而不是室内或另一个星球上的事物,那么在短短一年内不会出现任何逐渐变暖的现象。气候科学家倾向于使用 30 年窗口内的滚动平均值来查看变化(使用年平均温度,因此忽略年变化),因此您应该查看这些时间尺度。
    • 哈,那完全不同。好吧,如果电池没有(太多)不受天气影响,那么我可以想象它也会遵循这种趋势。或者只是温度计吸收了太多的环境。
    猜你喜欢
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-23
    • 1970-01-01
    • 1970-01-01
    • 2015-01-11
    相关资源
    最近更新 更多