4

したがって、次のコードで興味深いバグを修正しましたが、私が最善を尽くしたアプローチがわかりません。

p = 1
probabilities = [ ... ] # a (possibly) long list of numbers between 0 and 1
for wp in probabilities:

  if (wp > 0):
    p *= wp

# Take the natural log, this crashes when 'probabilites' is long enough that p ends up
# being zero
try:
    result = math.log(p)

結果は正確である必要はないので、ゼロ以外の最小値を保持し、pが0になった場合にそれを使用することで、これを解決しました。

p = 1
probabilities = [ ... ] # a long list of numbers between 0 and 1
for wp in probabilities:

  if (wp > 0):
    old_p = p
    p *= wp
    if p == 0:
      # we've gotten so small, its just 0, so go back to the smallest
      # non-zero we had
      p = old_p
      break

# Take the natural log, this crashes when 'probabilites' is long enough that p ends up
# being zero
try:
    result = math.log(p)

これは機能しますが、私には少し厄介なようです。私はこの種の数値プログラミングをあまり行っていません。これが人々が使用する種類の修正なのか、それとももっと良いものがあるのか​​はわかりません。

4

1 に答える 1

9

math.log(a * b)はに等しいので、配列math.log(a) + math.log(b)のすべてのメンバーのログの合計を取りませんか?probabilities

pこれにより、フローが非常に小さくなるという問題を回避できます。

編集:これはnumpyバージョンであり、大規模なデータセットの場合はよりクリーンではるかに高速です。

import numpy
prob = numpy.array([0.1, 0.213, 0.001, 0.98 ... ])
result = sum(numpy.log(prob))
于 2010-06-08T17:58:54.923 に答える