wake-up-neo.com

Gradient mit NumPy berechnen

Ich kann wirklich nicht verstehen, was die numpy.gradient-Funktion tut und wie man sie zur Berechnung des multivariablen Funktionsgradienten verwendet.

Ich habe zum Beispiel eine solche Funktion:

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

Ich muss den 3-dimensionalen Gradienten berechnen (mit anderen Worten, ich möchte partielle Ableitungen in Bezug auf alle Variablen (q, chi, delta) berechnen).

Wie kann ich diesen Gradienten mit NumPy berechnen?

17

Das Problem ist, dass numpy Ihnen die Ableitungen nicht direkt geben kann, und Sie haben zwei Möglichkeiten:

Mit NUMPY

Im Wesentlichen müssen Sie ein Raster in drei Dimensionen definieren und die Funktion in diesem Raster auswerten. Anschließend füttern Sie diese Tabelle mit Funktionswerten in numpy.gradient, um ein Array mit der numerischen Ableitung für jede Dimension (Variable) zu erhalten.

Beispiel aus hier :

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)

Ohne NUMPY

Sie können die Ableitung auch selbst berechnen, indem Sie den Quotienten der zentrierten Differenz ..__ verwenden.centered difference quotient

Dies ist im Wesentlichen das, was numpy.gradienttut für jeden Punkt Ihres vordefinierten Rasters.

18
Stefan

Numpy und Scipy dienen zur numerischen Berechnung. Da Sie den Gradienten einer analytischen Funktion berechnen möchten, müssen Sie das Paket Sympy verwenden, das symbolische Mathematik unterstützt. Die Unterscheidung wird erklärt hier (Sie können es tatsächlich in der Webkonsole in der linken unteren Ecke verwenden).

Sie können Sympy unter Ubuntu mit installieren

Sudo apt-get install python-sympy

oder unter einer beliebigen Linux-Distribution mit pip

Sudo pip install sympy
11
Rafael Reiter

Auch theano kann den Gradienten automatisch berechnen

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

3
Jack Twain

Numpy unterstützt Gradientenberechnungen nicht direkt, ohne ein gesamtes Punktraster zu erstellen. Stattdessen würde ich autodifferentiation .__ verwenden. Siehe https://code.activestate.com/recipes/580610-auto-differentiation/ , um zu erfahren, wie das in Python gemacht wird.

0

Sie könnten scipy.optimize.approx_fprime verwenden.

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