SavitzkyGolay

2021/10/30

# gma.math.Smooth.SavitzkyGolay(Data, WindowSize = 5, Times = 1, EdgeMode = 'interp', Polyorder = 2, Delta = 1, Axis = 0)


功能:【Savitzky-Golay】。利用 SavitzkyGolay 方法对数据进行平滑。

参数:

 Data: array。需要平滑的数据。

可选参数:

 WindowSize:int。平滑窗口大小,必须为正奇数。默认为 5。

 Times = int。平滑次数。默认平滑 1 次。

 EdgeMode = str。边缘数据处理方法。默认为 插补(interp)。

 Polyorder = int。平滑多项式阶数。默认为 2 。

 Delta = float。将应用过滤器的样本间距。默认为 1。

 Axis = int 。数据平滑使用的轴。

返回:array


示例:

from gma import math
1

序列(1 维)

Data = [0.16359164, 0.16359164, 0.17469311, 0.20163227, 0.22857143, 0.32706435, 0.21466192, 0.10225949]
SM = math.Smooth.SavitzkyGolay(Data, 5, Times = 1)
1
2

>>> array([0.16277541, 0.16463628, 0.17645659, 0.19414157, 0.25891453, 0.28477768, 0.22854228, 0.10236709])

不同参数结果对比

import matplotlib.pyplot as plt
# 配置参数
PAR = {'font.sans-serif': 'Times New Roman',
       'axes.unicode_minus': False
      }
plt.rcParams.update(PAR)
1
2
3
4
5
6
  • 不同边缘值处理方法
Mode = ['mirror', 'nearest', 'wrap', 'interp']
for m in Mode:
    RSD = math.Smooth.SavitzkyGolay(Data, ws, Times = 1, EdgeMode = m)
    plt.plot(RSD, label = m)
plt.grid(True, linestyle = (0,(6,6)), linewidth = 0.4)
plt.legend(frameon = False)
plt.show()
1
2
3
4
5
6
7

  • 不同平滑窗口
for ws in [3, 5, 7]:
    RSD = math.Smooth.SavitzkyGolay(Data, ws, Times = 1)
    plt.plot(RSD, label = ws)
plt.grid(True, linestyle = (0,(6,6)), linewidth = 0.4)
plt.legend(frameon = False)
plt.show()
1
2
3
4
5
6

  • 不同平滑次数
for ts in range(1, 5):
    RSD = gmath.Smooth.SavitzkyGolay(Data, 5, Times = ts)
    plt.plot(RSD, label = ts)
plt.grid(True, linestyle = (0,(6,6)), linewidth = 0.4)
plt.legend(frameon = False)
plt.show()
1
2
3
4
5
6

  • 不同阶数
for i in range(2,5):
    RSD = math.Smooth.SavitzkyGolay(Data, 5, Times = 1, Polyorder = i)
    plt.plot(RSD, label = i)
plt.grid(True, linestyle = (0,(6,6)), linewidth = 0.4)
plt.legend(frameon = False)
plt.show()
1
2
3
4
5
6

更多维度

Data = [[0.2775632 , 0.12230133, 0.14181635, 0.14573776, 0.26294236, 0.17534054, 0.19697314, 0.17100441],
       [0.29653988, 0.21660644, 0.27685702, 0.19734388, 0.23047971, 0.15317513, 0.14318715, 0.29095752],
       [0.10306014, 0.26547633, 0.20539848, 0.11788385, 0.20935271, 0.20853551, 0.10117026, 0.23454895],
       [0.10212869, 0.23732622, 0.29779698, 0.25204982, 0.20186597, 0.12563619, 0.12132635, 0.10949196],
       [0.24845008, 0.19504921, 0.26203447, 0.18605777, 0.15011013, 0.12348816, 0.25702251, 0.27907304],
       [0.17735726, 0.22358509, 0.30997451, 0.14726574, 0.30705883, 0.14398374, 0.12332358, 0.12161637],
       [0.10022824, 0.30212566, 0.31906632, 0.17805659, 0.28539664, 0.23701129, 0.16718833, 0.1362587 ],
       [0.12202122, 0.11896312, 0.14325725, 0.19785076, 0.22644087, 0.21387368, 0.22018365, 0.15477022]]
# 按照第一个轴平滑
A0 = math.Smooth.SavitzkyGolay(Data, 5, Times = 1, Axis = 0)

# 按照第二个轴平滑
A1 = math.Smooth.SavitzkyGolay(Data, 5, Times = 1, Axis = 1)

plt.figure(figsize = (12, 12), dpi = 300)
Axes1 = plt.subplot(1, 2, 1)
Axes1.imshow(A0)
Axes1.set_axis_off()
Axes1.set_title('Axis = 0')

Axes2 = plt.subplot(1, 2, 2)
Axes2.imshow(A1)
Axes2.set_axis_off()
Axes2.set_title('Axis = 1')
plt.show()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25