我想使用数组及其一阶导数(diff)作为训练功能。由于diff阵列的尺寸较小,我想填充它,以便在堆叠它们并将它们用作特征时我没有尺寸问题。
如果我用0填充diff(数组),我应该如何对齐它们?我是将0放在生成的diff(数组)的开头还是结尾处?将数组与其导数对齐的正确方法是什么?例如在python:
a = [1,32,43,54]
b = np.diff(np.array(a))
np.insert(b, -1, 0) # at the end?
np.insert(b, 0, 0) # or at the beginning?
答案 0 :(得分:1)
代替左侧或右侧的有限差分,您可以使用居中的有限差分(相当于取左侧和右侧差异的平均值),然后使用适当的近似值填充两端。衍生物那里。这将使导数的估计与其数据值保持一致,并且通常可以更好地估计导数。
例如,
In [33]: y = np.array([1, 2, 3.5, 3.5, 4, 3, 2.5, 1.25])
In [34]: dy = np.empty(len(y))
In [35]: dy[1:-1] = 0.5*(y[2:] - y[:-2])
In [36]: dy[0] = y[1] - y[0]
In [37]: dy[-1] = y[-1] - y[-2]
In [38]: dy
Out[38]: array([ 1. , 1.25 , 0.75 , 0.25 , -0.25 , -0.75 , -0.875, -1.25 ])
以下脚本使用matplotlib创建衍生物估计的可视化:
import numpy as np
import matplotlib.pyplot as plt
y = np.array([1, 2, 3.5, 3.5, 4, 3, 2.5, 1.25])
dy = np.empty(len(y))
dy[1:-1] = 0.5*(y[2:] - y[:-2])
dy[0] = y[1] - y[0]
dy[-1] = y[-1] - y[-2]
plt.plot(y, 'b-o')
for k, (y0, dy0) in enumerate(zip(y, dy)):
t = 0.25
plt.plot([k-t, k+t], [y0 - t*dy0, y0 + t*dy0], 'c', alpha=0.4, linewidth=4)
plt.grid()
plt.show()
有更复杂的工具来估算衍生工具(例如scipy.signal.savgol_filter
有一个估算衍生工具的选项,如果你的数据是周期性的,你可以使用scipy.fftpack.diff
),但是一个简单的有限差分可能有效很好的培训输入。
答案 1 :(得分:1)
根据documentation,差异只是做out[n] = a[n+1] - a[n]
。这意味着它不是由有限差分近似的导数,而是离散差。要计算有限差分,您需要除以步长,
当然,除非您的步长为1。例如:
import numpy as np
x = np.linspace(0,2*np.pi,30)
y = np.sin(x)
dy = np.diff(y) / np.diff(x)
此处,y
是x
在特定点的函数,dy
是它的派生。该公式的导数是中心导数,意味着它的位置在x
中的点之间。如果您需要相同点的导数,我建议您使用两个相邻点来计算导数:
(y[:-2]-y[2:])/(x[:-2]-x[2:])
这样,您可以在导数向量的两边添加0
,或相应地修剪输入向量。