5

それで、私は今日、制限されたボルツマン マシンを構築する際に問題に出くわしました。基本的に、2k の値を 0 から 1 の間のランダムな double に初期化しています。

私がやりたいのは、このデータセットの幾何平均を計算することです。私が直面している問題は、データセットが非常に長いため、すべてを乗算すると常にゼロになり、すべてのステップで適切なルートを実行すると 1 になることです。

リストをチャンクアップすることもできますが、それは本当にひどいことだと思います. これをエレガントな方法で行う方法についてのアイデアはありますか?

理論的には、現在の RBM コードを拡張して 15,000 以上のエントリを保持し、RBM を複数のスレッドで実行できるようにしたいと考えています。悲しいことに、これは apache commons 数学 (幾何平均法は同期されていません) を除外します。

4

3 に答える 3

1

Mehrdad の対数解は確かに機能します。ただし、より速く(そしておそらくより正確に)行うことができます:

  1. 数値の指数の合計を計算しますS
  2. 各数値が ~ の間にあるように、すべての指数をゼロにし1/2ます1
  3. 数字を最大 1000 の束にグループ化します。
    • グループごとに、数値の積を計算します。これはアンダーフローしません。
    • 積の指数を追加し、S指数をゼロにします。
  4. これで、数が約 1/1000 になりました。番号が 1 つしかない場合を除き、手順 2 と 3 を繰り返します。
  5. 残りの 1 つの番号に電話しTます。幾何平均はT1/N 2 S/Nで、Nは入力のサイズです。
于 2013-04-23T09:18:22.227 に答える
0

十分な数の乗算の後、倍精度はもはや十分ではないようです。必要に応じて、先行ゼロが多すぎます。

任意精度演算に関する wiki ページには、この問題に対処するいくつかの方法が示されています。Java では、速度は犠牲になりますが、BigDecimal が適しているようです。

于 2013-04-23T08:30:26.870 に答える