我想使用数组及其一阶导数(diff)作为训练特征。由于 diff 数组的尺寸较小,我想将其填满,这样当我堆叠它们并将两者用作功能时,就不会出现尺寸问题。
如果我用 0 填充 diff(array),我应该如何对齐它们?我应该将 0 放在生成的 diff(array) 的开头还是末尾?将数组与其导数对齐的正确方法是什么?例如在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?
最佳答案
您可以使用中心有限差分(相当于取左侧和右侧差异的平均值)来代替左侧或右侧有限差分,然后用适当的近似值填充两端那里的衍生品。这将使导数的估计与其数据值保持一致,并且通常会给出更好的导数估计。
例如,
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
),但是简单的有限差分可能可以很好地作为您的训练输入。
关于python - 将数组与其差异对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33984889/