1. ホーム
  2. python

[解決済み] Pythonのnumpy.exp関数におけるオーバーフローエラー

2022-02-06 14:32:22

質問

を使いたいのですが numpy.exp このように

cc = np.array([
    [0.120,0.34,-1234.1]
])

print 1/(1+np.exp(-cc))

しかし、これではエラーが発生します。

/usr/local/lib/python2.7/site-packages/ipykernel/__main__.py:5: RuntimeWarning: overflow encountered in exp

なぜなんでしょう?どうしたら直るのでしょうか?どうやら3番目の数字に問題があるようです (-1234.1)

解決方法は?

fugledeさんがおっしゃるように、ここでの問題は np.float64 のような大きな数値は扱えません。 exp(1234.1) . 試しに np.float128 の代わりに

>>> cc = np.array([[0.120,0.34,-1234.1]], dtype=np.float128)
>>> cc
array([[ 0.12,  0.34, -1234.1]], dtype=float128)
>>> 1 / (1 + np.exp(-cc))
array([[ 0.52996405,  0.58419052,  1.0893812e-536]], dtype=float128)

しかし、拡張精度の使用には、いくつかの癖があることに注意してください。Windowsでは動作しないかもしれませんし、128ビットの完全な精度が得られるわけではありません。詳細はこちらをご覧ください。 こちら .

ほとんどの実用的な目的のために、おそらくあなたは近似することができます。 1 / (1 + <a large number>) をゼロにします。つまり、警告を無視して先に進めばいいのです。Numpyが近似を引き受けてくれる( np.float64 ):

>>> 1 / (1 + np.exp(-cc))
/usr/local/bin/ipython3:1: RuntimeWarning: overflow encountered in exp
  #!/usr/local/bin/python3.4
array([[ 0.52996405,  0.58419052,  0.        ]])

警告を表示しないようにしたい場合は scipy.special.expit この質問に対するコメントでWarrenWeckesserが提案したように。

>>> from scipy.special import expit
>>> expit(cc)
array([[ 0.52996405,  0.58419052,  0.        ]])