問題タブ [automatic-differentiation]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
language-agnostic - 高階関数の導関数
これは、自動微分の文脈での話です。そのようなシステムは、SKI コンビネーターのような機能を使って何をするのでしょうmap
か?filter
例: 次の機能があります。
その派生物は何でしょうか?その結果、AD システムは何をもたらすでしょうか? (この関数は、実数入力に対して明確に定義されています)。
haskell - Haskellのリバースモード自動微分の実用的な実装はありますか?
私が見たHaskellで最も近い関連の実装は、http://hackage.haskell.org/packages/archive/fad/1.0/doc/html/Numeric-FAD.htmlの転送モードです。
最も近い関連研究は、http: //www.bcl.hamilton.ie/~qobi/stalingrad/にあるSchemeに関連する別の関数型言語のリバースモードのようです。
Haskellのリバースモードは、Haskellのネストされたデータ並列処理を使用して、数値の大幅な最適化を大幅に高速化できることを期待して、多くのタスクの聖杯のようなものだと思います。
c# - C# および F# での自動微分
C# と F# の間で自動微分を機能させるのに問題があります。
C# には、double を受け取って double を返す関数があります。
Math.pow は非常に厳しく、そのパラメーターには double または int のみを許可するため、この関数を具体的に選択しました。
この関数を自動微分で微分したいと思います。このためのメソッドを F# で記述しました。
残念ながら、タイプ Diff を Price(..) 関数に入力してタイプ Diff を生成する必要があります。次に、このタイプを Differente(..) 関数に入力して、別のタイプ Diff を返します。
ただし、私の C# 関数は double でのみ機能します (C# プログラムの他の場所で使用されているため、このままにしておきたいと思います)。
これを解決するために考えることができる唯一の方法は、すべての関数を 2 回記述することです。これは明らかにひどいものです。
1) 毎回差別化されたバージョンを書いたほうがいいかもしれません 2) これはあまり拡張可能なモデルではありません
これを回避する方法、または double 関数を Diff 関数 (できれば F#) に強制する方法はありますか。理想的には、(double -> double) 関数をスローして Diff.ToString() を取得したいだけです。
これが完全に曖昧であるか、理解できない場合は申し訳ありません。不明な点があればコメントで質問にお答えします。
これに対する解決策があることを願っています!前もって感謝します、
アシュリー
java - Javaの微分方程式系のルンゲクッタ法(RK4)
この引用は主にこのスレッドの結果です:Javaの微分方程式。
基本的に、私はJason S.のアドバイスに従い、ルンゲクッタ法(RK4)を介して微分方程式の数値解法を実装しようとしました。
みなさん、こんにちは。JavaでSIRエピデミックモデルの簡単なシミュレーションプログラムを作成しようとしています。基本的に、SIRは次の3つの微分方程式のシステムによって定義されます
。S'(t)= --lamda(t)* S(t)
I'(t)= lamda(t)* S(t)-gamma(t)* I(t)
R'(t)= gamma(t)* I(t)
S-影響を受けやすい人々、I-感染した人々、R-回復した人々。lamda(t)= [c * x * I(t)] / N(T)c-接触の数、x-感染性(病気の人との接触後に病気になる確率)、N(t)-総人口(一定です)。
gamma(t)= 1 /病気の期間(一定)
最初の試みはあまり成功しませんでしたが、ルンゲクッタ法でこの方程式を解こうとしましたが、この試みの結果、次のコードが生成されました。
病気の人(I)の数は最初に増加し、次に約0に減少し、回復した人の数は厳密に増加する必要があるため、これは機能していないようです。病気+健康+回復の総数は100になるはずですが、私のコードはいくつかの奇妙な結果を生成します:
間違いは見つかりません、アドバイスしてください!よろしくお願いします!
clojure - Scheme / Common Lisp / Clojure の自動微分ライブラリ
マッカーシーが Lisp を発明した当初の動機の 1 つは、自動微分のシステムを書くことだったと聞いたことがあります。それにもかかわらず、私の Google 検索では、これを行うためのライブラリ/マクロは得られませんでした。関数 F を取り、F の導関数を計算する関数 dF/dx を返すための Scheme/Common Lisp/Clojure ライブラリ (マクロ) はありますか?
複数の引数を持つ F をサポートしたいと思います。ユーザーは、これらのうちどれを x として微分するかを選択します。理想的には、微分器はベクトル値の F と x に対しても機能します。
編集:何人かの人々が象徴的な微分について言及しています。シンボリック微分と自動微分の違いは微妙ですが、ウィキペディア、特にこの図によくまとめられています。この区別は、シンボリック式をそのまま動作するプログラムに変換できる Lisp ではそれほど強力ではありませんが、潜在的な問題が残っています。
シンボリック微分では、微分される式が既知の導関数を使用した操作で構成される必要があります。たとえば、誰かが のような単純な sexp をかき回すマクロの SICP の例に言及し、微分を表す sexp を返す(+ y (* (x y)))
方法の知識とともに、チェーン ルールを使用します。、 whereおよびmay のような式で作業するには、微分時に導関数が不明な他の関数を呼び出す必要があります。+
*
(* (foo x y) (bar x))
foo
bar
(foo x y)
のような式を取り、それを関数本体に置き換えて、引数の言及を衛生的な方法で and に置き換えるx
方法があれば、これは問題ありませんy
。ある?
また、上記のいずれも、ベクトル値の引数に関してベクトル値の関数を微分するときに発生する複雑さに対処していません...これは、ほとんどの自動微分の実装が対象とされているものです。
haskell - Numeric.AD と入力の問題
Numeric.AD とカスタム Expr タイプを使用しようとしています。ユーザー入力式のシンボリック勾配を計算したいと思います。定数式を使用した最初の試行はうまく機能します。
これは機能します:
ただし、式をパラメーターとして引き出すと、次のようになります。
私は得る
どうすればghcにこれを受け入れさせることができますか?
haskell - Numeric.AD 関数で許容される型
ad
パッケージに含まれる型の基本的な配管に頭を悩ませることにほとんど成功していません。たとえば、次のコードは完全に機能します。
grad
タイプは次のとおりです。
ex
toの型シグネチャを変更し[Double] -> Double
て同じことを試すと、
をインスタンス化Double
する種類の一見任意の型コンストラクターに置き換えると、同じ動作が発生します。 *
Num
がリストの場合Traversable f
、 の最初の引数は、許容されるgrad
型(たとえば. しかし明らかに、 のユーザーは、コンストラクターや を直接処理する必要はありません。これらの内部を覗いてみると、私は少し混乱しました。具体的には、との使用の違いについて、種類/型の軌跡をたどることができません。 [AD s a] -> AD s a
Mode
Reverse
grad
AD
Mode
Num a => [a] -> a
[Double] -> Double
[Double] -> Double
型シグネチャが で問題を引き起こすのはなぜgrad
ですか? そして、単純な古いライブラリの使用に関して: の[Double] -> Double
バージョンを使用する方法はありますかex
、それともポリモーフィック バージョンが必要ですか?
(この同様の質問に触発されたタイトル)
probability - 自動確率密度
数学ソフトウェアを書くとき、自動微分が非常に役立つことがわかりました。私は今、確率変数と確率変数の関数を扱う必要があり、自動微分と同様のアプローチをこれにも使用できるように思われます。
アイデアは、与えられた多変量分布を持つ基本的なランダムベクトルから始めて、次にランダムベクトルのコンポーネントの関数の暗黙の確率分布で作業したいということです。アイデアは、2つの確率変数を加算、乗算、除算するときに2つの確率分布を適切に自動的に結合し、べき乗などのスカラー関数を適用するときに分布を適切に変換する演算子を定義することです。次に、これらを組み合わせて、元の確率変数に必要な関数を作成し、対応する確率分布を自動的に使用できるようにすることができます。
これは実行可能ですか?そうでない場合は、なぜですか?もしそうなら、それは特に独創的な考えではないので、誰かが私に既存の実装を、できればCで指摘してもらえますか?
haskell - Haskell広告パッケージ
Haskellでニューラルネットワークの重みを学習するために広告自動微分パッケージを使用したいと思います。必要なものだけを持っているかもしれないいくつかの関数を見つけましたが、それらが最初のパラメーターとして何を期待しているのか理解できません。最適化する機能に違いないのですが、正確にはどのような形なのかわかりません。彼らはこのような署名を持っています:
forall s.
私は、存在記号という名前の何かを意味することを発見しましたが、それ以上のものはありません。cost :: [Double] -> Double
私の質問は、 (重みのリストを取得する)のような署名を使用してコスト関数をこのライブラリに渡すにはどうすればよいかということです。
haskell - Haskell は型の等価性を推測できません
コンパイルできない次のコードがあります。
勾配降下法によってトレーニング可能な機械学習システムを表すために、Trainable 型を使用したいと考えています。最初の引数は伝達関数、次の引数はコスト関数、a は入力の型、b は出力/ターゲットの型で、リストには学習可能なパラメーターが含まれます。コンパイラはこれに文句を言います:
基本的な考え方は正しいですか?もしそうなら、どうすればコードをコンパイルできますか?