web-dev-qa-db-fra.com

Calculer le dégradé avec NumPy

Je ne peux vraiment pas comprendre ce que fait la fonction numpy.gradient et comment l’utiliser pour calculer la fonction multivariable gradient.

Par exemple, j'ai une telle fonction:

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

Je dois calculer le gradient tridimensionnel (en d'autres termes, je souhaite calculer des dérivées partielles par rapport à toutes les variables (q, chi, delta)).

Comment puis-je calculer ce gradient avec NumPy?

17
Mikhail Elizarev

Le problème est que numpy ne peut pas vous fournir directement les dérivés et vous avez deux options:

Avec NUMPY

Ce que vous devez essentiellement faire est de définir une grille en trois dimensions et d’évaluer la fonction sur cette grille. Ensuite, vous alimentez cette table de valeurs de fonction dans numpy.gradient pour obtenir un tableau avec la dérivée numérique de chaque dimension (variable).

Exemple de ici :

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)

Sans NUMPY

Vous pouvez également calculer la dérivée vous-même en utilisant le quotient de différence centré } _.centered difference quotient

Il s’agit essentiellement de ce que numpy.gradient _ { fait } _ pour chaque point de votre grille prédéfinie.

18
Stefan

Numpy et Scipy sont destinés aux calculs numériques. Puisque vous voulez calculer le gradient d'une fonction analytique, vous devez utiliser le paquet Sympy qui prend en charge les mathématiques symboliques. La différenciation est expliquée ici (vous pouvez l’utiliser dans la console Web dans le coin inférieur gauche).

Vous pouvez installer Sympy sous Ubuntu avec

Sudo apt-get install python-sympy

ou sous toute distribution Linux avec pip

Sudo pip install sympy
11
Rafael Reiter

De plus, theano peut calculer le dégradé automatiquement

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

3
Jack Twain

Numpy ne prend pas directement en charge les calculs de dégradés sans créer une grille de points complète. Au lieu de cela, je voudrais utiliser autodifferentiation Voir https://code.activestate.com/recipes/580610-auto-differentiation/ pour savoir comment le faire en Python.

0
Raymond Hettinger

Vous pouvez utiliser scipy.optimize.approx_fprime

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