[解決済み】RuntimeWarning: double_scalars で無効な値が発生した場合の numpy の除算について
質問
以下のようなスクリプトを書きました。
import numpy
d = numpy.array([[1089, 1093]])
e = numpy.array([[1000, 4443]])
answer = numpy.exp(-3 * d)
answer1 = numpy.exp(-3 * e)
res = answer.sum()/answer1.sum()
print res
しかし、このような結果になり、エラーも発生しました。
nan
C:\Users\Desktop\test.py:16: RuntimeWarning: invalid value encountered in double_scalars
res = answer.sum()/answer1.sum()
入力要素が小さすぎてpythonが0にしてしまったようですが、確かに除算はその結果が出ています。
このような問題を解決するにはどうしたらよいでしょうか?
どのように解決するのか?
解けません。単に
answer1.sum()==0
, とゼロによる除算を実行することはできません。
このようなことが起こるのは
answer1
は非常に大きな負の数2つの指数であるため、結果はゼロに丸められます。
nan
が返されるのは、この場合ゼロで割っているからです。
さて、あなたの問題を解決するには、次のようにします。
- 高精度な数学のためのライブラリ、例えば mpmath . でも、それだと面白みがない。
- 大きな武器の代わりとして、以下に詳述するように、数学的な操作を行う。
-
テーラードで行く
scipy/numpy
関数は、まさにあなたが望むことを行うことができます Warren Weckesserの回答をご覧ください。
ここでは、この問題に役立つ計算操作の方法を説明します。分子にはそれがあります。
exp(-x)+exp(-y) = exp(log(exp(-x)+exp(-y)))
= exp(log(exp(-x)*[1+exp(-y+x)]))
= exp(log(exp(-x) + log(1+exp(-y+x)))
= exp(-x + log(1+exp(-y+x)))
ここで
x=3* 1089
と
y=3* 1093
. さて、この指数関数の引数は
-x + log(1+exp(-y+x)) = -x + 6.1441934777474324e-06
分母についても同様ですが、次のようになります。
log(1+exp(-z+k))
はすでに丸められ
0
ということで、分母の指数関数の引数は単純に丸められます。
-z=-3000
. この場合、結果は次のようになります。
exp(-x + log(1+exp(-y+x)))/exp(-z) = exp(-x+z+log(1+exp(-y+x))
= exp(-266.99999385580668)
というのは、先頭の2つの項(つまり最初の数字
1089
を分子に、最初の数字
1000
を分母に持つ)。
exp(3*(1089-1000))=exp(-267)
とりあえず、Wolfram alphaの解にどれだけ近いか見てみよう( リンク ):
Log[(exp[-3*1089]+exp[-3*1093])/([exp[-3*1000]+exp[-3*4443])] -> -266.999993855806522267194565420933791813296828742310997510523
この数値と上の指数との差は
+1.7053025658242404e-13
ということで、分母で行った近似は問題なかったのです。
最終的な結果は
'exp(-266.99999385580668) = 1.1050349147204485e-116
wolframアルファから( リンク )
1.105034914720621496.. × 10^-116 # Wolfram alpha.
で、ここでもnumpyを使うのが無難です。
関連
-
Pythonコンテナのための組み込み汎用関数操作
-
Python関数の高度な応用を解説
-
Python Decorator 練習問題
-
Pythonコードの可読性を向上させるツール「pycodestyle」の使い方を詳しく解説します
-
[解決済み】csv.Error:イテレータはバイトではなく文字列を返すべき
-
[解決済み】ValueError: pickleプロトコルがサポートされていません。3、python2 pickleはpython3 pickleでダンプしたファイルを読み込むことができない?
-
[解決済み] RuntimeWarning: 割り算で無効な値が発生しました。
-
[解決済み] ディクショナリーで最大値を持つキーを取得する?
-
[解決済み] NumPyでユークリッド距離はどのように計算できますか?
-
[解決済み] numpy配列の中で最も近い値を検索する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Python interpreted model libraryによる機械学習モデル出力の可視化 Shap
-
Pythonコードの可読性を向上させるツール「pycodestyle」の使い方を詳しく解説します
-
PythonでECDSAを実装する方法 知っていますか?
-
[解決済み】ImportError: sklearn.cross_validation という名前のモジュールがない。
-
[解決済み】RuntimeWarning: 割り算で無効な値が発生しました。
-
[解決済み】pygame.error: ビデオシステムが初期化されていない
-
[解決済み】終了コード -1073741515 (0xC0000135)でプロセス終了)
-
[解決済み】「SyntaxError.Syntax」は何ですか?Missing parentheses in call to 'print'」はPythonでどういう意味ですか?
-
[解決済み] 'DataFrame' オブジェクトに 'sort' 属性がない
-
[解決済み】Flaskのテンプレートが見つからない【重複あり