12

McCarthyがLispを発明した最初の動機の1つは、自動判別のためのシステムを書くことでした。それにもかかわらず、私のGoogleの検索は、これを行うためのライブラリ/マクロを生成していません。関数Fを取り、Fの微分を計算する関数dF/dxを返すためのScheme/Common Lisp/Clojureライブラリ(マクロ)がありますか?Scheme/Common Lisp/Clojureの自動微分ライブラリ

複数の引数を持つFをサポートしたいと考えています。ユーザは、これらのうちのどれがxに関して差別化されるかを選択する。理想的には、微分器はベクトル値のFとxについても機能します。

EDIT:いくつかの人々が象徴的な分化について言及しています。象徴的な分化と自動分化との違いは微妙な違いですが、Wikipedia、特にthis pictureによくまとめられています。この区別は、象徴的な表現がそのまま現実のプログラムに変わる可能性のあるlispほど強力ではないが、潜在的な難しさが残っている。記号的な区別のために、既知の派生語を持つ演算で構成されている表現が必要である。例えば、(+ y (* (x y)))のような単純な性別をぶつけ、+*を区別する方法の知識とともに、チェーンルールを使用して、その派生語を表すsexpを返すSICPのマクロの例を挙げた人がいます。 (* (foo x y) (bar x))のような式で作業する必要があります。foobarは、微分時に微分が分からない他の関数を呼び出すことがあります。 (foo x y)のような表現を取り、hygenic方法でxyで引数のいずれかの言及に置き換えて、その関数本体とそれを交換する方法があるかどう

これは大丈夫でしょう。ある?

また、ベクトル値の関数をベクトル値の引数と区別する際に生じる複雑さについても言及していません。これは、ほとんどの自動二分化の実装に適しています。

+2

を持つビット「の数値・メソッド」タグは、あなたの質問には適切ではない、それをClojurifying後

function f(x) y = x; for i=1...100 y = sin(x+y); return y 

ですなぜなら、あなたが求めているのは_記号的な分化であるからです。数値微分によるxにおける関数fの導出を見つけることは、dxのある小さな値に対する(f(x + dx)-f(x))/ dxの計算に過ぎない。 – Curd

+3

@curd:数値メソッドのタグを追加することで、数値の微分を行う方法を探していることを意味するわけではありません。私はちょうどその問題が、数値計算に関連する関数(例えば、数値的方法を実装する記号表現の評価)に関係することを意味しました。 – SuperElectric

+2

私はあなたと一緒にいます。私は、自動分化の人々がそれを象徴的な差別化と混同し、違いがあると聞くことをしばしば拒否することを言い渡すたびに、イライラしています。これは確かに「数値的方法」であり、確かに「数値的な差別化」ではありません。 – sigfpe

答えて

2

Schemeでの自動区別のために、2つの他のパッケージがあります。 2番目は最初のものに基づいていますが、鶏卵として再加工されています。これらは、順方向モードと逆方向モードの両方をサポートする。あなたがあってもよい

:ClojureのとJavaの両方のための自動微分を行いDerivaを、チェックアウトする価値

3

シンボリックシステムをお探しの場合は、maxima(またはhere)をお試しください。これは、多くのCommon-Lisp/OSプラットフォームの組み合わせで動作しますが、ライブラリよりも完全なシステムです。

コンソールの出力はOKですが、texmacsと組み合わせるとかなり見栄えの良い出力が得られます。私は質問を誤解よう

Maxima 5.23.2 http://maxima.sourceforge.net 
using Lisp GNU Common Lisp (GCL) GCL 2.6.8 (a.k.a. GCL) 
Distributed under the GNU Public License. See the file COPYING. 
Dedicated to the memory of William Schelter. 
The function bug_report() provides bug reporting information. 
(%i1) diff(sin(1/x),x); 
             1 
            cos(-) 
             x 
(%o1)        - ------ 
             2 
             x 

EDIT

OKは、見えます。 SCMUTILS hereには、here、ユーザマニュアルhere(p24以降を参照)をダウンロードするツールがいくつかあります。

+0

ありがとうございますが、シンボリックな差別化のための外部ツールは私が探しているものではありません。私はこれを明確にするために質問を編集しました。 – SuperElectric

+0

すべての共通のlispプログラムのライブラリとしてMaximaを使うことができるはずです(したがって、マクロ内部から使用することもできます)。結局のところ、 "外部"ではありません。 –

+0

それは問題である象徴です。私は、関数Fを取り、関数F 'を返すマクロを探しています。私は、記号的な式ではなく、数値の引数を取る評価可能な関数を意味します。 – SuperElectric

7

アレクセイRadulは書いている:

まあ、自動微分システムがありますScmutils

http://groups.csail.mit.edu/mac/users/gjs/6946/linux-install.htm

(偶然にも象徴的差別をしています)。 他のリリースされている実装についてはわかりませんが、 チェックhttp://autodiff.org/になる可能性があります。

構造の付録と古典力学の解釈

http://mitpress.mit.edu/sicm/

だけでなく、学術文献中でそれを自分で実装する方法の素敵な説明もあります。特に転送モードは ですが、それほど難しくありませんが、混乱を避けるためには注意が必要ですが、 混乱。 ADを組み込み、周囲の問題を に公開している、高性能の Lispの亜種で協力しているBarak Pearlmutter とJeffrey Mark Siskindの出版物を参照してください。

http://scholar.google.com/scholar?q=Barak+Pearlmutter+and+Jeffrey+Mark+Siskind

+0

ありがとうございます!一つの最後のこと:あなたは "摂動の混乱"という言葉を定義したり、おそらく参考にすることができますか?私はこの用語になじみがない。 – SuperElectric

+1

このホワイトペーパーから答えを見つけました:http://eprints.nuim.ie/archive/00000566/01/Perturbation.pdf "これらの実装(...)は、微分演算子がこの問題の根底にある原因は、摂動混乱であり、摂動オペレータの別個の呼び出しによって導入された別個の摂動を区別することができず、摂動の混乱を避けることができます。 – SuperElectric

2

それは興味があるかもしれscmutlis:数式操作の詳細ですが、まだいくつかの分化機能を持っており、おそらく最もADのユースケースに適合させることができるエスプレッソ、に興味現在Clojureに移植されています。 多くの作業がありますが、SICM本の最初の章のコードは正常に動作しているようです。

微分ルーチンと演算子も、私がやった小さなテストではうまくいくように思えます。また、scmutilsの後のバージョンに入っているように見えるいくつかのバグもありません。

scmutilsは既知の関数と未知の(リテラル)関数の両方の派生関数を正しく処理するため、OPの要件を区別していると思います。このページには、それが要件適合性を確認するために必要な詳細情報与えます:JVM上で動作していることの利点の SICM - Derivatives - Notation

一つを、そう、でもClojureのをインストールする必要を必要としない場合には、スタンドアロンとして実行されますです!

これは、元のSchemeに非常に近く、Clojure構文のための最小の譲歩です。

あなたはここでそれを見ることができます:

補遺 https://github.com/littleredcomputer/sicmutils#sicmutils

===: はここSicmUtils Clojureのパッケージの自動微分の一例です。これは、さまざまなインターネットサイト上で循環する一般的な例である、区別するコードは、私たちが

> (defn inner [y] (fn[x] (sin (+ x y)))) 
    > (defn f100 [x] (nth (iterate (inner x) x) 100)) 
    ;; value of derivative at 6 
    > ((D f100) 6) 
    => 0.51603111348625 
    ;; value of the 4th derivative at 1 
    > (((expt D 4) f100) 1) 
    => -1.7853200839806143