マルコフ連鎖のレートとして式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])の合計です。
マルコフ連鎖のレートとして式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])の合計です。
この擬似コードは機能するはずです。
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])がゼロにアンダーフローしても問題ありません。
アンダーフローと丸め誤差を除いて、次の理由により、減算変換後の確率は同じである必要があります。