web-dev-qa-db-ja.com

NumPyで勾配を計算する

私は本当にnumpy.gradient関数は、多変数関数勾配の計算にそれを使用する方法を実行します。

たとえば、私はそのような機能を持っています:

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

3次元の勾配を計算する必要があります(つまり、すべての変数(q、chi、delta)について偏導関数を計算する必要があります)。

NumPyを使用してこの勾配を計算するにはどうすればよいですか?

18

問題は、numpyが導関数を直接与えることができず、2つのオプションがあることです。

NUMPYを使用

基本的にあなたがしなければならないことは、3次元でグリッドを定義し、このグリッド上の関数を評価することです。その後、この関数値のテーブルをnumpy.gradientは、すべての次元(変数)の数値微分を持つ配列を取得します。

here の例:

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 を使用して、導関数を自分で計算することもできます。 centered difference quotient

これは基本的に、numpy.gradient実行中 事前定義されたグリッドのすべてのポイントに対して。

21
Stefan

NumpyとScipyは数値計算用です。分析関数の勾配を計算するため、シンボリック数学をサポートする Sympy パッケージを使用する必要があります。差別化について説明します ここ (左下隅のWebコンソールで実際に使用できます)。

次のコマンドでUbuntuにSympyをインストールできます。

Sudo apt-get install python-sympy

または pip を使用したLinuxディストリビューションで

Sudo pip install sympy
13
Rafael Reiter

また、theanoは勾配を自動的に計算できます

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

4
Jack Twain

scipy.optimize.approx_fprime

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

Numpyは、ポイントのグリッド全体を作成せずに勾配計算を直接サポートしません。代わりに、私は autodifferentiation を使用します https://code.activestate.com/recipes/580610-auto-differentiation/ をPythonで行う方法を参照してください。

0