5

確率分布に対応する Nx1 配列があります。つまり、要素の合計が 1 になります。これは、通常の numpy 配列として表されます。N は 10 や 20 など、比較的大きい可能性があるため、個々の要素の多くは 0 にかなり近くなっています。これは、numpy で意図的に seterr(invalid='raise') を設定した後であることに注意してください。

この数値の問題をどのように処理できますか? 確率分布に対応するベクトルを表し、0 に丸めずにログを取るようにしたいと思います。

ありがとう。

4

4 に答える 4

3

必要な精度に応じてテールをドロップできます。

eps = 1e-50
array[array<eps]=eps
log(array)
于 2010-11-17T16:37:37.083 に答える
2

ゼロにかなり近いものは何ですか?

>>> np.log(0)
-inf
>>> 0.*np.log(0)
nan
>>> np.log(1e-200)
-460.51701859880916
>>> 1e-200*np.log(1e-200)
-4.6051701859880914e-198

解決策の 1 つは、すべての確率に小さな正の数を追加して、それらをゼロから十分に遠ざけるように制限することです。

2 番目の解決策は、ゼロを明示的に処理することです。たとえば、結果の配列で 0.*np.log(0) をゼロに置き換えるか、確率配列にゼロ以外の確率を持つポイントのみを含めます。

于 2010-11-17T16:32:59.923 に答える
1

それらはどれくらい 0 に「かなり近い」のでしょうか? Python は 10^-非常に大きなログを取ることに満足しているようです:

>>> log(0.0000000000000000000000000001)
-64.472382603833282

また、なぜログを取るのですか?それらを取得したら、それらをどうする予定ですか?

于 2010-11-17T16:23:45.960 に答える
0

その後の作業に応じて、ログのようにゼロ値で爆発しない別の変換を使用できます。おそらく、シグモイド関数か、明確に定義されたヤコビアンを持つ何か。

データを視覚化するだけの場合は、ログを取得する前に、常に小さな値を追加できます。

于 2010-11-17T17:25:51.333 に答える