24

私は Python でプログラムされたベイジアン分類器を持っています。問題は、機能の確率を乗算すると、2.5e-320 などの非常に小さな float 値が得られ、突然 0.0 に変わることです。MAX 値 (より大きい値) を返すクラスに基づいて「最適な」クラスを見つける必要があるため、0.0 は明らかに役に立ちません。

これに対処する最善の方法は何ですか?数値の指数部分 (-320) を見つけ、それが低すぎる場合は、その値に 1e20 またはそのような値を掛けることを考えました。しかし、もっと良い方法があるのではないでしょうか?

4

4 に答える 4

24

あなたが説明するのは、単純ベイズ分類器の標準的な問題です。それを使用してアンダーフローを検索して、答えを見つけることができます。またはこちらをご覧ください

簡単に言うと、すべてを対数で表現するのが標準です。したがって、確率を乗算するのではなく、それらの対数を合計します。

分類のために、他のアルゴリズムも検討することをお勧めします。

于 2010-09-13T21:50:57.740 に答える
20

対数空間で仕事をすることは可能でしょうか?(たとえば、を格納する代わりに、を格納1e-320し、-320乗算の代わりに加算を使用します)

于 2010-09-13T21:43:01.450 に答える
7

浮動小数点数の精度は無限ではありません。そのため、数値が0になります。すべての確率に大きなスカラーを掛けて、数値がより高い範囲にとどまるようにできますか?マグニチュードではなく最大値だけが気になる場合は、最後に分割する必要はありません。または、ikanoboriが提案するように、無限精度の小数を使用することもできます。

于 2010-09-13T21:39:09.180 に答える
5

stdlib からDecimalを見てください。

from decimal import Decimal, getcontext

getcontext().prec = 320

Decimal(1) / Decimal(7)

かなり長いので、ここに結果を投稿しません。

于 2010-09-13T21:35:55.717 に答える