私は本当に大きな数でいくつかの数学をやっています(私はPythonを使用していますが、この質問はPython固有ではありません)。1つの値について、私は私に与える式を持っていますf(t) = Pr(X < t)
。この式を使用してを取得したいと思いますPr(X >= t) = 1 - f(t)
。f(t)
戻り値はゼロに非常に近いため、のlog( f(t) )
代わりにログ変換と保存を使用していますf(t)
。私log( f(t) )
は-1e5かそこらのオーダーです。
乗算の場合、これは非常にうまく機能します。log( f(t) * g ) = log( f(t) ) + log(g)
。
しかし、 ;log( 1 - f(t) )
だけを使用して計算することは非常に困難です。log( f(t) )
もちろん、保存して計算した値を一時的にべき乗することもできますが、がゼロに非常に近いため、値log( 1 - exp( log( f(t) ) )
が返されます。log( 1 - 0.0 ) = 0.0
log( f(t) )
「なぜ気にするのですか?ゼロに近い場合は、1から1を引いた値が1に非常に近くなります」と質問するかもしれません。さて、それはあなたが作った良い点です。あなたはスマートクッキーです。
問題は、これを使用して値をランク付けしたいので、一方がであるか、もう一方がlog(0.999)
であるかを本当に気にしlog(0.9999)
ます。log( f(t) )
また、「では、ランク付けしてから、順序を逆にして、のランク付けを取得してみませんか」と質問することもできますlog( 1 - f(t) )
。繰り返しになりますが、私はあなたの質問がどれほど素晴らしいかを指摘せずにはいられません。本当にお話できて光栄です。
しかし、ここに問題があります。私は単にランク付けしたくはありません1 - f(t)
。私は実際にに基づいてランク付けしたいと思いPr(X >= t) * g(t) = (1 - f(t)) g(t)
ます。ログを取った後、私は取得しlog( 1 - f(t) ) + log( g(t) )
ます; 単独でランク付けしf(t)
ても、正しい答えは得られません。
過去に私は計算するための小さなPython関数を書きlog(a + b)
ましlog(a)
たlog(b)
:
def log_add(logA,logB):
if logA == log(0):
return logB
if logA<logB:
return log_add(logB,logA)
return log( 1 + math.exp(logB-logA) ) + logA
最初にそれらを正規化して互いに接近させ、次にそれらが接近したときに指数化することで役立ちます。
残念ながら、引き算で同じトリックを実行することはできませんでした。これは、それらが非常に離れているために、互いに近づきlog(1)
、近づく正規化係数がないためです。log( f(t) )
誰かがこれを解決する方法を知っていますか?それはそのような古典的な種類の問題のようです。log(1-x)
から私に与えることができるビットレベルで動作する巧妙な関数があることを本当に期待/期待/祈っていますlog(x)
。また、それがどのように機能するかを知っているなら、私は本当に、本当に知りたいです。
乾杯!オリバー