単純ベイズで多くの確率を乗算すると、浮動小数点アンダーフローが発生する可能性があります。
P(x_1,….,x_n│c) = P(x_1│c).P(x_2│c).P(x_3│c)… … P(x_n |c)
上記の式を使用する代わりに (結果として浮動小数点アンダーフローが発生します)、以下の式を使用する方がより実現可能/優れていますか? それとも情報を切り捨てますか?
log(xy) = log(x) + log(y)
単純ベイズで多くの確率を乗算すると、浮動小数点アンダーフローが発生する可能性があります。
P(x_1,….,x_n│c) = P(x_1│c).P(x_2│c).P(x_3│c)… … P(x_n |c)
上記の式を使用する代わりに (結果として浮動小数点アンダーフローが発生します)、以下の式を使用する方がより実現可能/優れていますか? それとも情報を切り捨てますか?
log(xy) = log(x) + log(y)
アンダーフローまたはオーバーフローが発生するポイントまでは、浮動小数点乗算が最適な浮動小数点演算です。さらに、数式では、アンダーフローに達すると、未処理の係数が 1.0 未満であり、最終結果をさらに小さくすることにしか寄与できないため、最終値が小さいことがわかります。
対数を使用すると、最初は対数自体が原因で、2 つ目は異なる大きさの数値の浮動小数点加算がうまく動作しないため、全体的に精度が低下するように見えます。
2 -1024の確率と 0 の確率の違いを気にしない限り、何らかの理由で質問がわかりません。最初の式の行儀の良い乗算を危険に変えたい理由がわかりません。 -2番目のものに追加が必要です。
注意: IEEE 754 の binary64 フォーマットをアンダーフローするには、それぞれ 2 -50のオーダーの 20 の係数が必要です。これが予想され、正確に処理したい種類のデータである場合、コンパイラがこの型を使用できるようにしているlong double
場合 (たとえば、C を使用している場合など) は、80 ビットの倍精度拡張形式に移行することを検討できます。 MPFRは、指数を表すために完全な単語を使用していると私は信じています。