如何使用 numpy 梯度正确计算曲线的梯度?
How to correctly compute the gradient of a curve using numpy gradient?
我有一条由 1200 个值组成的曲线,我只想计算它的导数,所以我使用了 numpy 梯度函数。
这是我使用的代码:
data = np.genfromtxt('test_data.csv', delimiter=',')
support = np.array(np.arange(1200))
plt.plot(support, data)
plt.show()
plt.plot(support, np.gradient(data, support))
plt.show()
这是曲线图:
这里是梯度图:
为什么梯度曲线的开始处有正值?我的曲线在 [0; 600],为什么噪音这么大?
如果你想查看,我将数据保存在 CSV 文件中:
非常感谢!
如果在曲线的开头放大,您可以看到它并没有严格下降。
您的数据含噪,含噪函数的梯度总是显得比较嘈杂。
您可以应用简单的移动平均线来平滑数据:
w = 25
smooth = np.convolve(data, np.ones(w), 'valid') / w
smooth_support = support[w//2:-w//2+1]
plt.plot(smooth_support, smooth)
plt.show()
plt.plot(smooth_support, np.gradient(smooth, smooth_support))
plt.show()
当然,您可以使用 scipy.signal.
中的更好方法,而不是使用扁平卷积核(如 np.ones()
)
我有一条由 1200 个值组成的曲线,我只想计算它的导数,所以我使用了 numpy 梯度函数。
这是我使用的代码:
data = np.genfromtxt('test_data.csv', delimiter=',')
support = np.array(np.arange(1200))
plt.plot(support, data)
plt.show()
plt.plot(support, np.gradient(data, support))
plt.show()
这是曲线图:
这里是梯度图:
为什么梯度曲线的开始处有正值?我的曲线在 [0; 600],为什么噪音这么大?
如果你想查看,我将数据保存在 CSV 文件中:
非常感谢!
如果在曲线的开头放大,您可以看到它并没有严格下降。
您的数据含噪,含噪函数的梯度总是显得比较嘈杂。
您可以应用简单的移动平均线来平滑数据:
w = 25
smooth = np.convolve(data, np.ones(w), 'valid') / w
smooth_support = support[w//2:-w//2+1]
plt.plot(smooth_support, smooth)
plt.show()
plt.plot(smooth_support, np.gradient(smooth, smooth_support))
plt.show()
当然,您可以使用 scipy.signal.
中的更好方法,而不是使用扁平卷积核(如np.ones()
)