我真的无法理解numpy.gradient
函数的作用以及如何使用它来计算多变量函数梯度。
例如,我有这样一个功能:
def func(q, chi, delta):
return q * chi * delta
我需要计算它的三维梯度(换句话说,我想计算所有变量(q,chi,delta)的偏导数。)
如何使用NumPy计算此渐变?
答案 0 :(得分:19)
问题是,numpy不能直接给你衍生物,你有两个选择:
使用NUMPY
您基本上要做的是在三维中定义网格并评估此网格上的功能。然后,将此函数值表提供给numpy.gradient
,以获得具有每个维度(变量)的数值导数的数组。
来自here的示例:
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
您也可以使用centered difference quotient自行计算衍生物。
这基本上是预定义网格中每个点的numpy.gradient
is doing。
答案 1 :(得分:12)
Numpy和Scipy用于数值计算。由于您想要计算分析函数的梯度,您必须使用支持符号数学的Sympy包。差异化解释为here(您实际上可以在左下角的Web控制台中使用它。)
您可以使用
在Ubuntu下安装Sympysudo apt-get install python-sympy
或使用pip
的任何Linux发行版sudo pip install sympy
答案 2 :(得分:4)
theano
也可以自动计算渐变
http://deeplearning.net/software/theano/tutorial/gradients.html
答案 3 :(得分:1)
您可以使用scipy.optimize.approx_fprime
f = lambda x: x**2
approx_fprime(np.array([2]), f, epsilon=1e-6) # array([ 4.000001])
答案 4 :(得分:0)
Numpy并不直接支持渐变计算而不创建整个网格点。相反,我会使用autodifferentiation 有关如何在Python中执行此操作,请参阅https://code.activestate.com/recipes/580610-auto-differentiation/。