计算梯度NumPy的(Calculating gradient with NumPy)

2019-08-31 11:25发布

我实在无法理解什么numpy.gradient功能原理,以及如何使用它的多变量函数梯度的计算。

例如,我有这样的功能:

def func(q, chi, delta):
    return q * chi * delta

我需要计算它的3维梯度(换言之,我想计算偏导数相对于所有变量(Q,志,三角洲))。

我如何使用NumPy的计算这个梯度?

Answer 1:

问题是,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 做你的义电网的每一个点。



Answer 2:

与NumPy和SciPy的是数值计算。 既然你要计算的解析函数的梯度,则必须使用Sympy支持符号数学包。 分化,说明在这里 (实际上你可以在左下角的Web控制台使用它)。

你可以在Ubuntu下安装Sympy

sudo apt-get install python-sympy

或在任何Linux发行PIP

sudo pip install sympy


Answer 3:

theano可以自动计算梯度

http://deeplearning.net/software/theano/tutorial/gradients.html



Answer 4:

你可以使用scipy.optimize.approx_fprime

f = lambda x: x**2
approx_fprime(np.array([2]), f, epsilon=1e-6)  # array([ 4.000001])


Answer 5:

NumPy的不直接支持梯度计算,而无需创建点的整个电网。 相反,我会用autodifferentiation见https://code.activestate.com/recipes/580610-auto-differentiation/如何做到这一点在Python。



文章来源: Calculating gradient with NumPy