在R与Python中使用SavitzkyGolay过滤器

2024-05-16 05:43:31 发布

您现在位置: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]])

根据我的理解,这会使矩阵平滑,并为发展导数项做准备。但是,当在{}(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产生相同的结果吗

提前谢谢


Tags: 代码importnumpy过滤器npsincosfilter
2条回答

在信号包中使用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

SciPy函数^{}有几个用于处理输入数组末端的选项;请参阅docstring中的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])

相关问题 更多 >