让我们假设我们有一个数据集,它可以近似地由
import numpy as np
x = np.linspace(0,2*np.pi,100)
y = np.sin(x) + np.random.random(100) * 0.2
因此,我们有 20% 的数据集变化。我的第一个想法是使用 scipy 的 UnivariateSpline 函数,但问题是这没有很好地考虑小噪声。如果考虑频率,背景比信号小得多,因此仅截止样条可能是一个想法,但这将涉及来回傅里叶变换,这可能会导致不良行为。另一种方法是移动平均线,但这也需要正确选择延迟。
任何提示/书籍或链接如何解决这个问题?
原文由 varantir 发布,翻译遵循 CC BY-SA 4.0 许可协议
我更喜欢 Savitzky-Golay 过滤器。它使用最小二乘法将数据的一个小窗口回归到多项式上,然后使用多项式来估计窗口中心的点。最后,窗口向前移动一个数据点并重复该过程。这一直持续到每个点都相对于其邻居进行了最佳调整。即使是来自非周期性和非线性源的嘈杂样本,它也能很好地工作。
这是一个 详尽的食谱示例。请参阅下面的代码,了解它的易用性。注意:我省略了用于定义
savitzky_golay()
函数的代码,因为您可以从我上面链接的食谱示例中直接复制/粘贴它。更新: 我注意到我链接到的食谱示例已被删除。幸运的是,Savitzky-Golay 过滤器已合并 到 SciPy 库 中,正如 @dodohjk 所指出的(感谢 @bicarlsen 提供更新的链接)。要使用 SciPy 源修改上述代码,请键入: