10

私はPythonで関数を持っています:

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

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

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

4

2 に答える 2

16

(このスペースには多くの更新があったため、2017 年後半に更新されました。)

あなたの最善の策は、おそらく自動微分です。これは深層学習の標準的なアプローチであるため、現在、これには多くのパッケージがあります。

  • Autogradは、ほとんどの numpy コードで透過的に動作します。これは純粋な Python であり、一般的な関数のコード変更はほとんど必要なく、かなり高速です。
  • これを行うことができる深層学習指向のライブラリが多数あります。最も人気のあるものには、TensorFlowPyTorchTheanoChainer、およびMXNetがあります。それぞれが、numpy に似ているが不必要に異なる API で関数を書き直す必要があり、その見返りとして、GPU サポートと、気にするかどうかわからないディープラーニング指向の機能の束が提供されます。 .
  • FuncDesignerは、私が使用していない古いパッケージで、その Web サイトは現在ダウンしています。

別のオプションは、基本的には評価するだけの有限差分(f(x + eps) - f(x - eps)) / (2 * eps)で近似することです(ただし、明らかにそれよりも多くの労力が費やされます)。これは、特に適度に高い次元では、おそらく他のアプローチよりも遅く、精度が低くなりますが、完全に一般的であり、コードの変更は必要ありません。numdifftoolsこのための標準のPythonパッケージのようです。

を使用して完全にシンボリックな導関数を見つけようとすることもできますSymPyが、これは比較的手動のプロセスになります。

于 2012-12-13T09:03:10.447 に答える