前提・実現したいこと
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/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー