python - 如何摆脱数据中的移动平均线?
问题描述
我有数据 y = [-10.5, -2.0, 5.0, -3.0, 4.0, 9.5, 18.0, 14.5, 11.0, 13.5, 25.0, 21.5, 7.5, 5.5, 3.5, 10.5, 7.0, 3.5, 1.5, 16.0, 20.0、22.5、20.5、33.5、27.0、38.5、29.0、27.0、28.0、24.5、24.0、29.5、39.5]
我想摆脱垂直移动平均趋势(只获得围绕恒定平均值的差异)。在这种情况下,我应该得到类似: [-7, -2, 2, -4, 0, 3, 8, 5, 2, 3, 10, 7, -3, -5, -7, -3, - 6、-9、-11、-2、0、1、-1、7、2、9、2、0、0、-3、-4、-1、5]
我的想法是在Input上拟合一条线(线性回归),得到类似 ax + b 的东西,然后只删除 ax 以接近所需的Output。有没有更标准的数学方法来解决我的问题?(最好在 Python 中实现)。
另外,我认为Output和 mean( Output )的不同值之间的一些差异可能会被错误地视为直线斜率的一部分,因此,线性回归可能会给我一个 a'x + b',其中 a' close但不同于a。我怎样才能缓解这个问题?
解决方案
考虑到疯狂的 FFT 优化,我认为 1D 卷积将很快完成您想要的操作:
import numpy as np
from scipy.signal import convolve
window_size = 10
y = np.array([-10.5, -2.0, 5.0, -3.0, 4.0, 9.5, 18.0, 14.5, 11.0, 13.5, 25.0, 21.5, 7.5, 5.5, 3.5, 10.5, 7.0, 3.5, 1.5, 16.0, 20.0, 22.5, 20.5, 33.5, 27.0, 38.5, 29.0, 27.0, 28.0, 24.5, 24.0, 29.5, 39.5])
# Pad with zeros for entries before/after the window size
y_rolling_mean = convolve(y, np.ones(window_size)/window_size, 'same')
y_without_mean = y - y_rolling_mean
请记住,这通常会为第一个和最后一个 window_size//2 条目产生不准确的值,因为它们的滚动平均值是使用零填充计算的,但是您可以通过在卷积之前使用所需的值填充来更改此行为。
卷积如何找到滚动平均值?
从本质上讲,一维卷积可以被认为是两个数组的点积,一个数组“滑动”另一个数组(实际上,相关性在技术上对于这种情况是正确的,但我现在不会深入探讨)。为了更好地了解,请考虑以下场景:
y = 1 2 3 4 5 6
x = 1 1 1
c = <convolution of y and x>
卷积数组的每个输出索引都是 'x' 与 y 的相同长度窗口的点积。所以
c[0] = sum(y[0:3]*x)
c[1] = sum(y[1:4]*x)
c[2] = sum(y[2:5]*x)
...
现在,考虑这样一个事实,即 N 个数字的平均值只是 sum(numbers)/N。或者:
mean = sum(1/N * number)
结合我们上面关于卷积的知识,让 x = 1/len(x) 的每个元素:
y = 1 2 3 4 5 6
x = 1/3 1/3 1/3
c[0] = 1/3*y[0] + 1/3*y[1] + 1/3*y[2] = mean(y[0:3])
c[1] = 1/3*y[1] + 1/3*y[2] + 1/3*y[3] = mean(y[1:4]
...
整洁的!使用特殊形成的 x 向量进行卷积的副作用是该范围的平均值!因此,通过选择 x ,np.ones(window_size)/window_size
您可以保证卷积将产生滚动平均值y
。
当图像中有很多不需要的高频噪声时,这在图像处理中被大量使用:
请注意,与您的一维数据类似,嘈杂图像中的尖锐“峰值”和斑点被“四舍五入”。
为什么窗口大小为 10?
老实说,我随机选择了窗口大小。在实践中,这在很大程度上取决于您期望数据有多嘈杂,以及您希望输出看起来有多“平滑”。窗口尺寸越大,输出看起来就越平坦。根据所提供的玩具编号,似乎有 10 个足够平坦的尖峰的窗口y
不会破坏信号。
推荐阅读
- r - 根据日期范围合并两个数据集。R
- css - 使用 Material UI 库时,我无法更改模板的图像 - 如何更改随机飞溅以设置图像?
- arrays - 修改已存储在数组中的多个 csv 文件
- ios - 当我使用它的值创建对象 Xcode 时,日期变量设置为零
- java - React Native HeadlessJS 地理位置不起作用
- pytorch - 如何在 Pytorch 中选择数据集的子集?
- javascript - 辅助函数在 Javascript 中不起作用
- mysql - 我想结合两个nodejs程序以获得一个结果:按类型过滤的特定CSV数据 - 如何正确组合代码?
- node.js - 如何在 tron 网络上监听 trx 事件?(Tronweb)nodejs
- google-apps-script - 如何将特定工作表的 URL 插入到 Google 表格中的单元格中