6

Java で支援学習アルゴリズムを作成しています。

おそらく解決できる数学的問題に遭遇しましたが、処理が重くなるため、最適な解決策が必要です。

そうは言っても、完全に素晴らしい最適化されたライブラリを誰かが知っていれば、言語は Java であるため、考慮する必要があります。

アイデアはかなり単純です。

オブジェクトは、ABDC、ACDE、DE、AE などの変数の組み合わせを格納します。

組み合わせの最大数は、プログラムの速度を落とさずに実行できる数に基づいているため、理論的には 100 と言えます。

決定プロセスは、反復ごとに 1 つの確率変数を生成します。生成された変数がいずれかの組み合わせの一部である場合。ABDC と ACDE の一部である 'A' は、C と B (または保存された組み合わせの後続の文字) の傾向よりも増加します。

もう少し明確にするために、「A」、「B」、「C」、「D」、および「E」が唯一の可能な変数であると仮定しましょう。真実は、12 または 14 のように多くなるということですが、その最大値は、ラグなしで処理できる数にも依存します。

考えられる変数は 5 つあるため、最初の反復では加重 1/5 のランダム ロールが生成されます。そのロールが「A」であることが判明した場合、次の反復で「B」と「C」の傾向は 1/5 ではなく 2/5 になります。

次の反復で「B」が生成された場合、「D」の傾向は 3/5 に増加します。注: 関係は指数関数的です。現実的には、1/5 ではなく 10% のようなわずかなブーストであり、シーケンスの 4 番目の変数に達すると雪だるま式に 50% になります。

現在、Java では、各オブジェクトの格納されたすべての組み合わせを追跡することで、おそらくこの機能を実現できます。私は、追跡プロセスを反復ごとに小さなステップで分散することにより、遅すぎてはならないと考えていました。

別の解決策は、考えられるすべての組み合わせとそれらの潜在的な傾向をマッピングすることです。もちろん、これには単純に検索機能が必要ですが、すべての可能性を計算してどこかに (おそらくファイルに) 保存する際にも問題が生じます。

私はこの型の数学にあまり詳しくありませんが、マルコフ モデルやライブラリを使用する必要があると提案されました。

このプロセスをJavaですばやく計算するにはどうすればよいですか?
.

例 >>>

シーケンス ABC は 1 つだけです。

3 つの数値の場合、最初は等しい可能性があるため、rand(1,3) のようになります。

A が結果の場合、B はシーケンスの次の文字であるため、B の可能性が高くなります。それを2倍にするとしましょう。

したがって、確率は次のようになります: A=1/4、C=1/4、B=2/4

関数は rand(1,4) のようになり、3 と 4 の結果はどちらもオプション B を表します。

次の結果が B の場合、C はシーケンス内の次の文字であるため、C の可能性を増やしたいと考えていますが、前回の増加の 2 倍 (指数関数的に) です。

確率は次のようになりました: A=1/6、C=1/6、B=4/6

関数は rand(1/6) になり、値 3、4、5、6 は C を表します。

4

1 に答える 1

1

必要に応じて C/C++ バージョンを作成し、NDK を使用することもできます (NDK のオーバーヘッドは、Java から C/C++ メソッドへの JNI 変換にありますが、そこに到達すると、はるかに高速になります)

それは一つの考えです。しかし...そこまで行く必要はないと思います(少なくとも小さなセットで機能するバージョンを入手するために)(おそらく後でNDKに移行する方が大きなセットのより良いオプションかもしれません)

これを「整数分数」の配列、つまりアクションの確率の各セットの2次元配列のように扱う方がはるかに良いと思います。「一番上の行」の分子と「一番下の行」の分母を意味します。使用するセットは小さい可能性が高いため、各ノードが独自の確率セットを持つノードの単純なリンクされたリストが機能すると思います。(これらの確率は、「その」ノードからの S から S' への遷移表です。)

 int[][] probs = new int[100][2];

だからあなたはそれを次のように考えることができます...

1 2 1 1

4 3 4 9

整数演算全体で 1/4、2/3、1/4、1/9 として。「removeColumn」の適切なヘルパー関数を作成できるため、これはアルゴリズムの「一部」の部分で簡単になります (0/0 を作成し、残りの処理をスキップするなど (または表現したい場合))。および「adjustProbabilities()」

(分母を単一の int (最小公分母) にすれば、分子の単一の配列を回避できる可能性がありますが、2D 配列バージョンを機能させた後、おそらくこれを最適化するでしょう)

次に、各ノードのデータを操作する「単純な」汎用 P、R、および V メソッドを記述します。次に、それらを適切な OO 設計で調整可能/拡張可能/その他にします。

次に、割引率などの「数字で遊ぶ」だけです。

これは、本当に複雑な数学アルゴリズムなどの問題というよりも、「時間をかけてテストする」ということだと思います。なぜなら、コアアルゴリズムを最適化するための「明白な」場所がないからです。

于 2015-12-19T07:26:43.553 に答える