我真的不明白numpy.gradient
函数是做什么的,以及如何使用它来计算多变量函数梯度。
例如,我有这样一个函数:
def func(q, chi, delta):
return q * chi * delta
我需要计算它的三维梯度(换句话说,我想计算相对于所有变量(q、chi、delta)的偏导数)。
如何使用NumPy计算此梯度?
问题在于,numpy不能直接提供导数,您有两个选择:
使用NUMPY
您需要在三维空间中定义网格,并在此网格上评估函数。之后,将这个函数值的表格提供给numpy.gradient
,以获取每个维度(变量)的数值导数数组。
以下是示例:
from numpy import *
x,y,z = mgrid[-100:101:25., -100:101:25., -100:101:25.]
V = 2*x**2 + 3*y**2 - 4*z # just a random function for the potential
Ex,Ey,Ez = gradient(V)
没有使用NUMPY
您也可以使用中心差商来自行计算导数。
本质上,这就是numpy.gradient
为预定义网格中的每个点所做的事情。
theano
可以自动计算梯度。
http://deeplearning.net/software/theano/tutorial/gradients.html
scipy.optimize.approx_fprime
来实现。f = lambda x: x**2
approx_fprime(np.array([2]), f, epsilon=1e-6) # array([ 4.000001])
numpy.diff
所做的事情;numpy.gradient
类似,但在边界处有特殊行为。 - Marknumpy.gradient
更像是这个公式(使用 $+\Delta x$ 和 $-\Delta x$ 的中心差分商)而不是numpy.diff
。 - user66081gradient
确实在网格点处使用中心差分,这是类似的,但对边界的处理不同。可以说diff
在网格点之间的中心差分(具有半个网格间距的delta)中获得,不会特别处理边界,而只是使梯度网格小1个点。它们都遵循表达式,但评估点和delta不同,并且具有不同的边界行为。由于答案没有提及如何处理其中任何一个,我猜想哪个更相似是主观的... - Mark