非常に小さな尤度値を確率に変換(正規化)する


21

モデルを指定して、データセットのリストの尤度を計算し、各尤度を(確率で)正規化する必要があるアルゴリズムを作成しています。したがって、[0.00043、0.00004、0.00321]のようなものは、[0.2、0.03、0.77]のように変換される可能性があります。

私の問題は、私が取り組んでいる対数尤度が非常に小さいことです(たとえば、ログスペースでは、値は-269647.432、-231444.981などのようになります)。私のC ++コードで、それらを2つ追加しようとすると(指数を取ることで)、「Inf」という答えが返されます。私はそれらをログスペースログの合計/減算)に追加しようとしましたが、再び同じ問題に出くわしました。

誰もこれについて専門家の意見を共有できますか?


を含むlog(1+)ように指定したlog1p関数を使用したときに、その関数を言語で使用しましたか?これは、1。の周りのテイラー展開を使用しています
ニール・G

回答:


30

すべてのログから最大対数を引きます。指数関数をアンダーフローするような非常に否定的な結果はすべて捨ててください。(それらの可能性は、すべての実用的な目的のために、ゼロです。)

確かに、あなたがの相対精度たい場合は、ϵ(例えばϵ=10dのためのd精度の桁)、あなたが持っているnの尤度を、以下の対数よりも任意の結果を捨てるϵ/n。その後、通常どおりに結果の値をべき乗し、すべてをすべての指数の合計で除算します。

λ1,λ2,,λnB > 1λn=max(λi)b>1

αi={bλiλn,λiλnlog(ϵ)log(n)0otherwise.

正規化された尤度は、、 これは、アンダーフローしているすべてゼロに置き換えると、合計エラーが最大になるためです。一方、およびすべてのは負ではなく、分母であり、ゼロ置換ルールによる合計相対誤差は厳密に、必要に応じて。 iは= 1 2 ... N α IN - 1 ε / N < ε α N = B λ N - λ N = B 0 = 1 α 、I A = Σ jのα J1 N - 1αi/j=1nαji=1,2,,n.αi(n1)ϵ/n<ϵαn=bλnλn=b0=1αiA=jαj1((n1)ϵ/n)/A<ϵ

過度の丸め誤差を回避するには、最小値から合計を計算します。これは、が最初に昇順でソートされるときに自動的に行われます。これは、が非常に大きいのみ考慮されます。λ I Nαiλin

ところで、この処方は、ログのベースがより大きいと仮定しました。ベースが未満の場合、最初にすべてのログを無効にし、ベースが等しいかのように続行します。b 1 1 / b1b11/b


対数(自然対数、たとえば)がおよび等しい3つの値があるとし 最後が最大です。各値からそれを引くと、および231444.981 231444.699。- 38202.733 - 0.282 0。269647.432, 231444.981,231444.699.38202.733, 0.282,0.

IEEEの倍精度(10進数で約16桁)に匹敵する精度が必要で、およびます。(は3つの有効数字にしか与えられないため、実際にこの精度を達成することはできませんが、それでも大丈夫です:必要な精度と実際の精度に影響を与えないことが保証されている値のみをていますhave。) = = 3つの違いのうち、最初のはこれよりも小さいため、捨てて、とだけを残し ます。 n = 3 0.282 log ϵ / n log 10 16log 3 37.93997 38202.733 0.282 0. exp 0.282 = 0.754 exp 0 = 1 0 0.754 /1 + 0.754 =ϵ=1016n=30.282log(ϵ/n)log(1016)log(3)37.93997.38202.733,0.2820.exp(0.282)=0.754および(もちろん)。正規化された値である- order--にあなたは捨てたいずれかの、、及び。exp(0)=101 /1 + 0.754 = 0.5700.754/(1+0.754)=0.4301/(1+0.754)=0.570


これは素晴らしいです-とてもシンプルで、後知恵でとても明白です。@Ikram、これを正解としてマークしてください!(もちろん、もっと良いものがない限り、その場合は共有してください)
-zelanix

2
@whuber私たちも捨てる必要がありますか?とにかくゼロを与えるべきなので、合計には寄与しません。38202.733
テイラー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.