2

マルコフ連鎖のレートとして式exp(X)を使用します。したがって、あるリンクを別のリンクよりも選択する比率は、exp(X1)/ exp(X2)です。私の問題は、Xが非常に大きい場合があるため、exp(X)がの範囲を超えることですdouble

または、X [i]の配列があり、一部のX [i]が非常に大きいため、exp(X [i])がの範囲をオーバーフローするdouble場合、各iについてexp(X [i])/ Sを計算します。ここで、Sすべてのexp(X [i])の合計です。

4

1 に答える 1

3

この擬似コードは機能するはずです。

Let M = the largest X[i].

For each i:
    Subtract M from X[i].

Let S = the sum of exp(X[i]) for all i.

For each i:
    The probability for this i is exp(X[i]) / S.

Mが大きい場合、減算ステップの後、一部のX [i]は非常に小さい(負の値が大きい)ため、exp(X [i])は倍精度でゼロと評価されます。ただし、これらのアイテムの実際の確率は非常に小さいため、実際の確率とゼロの間に実際的な違いはありません。したがって、exp(X [i])がゼロにアンダーフローしても問題ありません。

アンダーフローと丸め誤差を除いて、次の理由により、減算変換後の確率は同じである必要があります。

  • exp(xM)= exp(x)/ exp(M)。
  • この除算は、確率の分子と分母の両方に同じように影響するため、比率は同じままです。
于 2012-08-17T19:14:37.647 に答える