質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

3039閲覧

divide by zero encountered in log2 に関連する問題を解決したい

isingandpotts

総合スコア2

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/05/27 08:52

前提・実現したいこと

RuntimeWarning: divide by zero encountered in log2
RuntimeWarning: invalid value encountered in double_scalars
を解決したい

発生している問題・エラーメッセージ

sample-kadai5.py:54: RuntimeWarning: divide by zero encountered in log2 gain = En - (-1*((Beta0/8)*((Xw0/Beta0)*np.log2(Xw0/Beta0)+(Yw0/Beta0)*np.log2(Yw0/Beta0))+(Beta1/8)*((Xw1/Beta1)*np.log2(Xw1/Beta1)+(Yw1/Beta1)*np.log2(Yw1/Beta1))+(Beta2/8)*((Xw2/Beta2)*np.log2(Xw2/Beta2)+(Yw2/Beta2)*np.log2(Yw2/Beta2)))) sample-kadai5.py:54: RuntimeWarning: invalid value encountered in double_scalars gain = En - (-1*((Beta0/8)*((Xw0/Beta0)*np.log2(Xw0/Beta0)+(Yw0/Beta0)*np.log2(Yw0/Beta0))+(Beta1/8)*((Xw1/Beta1)*np.log2(Xw1/Beta1)+(Yw1/Beta1)*np.log2(Yw1/Beta1))+(Beta2/8)*((Xw2/Beta2)*np.log2(Xw2/Beta2)+(Yw2/Beta2)*np.log2(Yw2/Beta2))))

該当のソースコード

Python3

1import numpy as np 2import pandas as pd 3 4#圧力の低を0高を1に、煙の色の白を0黒を1赤を2に、鋼の色の青を0茶を1に、状態の正常を0異常1に対応 5plantdata = pd.DataFrame(data={'pressure':[0,1,1,1,0,1,0,1],'smokec':[0,1,1,2,1,0,0,0],'steelc':[0,1,0,0,0,1,1,0],'state':[0,1,1,0,1,1,1,0]},columns=['pressure','smokec','steelc','state']) 6rg = np.zeros(3) 7 8#平均情報量を計算するためのまとまり 9x_bool = plantdata['state'] == 1 10x = x_bool.sum() 11y = 8 - x 12En = -(x/8)*np.log2(x/8)-(y/8)*np.log2(y/8) 13 14#コラムに関する情報利得と情報利得費を計算するためのまとまり 15tc = 0 16for column_name in plantdata: 17 epsilon = (10)**(-1) 18 #コラム0,1,2が何個あるか計算 19 beta_0_bool = plantdata[column_name] == 0 20 Beta0 = beta_0_bool.sum() + epsilon 21 beta_1_bool = plantdata[column_name] == 1 22 Beta1 = beta_1_bool.sum() + epsilon 23 beta_2_bool = plantdata[column_name] == 2 24 Beta2 = beta_2_bool.sum() + epsilon 25 26 #コラムをそれぞれ0,1,2に対して抽出 27 beta_0 = plantdata[plantdata[column_name] == 0] 28 beta_1 = plantdata[plantdata[column_name] == 1] 29 beta_2 = plantdata[plantdata[column_name] == 2] 30 31 #indexがばらばらになっているので揃える 32 BW0 = beta_0.reset_index(drop=True) 33 BW1 = beta_1.reset_index(drop=True) 34 BW2 = beta_2.reset_index(drop=True) 35 36 #コラムが0のものについて計算に必要な値を出す 37 Xw0_bool = BW0['state'] == 1 38 Xw0 = Xw0_bool.sum() 39 Yw0 = Beta0 - Xw0 40 41 #同様に1 42 Xw1_bool = BW1['state'] == 1 43 Xw1 = Xw1_bool.sum() 44 Yw1 = Beta1 - Xw1 45 46 #同様に2 47 Xw2_bool = BW2['state'] == 1 48 Xw2 = Xw2_bool.sum() 49 Yw2 = Beta2 - Xw2 50 51 #情報利得の計算 52 gain = En - (-1*((Beta0/8)*((Xw0/Beta0)*np.log2(Xw0/Beta0)+(Yw0/Beta0)*np.log2(Yw0/Beta0))+(Beta1/8)*((Xw1/Beta1)*np.log2(Xw1/Beta1)+(Yw1/Beta1)*np.log2(Yw1/Beta1))+(Beta2/8)*((Xw2/Beta2)*np.log2(Xw2/Beta2)+(Yw2/Beta2)*np.log2(Yw2/Beta2)))) 53 rg[tc] = gain 54 tc = tc + 1 55 56#出力 57print(En) 58print(rg) 59

試したこと

divide 0 と言われているので0で除算しないようBeta0,Beta1,Beta2にepsilonという小さな数を足しています。その結果
それぞれのBetaは0でなくなったことを確認したのですが、メッセージが変わりません。分子が0になる場合も-無限大に発散して計算できないのでしょうか。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2020/05/27 09:25 編集

np.log2の引数が0と認識されているのではないでしょうか?(Xw0/Beta0とかYw0/Beta0とか)
isingandpotts

2020/05/27 10:40

確認しましたがそのようです。ご指摘ありがとうございます。おそらくそうなのでは、とは思っていたのですが…。
guest

回答1

0

ベストアンサー

利得計算前に変数を全部printなりで書きだしてみればすぐわかりますが、Xwなんとかが0になっています。
当該箇所のlog2(0) = -INFになり、その計算過程で警告が出ます。-INFで構わないなら無視するのも手です。

投稿2020/05/27 10:06

hope_mucci

総合スコア4447

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

isingandpotts

2020/05/27 10:42

修正コメントなども頂いていましたが、ベストアンサーにさせていただきました。対数関数の挙動を忘れておりました。エラーメッセージが出るとそこにしか目がいかなくなるのは困りものですね。皆様ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問