27

我真的无法理解numpy.gradient函数的作用以及如何使用它来计算多变量函数梯度

例如,我有这样一个功能:

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

我需要计算它的 3 维梯度(换句话说,我想计算关于所有变量(q、chi、delta)的偏导数)。

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

4

5 回答 5

24

问题是,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 所做的​​事情。

于 2013-04-18T11:44:48.670 回答
14

Numpy 和 Scipy 用于数值计算。由于要计算解析函数的梯度,因此必须使用支持符号数学的Sympy包。此处解释了差异化(您实际上可以在左下角的 Web 控制台中使用它)。

你可以在 Ubuntu 下安装 Sympy

sudo apt-get install python-sympy

或在任何带有pip的 Linux 发行版下

sudo pip install sympy
于 2013-04-18T10:25:38.143 回答
4

theano可以自动计算梯度

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

于 2014-05-01T13:04:17.807 回答
1

你可以使用scipy.optimize.approx_fprime

f = lambda x: x**2
approx_fprime(np.array([2]), f, epsilon=1e-6)  # array([ 4.000001])
于 2017-10-25T12:18:59.527 回答
0

Numpy 不直接支持梯度计算而不创建整个点网格。相反,我会使用自动分化 参见https://code.activestate.com/recipes/580610-auto-differentiation/了解如何在 Python 中进行。

于 2016-08-08T02:09:39.280 回答