0

単純なベイジアン分類器を実装しましたが、それを大量のデータで使用するとオーバーフローの問題が発生します。

数値を小さく保ちながら正確に保つために私が試みた 1 つの戦略は、方程式のすべての部分の最大公約数で分子と分母を減らし続けることでした。ただし、これは、共通の約数がある場合にのみ機能します...

ほとんどの計算で分母と分子を分離しておくと、整数オーバーフローに苦労します。ほとんどの計算をオンザフライで実行し、二重算術を使用すると、さまざまな問題/制限に遭遇します。 (IEEE 754 で定義されているように) 非常に小さな double 値があります。

ここにいる何人かは以前にこのアルゴリズムを実装したことがあると思いますが、これらの問題にどのように対処しましたか? コストがかかりすぎるため、任意の精度の型を取り込まないことをお勧めします。それらを必要としないソリューションが存在すると確信しています。

ありがとう。

4

2 に答える 2

3

通常、これを処理する方法は、ログを取得して加算を使用し、確率空間に戻りたい場合は exp を実行することです。

p1 * p2 * p3 * ... * pn = exp(log(p1) + log(p2) + log(p3) + ... log(pn))

ログ スペースで作業することにより、アンダー フローを回避します。

于 2011-11-03T21:04:25.627 に答える
0

2 つのカテゴリ間で分類している場合は、各カテゴリの確率の対数比を導入できます。したがって、次の場合:

log(Pr(cat1) / Pr(cat2)) <=> 0 # positive would favor cat1 and negative cat2

それは次のようになります:

log(Pr(cat1)) - log(Pr(cat2)) <=> 0

そして、(ベイジアン分類器のように) カテゴリ確率自体が、条件を与えられた確率の積である場合:

log(Pr(cat1|cond1)) + ... <=> log(Pr(cat2|cond1)) + ...

したがって、乗算ではなく合計を扱っているため、同じことを実行するには大量のデータセットが必要になります。

于 2012-03-06T21:04:03.737 に答える