Savitzky-Golay 滤波器
通过 Savitzky-Golay 滤波器来平滑数据。
1. Savitzky-Golay 滤波器的工作原理
Savitzky-Golay 滤波器是一种数字滤波技术,用于平滑数据并减少噪声。它的主要优点是可以保留数据的形状和宽度特征,同时减少高频噪声。具体步骤如下:
1 ) 滑动窗口:在数据序列上滑动一个固定大小的窗口(由 window_length
定义)。
2 ) 多项式拟合:在每个窗口内,使用最小二乘法拟合一个多项式(由 polyorder
定义)。
3 ) 平滑值:用多项式在窗口中心点的值 替换原始数据点,从而达到平滑效果。
2. 示例
假设我们有一个包含噪声的数据序列,使用 Savitzky-Golay 滤波器可以有效减少噪声,同时保留数据的主要特征。
import numpy as np
import pandas as pd
from scipy.signal import savgol_filter
import matplotlib.pyplot as plt
# 生成带有噪声的数据
np.random.seed(0)
x = np.linspace(0, 10, 1000)
y = np.sin(x) + np.random.normal(0, 0.1, x.shape)
# 创建 DataFrame
data = pd.DataFrame({'reward': y})
# 检查数据结构
print(data.head())
# 数据清洗 - 使用Savitzky-Golay滤波器去除噪声
window_length = 51 # 滤波窗口大小,必须为奇数
polyorder = 3 # 多项式阶数
filtered_reward = savgol_filter(data['reward'], window_length, polyorder)
# 将清洗后的数据添加回 DataFrame
data['filtered_reward'] = filtered_reward
# 绘制原始数据和清洗后的数据对比图
plt.figure(figsize=(10, 6))
plt.plot(data.index, data['reward'], label='Original Reward', alpha=0.5)
plt.plot(data.index, data['filtered_reward'], label='Filtered Reward', color='r')
plt.legend()
plt.title('Reward Before and After Filtering')
plt.xlabel('Index')
plt.ylabel('Reward')
plt.show()
在这段代码中,我们生成了一个带有噪声的正弦波数据,然后使用 Savitzky-Golay 滤波器对其进行平滑处理,并绘制了原始数据和清洗后的数据对比图。
2.1 代码解释
window_length = 51 # 滤波窗口大小,必须为奇数
polyorder = 3 # 多项式阶数
filtered_reward = savgol_filter(data['reward'], window_length, polyorder)
1 ) window_length = 51
- 含义:
window_length
定义了滤波器的窗口大小,即每次滤波时要考虑的数据点的数量。 - 要求:窗口大小必须是奇数。这是因为滤波器需要一个中心点,奇数窗口大小可以确保有一个明确的中心点。
- 选择:窗口大小的选择取决于数据的特征。较大的窗口大小会使滤波效果更强,但可能会过度平滑数据,丢失一些细节;较小的窗口大小则相反。通常,窗口大小的选择需要根据数据的具体情况进行调整。
2 ) polyorder = 3
- 含义:
polyorder
定义了在窗口内使用的多项式的阶数。 - 选择:多项式阶数的选择也取决于数据的特征。较低的阶数(如1或2)适用于数据变化较为平缓的情况,而较高的阶数(如3或4)适用于数据变化较为剧烈的情况。
- 限制:
polyorder
必须小于window_length
。
3 ) filtered_reward = savgol_filter(data['reward'], window_length, polyorder)
- 函数:
savgol_filter
是scipy.signal
模块中的一个函数,用于应用 Savitzky-Golay 滤波器。 - 参数:
data['reward']
:要滤波的数据序列,这里是从 DataFrame 中提取的奖励值。window_length
:滤波窗口大小,前面定义为51。polyorder
:多项式阶数,前面定义为3。
- 返回值:
filtered_reward
是经过滤波处理后的数据序列。