微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 R 和 Python 中使用 Savitzky-Golay 过滤器

如何解决在 R 和 Python 中使用 Savitzky-Golay 过滤器

我目前正在尝试在 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]])

根据我的理解,这可以平滑矩阵并使其准备好开发导数项。但是,当在 pracma(Savitzky-Golay 函数的最新更新版本)中使用 R 时,我得到:

library(pracma)
t = seq(0,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

有谁知道为什么这些数字如此不同以及我如何从 Python 中的 R 产生相同的结果?

提前致谢。

解决方法

SciPy 函数 savgol_filter 有几个选项来处理输入数组的结尾;请参阅文档字符串中的 mode 参数。

看起来 R 函数 savgol 的行为对应于 SciPy 的 mode='constant' 中的 savgol_filter。除了第一个值(在两种情况下实际上都是 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。