2012-12-13 18 views
7

私は、Pythonで関数を持っている:関数のヤコビ行列とヘッセ行列を数値的に近似するにはどうすればよいですか?

def f(x): 
    return x[0]**3 + x[1]**2 + 7 
    # Actually more than this. 
    # No analytical expression 

それはベクトルのスカラー値関数です。

この関数のヤコビ行列とヘッセ行列をnumpyまたはscipyで数値的に近似するにはどうすればよいですか?

+0

グラディエントには 'scipy.optimize.optimize.approx_fprime'があり便利です。 – taper

答えて

11

(この空間にアップデートの多くがあったためだ後半2017年に更新しました。)

あなたの最善の策は、おそらくautomatic differentiationです。これは多くのパッケージがあります。ディープラーニングの標準的なアプローチです:

  • Autogradはほとんどのnumpyコードで透過的に動作します。純粋なPythonで、典型的な関数のコード変更はほとんど必要なく、かなり高速です。
  • これを行うための深い学習指向のライブラリがたくさんあります。 最も普及しているのは、TensorFlow,PyTorch,Theano,Chainer、およびMXNetです。それぞれのAPIは、あなたの関数を同じようなものではなく、不必要に異なるAPIで書き直す必要があります。その代わりに、GPUのサポートと気にする必要のない深い学習指向の機能が提供されます。
  • FuncDesignerは、私のウェブサイトが現在ダウンしていない古いパッケージです。

別のオプションは、基本的には(f(x + eps) - f(x - eps))/(2 * eps)を評価する(しかし、明らかにそれよりも、それに入れてより多くの努力で)、finite differencesでそれを近似することです。これはおそらく、特に中程度の高次元では、他のアプローチよりも遅く、正確さが劣りますが、完全に一般的であり、コードを変更する必要はありません。 numdifftoolsはこれの標準的なPythonパッケージのようです。

SymPyで完全に象徴的な派生派を見つけることもできますが、これは比較的手作業のプロセスです。

0

私が見つけた最も便利な方法は、適切なループの中で、興味のある機能をカリングするためのラムダでscipy.misc.derivativeでした。

関連する問題