Вычисление градиента с помощью NumPy
Я действительно не могу понять, что делает функция numpy.gradient
и как ее использовать для вычисления многовариантного градиента функции.
Например, у меня есть такая функция:
def func(q, chi, delta):
return q * chi * delta
Мне нужно вычислить его трехмерный градиент (другими словами, я хочу вычислить частные производные по всем переменным (q, chi, delta)).
Как я могу вычислить этот градиент с помощью NumPy?
Ответы
Ответ 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
Вы также можете вычислить производную, используя центрированный фактор разницы.
![centered difference quotient]()
Это по существу, что numpy.gradient
делает для каждой точки вашей предопределенной сетки.
Ответ 2
Numpy и Scipy предназначены для численных расчетов. Поскольку вы хотите рассчитать градиент аналитической функции, вы должны использовать пакет Sympy, который поддерживает символическую математику. Дифференциация объясняется здесь (вы можете использовать ее в веб-консоли в левом нижнем углу).
Вы можете установить Sympy под Ubuntu с помощью
sudo apt-get install python-sympy
или в любом дистрибутиве Linux с pip
sudo pip install sympy
Ответ 3
Также theano
может автоматически вычислить градиент
http://deeplearning.net/software/theano/tutorial/gradients.html
Ответ 4
Numpy напрямую не поддерживает вычисления градиента, не создавая целую сетку точек. Вместо этого я бы использовал автодифференцировку
См. https://code.activestate.com/recipes/580610-auto-differentiation/ для того, как это сделать в Python.
Ответ 5
Вы можете использовать scipy.optimize.approx_fprime
f = lambda x: x**2
approx_fprime(np.array([2]), f, epsilon=1e-6) # array([ 4.000001])