在 R 中使用 Savitzky-Golay 过滤器 vs Python
Utilising Savitzky-Golay Filter in R vs Python
我目前正在尝试在 R
中呈现与在 Python
中相同的结果,但我想我一定是误解了 Savitzky-Golay 过滤器。我有以下 Python
代码:
import numpy as np
from scipy.signal import savgol_filter
t = np.linspace(0,1,10)
X = np.vstack((np.sin(t),np.cos(t))).T
sfd = savgol_filter(X, window_length=5, polyorder=3, axis=0)
sfd
array([[-4.78900581e-07, 9.99997881e-01],
[ 1.10884544e-01, 9.93841986e-01],
[ 2.20394870e-01, 9.75397369e-01],
[ 3.27190431e-01, 9.44944627e-01],
[ 4.29950758e-01, 9.02837899e-01],
[ 5.27408510e-01, 8.49596486e-01],
[ 6.18361741e-01, 7.85877015e-01],
[ 7.01688728e-01, 7.12465336e-01],
[ 7.76378020e-01, 6.30281243e-01],
[ 8.41469460e-01, 5.40300758e-01]])
根据我的理解,这会使矩阵平滑并为开发导数项做好准备。但是,当在 R
(Savitzky-Golay 函数的最新更新版本)中使用 pracma
时,我得到:
library(pracma)
t = seq(0, 1,length = 10)
X = t(rbind(sin(t), cos(t)))
savgol(X[, 1], fl = 5)
[1] 1.229175e-16 1.108826e-01 2.203977e-01 3.271947e-01 4.299564e-01 5.274154e-01 6.183698e-01 7.016979e-01 7.763719e-01 8.414710e-01
有谁知道为什么这些数字如此不同以及我如何从 R
中的 Python
得到相同的结果?
提前致谢。
SciPy 函数 savgol_filter
有几个处理输入数组末端的选项;请参阅文档字符串中的 mode
参数。
看起来 R 函数 savgol
的行为对应于 SciPy 的 savgol_filter
中的 mode='constant'
。除了第一个值(在两种情况下实际上都是 0),savgol_filter
的输出与 R:
中 savgol
的输出相匹配
In [82]: sfd = savgol_filter(X, window_length=5, polyorder=4, axis=0, mode='constant')
In [83]: sfd[:, 0]
Out[83]:
array([1.95316193e-17, 1.10882629e-01, 2.20397743e-01, 3.27194697e-01,
4.29956364e-01, 5.27415386e-01, 6.18369803e-01, 7.01697876e-01,
7.76371921e-01, 8.41470985e-01])
使用信号包中的sgolayfilt函数:
library(signal)
packageVersion("signal")
## [1] ‘0.7.7’
apply(X, 2, sgolayfilt, n = 5)
## [,1] [,2]
## [1,] -4.789006e-07 0.9999979
## [2,] 1.108845e-01 0.9938420
## [3,] 2.203949e-01 0.9753974
## [4,] 3.271904e-01 0.9449446
## [5,] 4.299508e-01 0.9028379
## [6,] 5.274085e-01 0.8495965
## [7,] 6.183617e-01 0.7858770
## [8,] 7.016887e-01 0.7124653
## [9,] 7.763780e-01 0.6302812
## [10,] 8.414695e-01 0.5403008
我目前正在尝试在 R
中呈现与在 Python
中相同的结果,但我想我一定是误解了 Savitzky-Golay 过滤器。我有以下 Python
代码:
import numpy as np
from scipy.signal import savgol_filter
t = np.linspace(0,1,10)
X = np.vstack((np.sin(t),np.cos(t))).T
sfd = savgol_filter(X, window_length=5, polyorder=3, axis=0)
sfd
array([[-4.78900581e-07, 9.99997881e-01],
[ 1.10884544e-01, 9.93841986e-01],
[ 2.20394870e-01, 9.75397369e-01],
[ 3.27190431e-01, 9.44944627e-01],
[ 4.29950758e-01, 9.02837899e-01],
[ 5.27408510e-01, 8.49596486e-01],
[ 6.18361741e-01, 7.85877015e-01],
[ 7.01688728e-01, 7.12465336e-01],
[ 7.76378020e-01, 6.30281243e-01],
[ 8.41469460e-01, 5.40300758e-01]])
根据我的理解,这会使矩阵平滑并为开发导数项做好准备。但是,当在 R
(Savitzky-Golay 函数的最新更新版本)中使用 pracma
时,我得到:
library(pracma)
t = seq(0, 1,length = 10)
X = t(rbind(sin(t), cos(t)))
savgol(X[, 1], fl = 5)
[1] 1.229175e-16 1.108826e-01 2.203977e-01 3.271947e-01 4.299564e-01 5.274154e-01 6.183698e-01 7.016979e-01 7.763719e-01 8.414710e-01
有谁知道为什么这些数字如此不同以及我如何从 R
中的 Python
得到相同的结果?
提前致谢。
SciPy 函数 savgol_filter
有几个处理输入数组末端的选项;请参阅文档字符串中的 mode
参数。
看起来 R 函数 savgol
的行为对应于 SciPy 的 savgol_filter
中的 mode='constant'
。除了第一个值(在两种情况下实际上都是 0),savgol_filter
的输出与 R:
savgol
的输出相匹配
In [82]: sfd = savgol_filter(X, window_length=5, polyorder=4, axis=0, mode='constant')
In [83]: sfd[:, 0]
Out[83]:
array([1.95316193e-17, 1.10882629e-01, 2.20397743e-01, 3.27194697e-01,
4.29956364e-01, 5.27415386e-01, 6.18369803e-01, 7.01697876e-01,
7.76371921e-01, 8.41470985e-01])
使用信号包中的sgolayfilt函数:
library(signal)
packageVersion("signal")
## [1] ‘0.7.7’
apply(X, 2, sgolayfilt, n = 5)
## [,1] [,2]
## [1,] -4.789006e-07 0.9999979
## [2,] 1.108845e-01 0.9938420
## [3,] 2.203949e-01 0.9753974
## [4,] 3.271904e-01 0.9449446
## [5,] 4.299508e-01 0.9028379
## [6,] 5.274085e-01 0.8495965
## [7,] 6.183617e-01 0.7858770
## [8,] 7.016887e-01 0.7124653
## [9,] 7.763780e-01 0.6302812
## [10,] 8.414695e-01 0.5403008