我真的无法理解numpy.gradient
函数的作用以及如何使用它来计算多变量函数梯度。
例如,我有这样一个功能:
def func(q, chi, delta):
return q * chi * delta
我需要计算它的 3 维梯度(换句话说,我想计算关于所有变量(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 不直接支持梯度计算而不创建整个点网格。相反,我会使用自动分化 参见https://code.activestate.com/recipes/580610-auto-differentiation/了解如何在 Python 中进行。