Savitzky-Golay 滤波器和对称指数移动平均(sEMA)是两种不同的平滑方法。它们各有优缺点,适用于不同的应用场景。
Savitzky-Golay 滤波器
Savitzky-Golay 滤波器是一种通过多项式拟合进行平滑的方法。它可以在保持信号整体趋势和结构的情况下减少噪声,适用于需要保留信号峰值和细节的场景。
代码实现
import numpy as np
from scipy.signal import savgol_filter
def savitzky_golay_filter(data, window_length=5, polyorder=2):
"""
使用 Savitzky-Golay 滤波器平滑数据
:param data: 输入的一维数据数组
:param window_length: 滤波器窗口长度,必须为奇数
:param polyorder: 拟合多项式的阶数
:return: 平滑后的数据
"""
return savgol_filter(data, window_length, polyorder)
对称指数移动平均(sEMA)
对称指数移动平均(sEMA)是一种平滑时间序列数据的简单方法,通过对当前数据点和之前的平滑结果进行加权平均来消除噪声。
代码实现
import numpy as np
def sEMA(data, alpha=0.1):
"""
对称指数移动平均(sEMA)滤波器
:param data: 输入的一维数据数组
:param alpha: 平滑因子,范围在0到1之间
:return: 平滑后的数据
"""
sEMA_data = np.zeros_like(data)
sEMA_data[0] = data[0]
for t in range(1, len(data)):
sEMA_data[t] = alpha * data[t] + (1 - alpha) * sEMA_data[t - 1]
return sEMA_data
示例
下面是一个简单的示例,展示如何使用这两个函数对相同的数据进行平滑处理:
import numpy as np
import matplotlib.pyplot as plt
# 生成示例数据
np.random.seed(0)
t = np.linspace(0, 2 * np.pi, 100)
data = np.sin(t) + np.random.normal(0, 0.1, t.shape)
# 使用 Savitzky-Golay 滤波器
smooth_data_sg = savitzky_golay_filter(data, window_length=11, polyorder=2)
# 使用 sEMA 滤波器
smooth_data_sema = sEMA(data, alpha=0.1)
# 绘制原始数据和平滑后的数据
plt.figure(figsize=(10, 6))
plt.plot(t, data, label='Original Data', alpha=0.5)
plt.plot(t, smooth_data_sg, label='Savitzky-Golay Filtered Data')
plt.plot(t, smooth_data_sema, label='sEMA Filtered Data')
plt.legend()
plt.show()
区别
-
Savitzky-Golay 滤波器:
- 优点: 能够在平滑数据的同时保留信号的峰值和细节。
- 缺点: 参数选择(窗口长度和多项式阶数)需要根据数据特点调整,计算复杂度相对较高。
-
sEMA 滤波器:
- 优点: 简单易实现,计算效率高。
- 缺点: 平滑效果相对较弱,可能无法很好地保留信号的细节。
这两种方法各有优缺点,具体选择哪一种方法需要根据数据的特点和实际应用场景来决定。