数据平滑处理-均值中值Savitzky-Golay滤波器

数据平滑处理-均值中值Savitzky-Golay滤波
均值滤波器
监控杆基础均值滤波器是⼀种使⽤频次较⾼的线性滤波器。它的实现原理很简单,就是指定⼀个长度⼤⼩为奇数的窗⼝,使⽤窗⼝中所有数据的平均值来替换中间位置的值,然后平移该窗⼝,平移步长为 1,继续重复上述操作,直⾄滑动到时序数据的末尾,如此⼀来,对时序数据的过滤操作就结束了。均值滤波器的思路简单,计算速度快,但是它容易被窗⼝中的极值点或者峰值所左右,不能很好地保留序列的边缘信息,在去噪的同时也对数据信号的细节特征产⽣了⼀定的破坏,不能很好地去除噪声点,这极⼤地影响了模型的预测精度。
均值滤波的公式
其中,m表⽰窗⼝⼤⼩,x i表⽰窗⼝中的第 i个数据,x表⽰窗⼝中所有数据的均值。
python代码实现均值滤波
# 1. 均值滤波函数
def moving_average(data, window=5):
led光源模组size = window - 1
arr_value = list(data.values)
fill_left = arr_value[0]
for i in range(size):
arr_value.insert(0, fill_left)
dat = pd.Series(arr_value)
dat_roll = lling(window).mean()
return dat_roll.dropna().reset_index(drop=True)
具体应⽤到数据上:⾼频数据未完全拟合,其他数据也与源数据拟合程度⼀般
中值滤波器
中值滤波是⼀种⾮线性的滤波算法,它是将指定长度⼤⼩为奇数的窗⼝中的所有数据按从⼩到⼤的顺
序进⾏排列,并将排好序的数据的中值取代窗⼝中间的值。中值滤波克服了均值滤波所存在的问题,对窗⼝中的极端值不敏感,从⽽可以有效保留区域中的边缘信息,并且能有效抑制椒盐噪声和脉冲噪声,避免细节特征的丢失。但是,在⾯对均匀分布的⾼斯噪声时,它表现很差。
中值滤波的公式见式
具体的python实现代码如下:
# 2. 中值滤波函数
def median_filter(data: pd.Series, window=5):
return pd.Series(dfilt(data, window))
应⽤到数据上:中值滤波将⾼频拟合,其他数据也与源数据拟合程度⼀般
轻触开关电路SG滤波器
卷帘门控制箱对曲线进⾏平滑处理,通过Savitzky-Golay 滤波器,可以在scipy库⾥直接调⽤,不需要再定义函数。
python代码实现:
from scipy.signal import savgol_filter
# 3. Savitzky-Golay滤波函数
newans = savgol_filter(data, 5, 3, mode= 'nearest')
plt.plot(index,data,label='源⽹络流量',color='r',linestyle='-',marker='*')
plt.plot(index,newans,label='SG滤波⽹络流量',color='b')#添加linestyle设置线条类型
plt.legend()
plt.show()
# 备注:
data:代表曲线点坐标(x,y)中的y值数组
window_length:窗⼝长度,该值需为正奇整数。例如:此处取值5
k值:polyorder为对窗⼝内的数据点进⾏k阶多项式拟合,k的值需要⼩于window_length。例如:此处取值3
mode:确定了要应⽤滤波器的填充信号的扩展类型。(This determines the type of extension to use for the padded signal to which the filter is applied. )python原理⼿写代码实现:
无纺布手提袋设计# 3. Savitzky-Golay滤波函数
"""
data - list格式的1×n纬数据
window_size - 拟合的窗⼝⼤⼩
rank - 拟合多项式阶次
ndata - 修正后的值
"""金银花绿原酸
def savgol(data: list, window_size: int, rank: int):
m = int((window_size - 1) / 2)
odata = data[:]
# 处理边缘数据,⾸尾增加m个⾸尾项
for i in range(m):
odata.insert(0, odata[0])
odata.insert(len(odata), odata[len(odata)-1])
# 创建X矩阵
x = create_x(m, rank)
# 计算加权系数矩阵B
b = (x * (x.T * x).I) * x.T
a0 = b[m]
a0 = a0.T
# 计算平滑修正后的值
ndata = []
for i in range(len(data)):
y = [odata[i + j] for j in range(window_size)]
y1 = np.mat(y) * a0
y1 = float(y1)
ndata.append(y1)
return ndata
"""
创建系数矩阵X
size - 2×size+1 = window_size
rank - 拟合多项式阶次
x - 创建的系数矩阵
"""
def create_x(size, rank):
x = []
for i in range(2 * size + 1):
m = i - size
row = [m**j for j in range(rank)]
x.append(row)
x = np.mat(x)
return x
newans = savgol(list(data), 5, 3)
plt.plot(index,data,label='源⽹络流量',color='r',linestyle='-',marker='*')
plt.plot(index,newans,label='SG滤波⽹络流量',color='b')#添加linestyle设置线条类型
plt.legend()
plt.show()
应⽤到数据上效果:此图更加接近源曲线,并且将⾼频部分进⾏平滑处理,拟合低频部分

本文发布于:2024-09-22 03:57:06,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/4/117556.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:数据   滤波   均值   噪声   处理   拟合   类型   长度
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议