我有一个x和y数据集,其中x是自变量,y是因变量。
y = 2x
我为“ y”添加了一些噪音,并应用了时髦的Savitzky Golay滤波器。当我尝试获得y的一阶导数时,我得到的导数为零。
我了解这是因为过滤器仅将“ y”作为输入。我希望有一个同时考虑x和y的过滤器,并同时为我提供一个导数。
在这里,我用表示错误数据的图来展示我的实现。
import numpy as np
from scipy import signal
import matplotlib.pyplot as plt
# create some sample twoD data
x = np.linspace(-3,3,100)
y = 2*x
y = y + np.random.normal(0, 0.2, y.shape)
# filter it
Zn = signal.savgol_filter(y, window_length=29, polyorder=4, deriv=0)
Zf = signal.savgol_filter(y, window_length=29, polyorder=4, deriv=1)
# do some plotting
plt.plot(x,y, label = 'Input')
plt.plot(x,Zn, label= 'Savitzky-Golay filtered')
plt.plot(x,Zf, label= 'Savitzky-Golay filtered - 1st derivative')
plt.legend()
plt.show()
导数结果:
dy / dx = 2。
我需要Savitzky-Golay滤波器才能为我提供此结果。请为我提供一个考虑了两个变量的python实现。
答案 0 :(得分:2)
您的情况不是 dy / dx = 2 ,而是 dy / 1.0 = 0.06 ,因为您拥有x = np.linspace(-3,3,100)
。
您尚未将 dx 定义为delta
,并使用了默认值delta=1.0
。
因此,使用等于 dx 的delta
可以解决您的问题。
dx = x[0] - x[1]
Zf = signal.savgol_filter(y, window_length=29, polyorder=4, deriv=1, delta=dx)
答案 1 :(得分:1)
要在savgol_filter
中使用deriv
> 0,还必须给出x坐标的间距。解决方法很简单:在通话的delta=x[1] - x[0]
之后添加deriv=1
:
Zf = signal.savgol_filter(y, window_length=29, polyorder=4, deriv=1, delta=x[1] - x[0])