【特征处理】数据平滑处理

1、均值滤波器

均值滤波器是一种使用频次较高的线性滤波器。它的实现原理很简单,就是指定一个长度大小为奇数的窗口,使用窗口中所有数据的平均值来替换中间位置的值,然后平移该窗口,平移步长为 1,继续重复上述操作,直至滑动到时序数据的末尾,如此一来,对时序数据的过滤操作就结束了。均值滤波器的思路简单,计算速度快,但是它容易被窗口中的极值点或者峰值所左右,不能很好地保留序列的边缘信息,在去噪的同时也对数据信号的细节特征产生了一定的破坏,不能很好地去除噪声点,这极大地影响了模型的预测精度。

 

其中,m表示窗口大小,xi表示窗口中的第 i个数据,x表示窗口中所有数据的均值。

python代码实现均值滤波

# 1. 均值滤波函数
def moving_average(data, window=5):
    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 = dat.rolling(window).mean()
    return dat_roll.dropna().reset_index(drop=True)

具体应用到数据上:高频数据未完全拟合,其他数据也与源数据拟合程度一般

中值滤波器

中值滤波是一种非线性的滤波算法,它是将指定长度大小为奇数的窗口中的所有数据按从小到大的顺序进行排列,并将排好序的数据的中值取代窗口中间的值。中值滤波克服了均值滤波所存在的问题,对窗口中的极端值不敏感,从而可以有效保留区域中的边缘信息,并且能有效抑制椒盐噪声和脉冲噪声,避免细节特征的丢失。但是,在面对均匀分布的高斯噪声时,它表现很差。

 具体的python实现代码如下:

# 2. 中值滤波函数
def median_filter(data: pd.Series, window=5):
    return pd.Series(scipy.signal.medfilt(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:窗口长度,该值需为正奇整数。例如:此处取值5k值:polyorder为对窗口内的数据点进行k阶多项式拟合,k的值需要小于window_length。例如:此处取值3mode:确定了要应用滤波器的填充信号的扩展类型。(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()

应用到数据上效果:此图更加接近源曲线,并且将高频部分进行平滑处理,拟合低频部分

 

 

数据平滑处理是指对原始数据进行平滑处理,以降低随机波动和噪声的影响,使数据变得更加平稳。在Python中,有很多方式可以进行数据平滑处理,以下是其中一些方法: 1. 移动平均法(Moving Average):将一段时间内的数据取平均值,作为平滑后的数据。可以使用pandas库中的rolling函数实现。 ```python import pandas as pd # 创建一个Series对象 data = pd.Series([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) # 对数据进行移动平均处理 smooth_data = data.rolling(window=3).mean() print(smooth_data) ``` 2. 指数平滑法(Exponential Smoothing):对于每个数据点,都会根据前面的平均值加上一个权重,最终得到平滑后的数据。可以使用statsmodels库中的ExponentialSmoothing函数实现。 ```python from statsmodels.tsa.api import ExponentialSmoothing import pandas as pd # 创建一个Series对象 data = pd.Series([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) # 对数据进行指数平滑处理 smooth_data = ExponentialSmoothing(data, trend='add').fit().fittedvalues print(smooth_data) ``` 3. Savitzky-Golay滤波器:对信号进行平滑处理,是一种常用的滤波器。可以使用scipy库中的savgol_filter函数实现。 ```python from scipy.signal import savgol_filter import numpy as np # 创建一个numpy数组 data = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) # 对数据进行Savitzky-Golay滤波处理 smooth_data = savgol_filter(data, window_length=5, polyorder=2) print(smooth_data) ``` 这些方法都可以实现数据平滑处理,根据实际情况选择最适合的方法即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值