在实际问题中,经常会遇上噪声过多的问题,尤其是在时间序列图 Time Series 中,这样处于混沌状态的数据非常不利于分析结论,例如:

其实在chaotic dynamic理论中,通常会采用这样的噪声曲线来作为一个可视化指标来反映系统是否进入chaotic state。但在实际上,给出这样的图片是不被同行认可的
在如何降噪的同时,保证曲线能尽可能的反映数据的变化规律是本节讨论的主要问题
Savitzky-Golay Filter是常用的数字滤波器,广泛用于平滑数据,不改变信号趋势的情况下,提升精度
Savitzky-Golay滤波器的本质是利用卷积方法实现,即通过线性最小二乘法将相邻数据点的连续子集与一个低次多项式拟合。
该方法最大的优势在于,同一段曲线上,可以取任意一段数据进行处理尤其是处理时序数据时,对于不同阶段的序列处理优势明显。
利用scipy库可以直接调用该方法
# scipy.signal.savgol_filter(y, window_length, order, mode)
y_new = scipy.signal.savgol_filter(y, 11, 3)
插值法降噪,常用的插值算法包括牛顿插值,拉格朗日插值等,具体原理参见数值分析
在numpy中,可以直接采用函数polyfit(x,y,order)
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 数据集读取
Data = pd.DataFrame(pd.read_csv("***.csv"))
x, y = Data["x"], Data["y"]
# 多项式插值
##### Core #######
param = np.polyfit(x, y, 5) # 5次多项式插值,返回5次多项式的参数
fun = np.poly1d(param)
##################
x_new = np.arrange(210, 450)
y_new = fun(x_new)
# 绘图(简写)
fig = plt.figure(dpi=200)
plt.plot(x,y)
plt.plot(x_new, y_new)
plt.show()
多项式拟合效果:

值得注意的是,一旦数据点增加,拟合效果会越来越差: