前提・実現したいこと
大学の授業でpythonで回帰を勉強しております
現在解析解を使わずに勾配法を使って二次元入力の面モデルを作成しています
(年齢と体重の2つのパラメータから身長を推定する)
オーバーフローのエラーが出てわからず止まっています
どなたかご教授下さい
発生している問題・エラーメッセージ
py:151: RuntimeWarning: overflow encountered in reduce ret = umr_sum(arr, axis, dtype, out, keepdims) <ipython-input-158-b1d548afc812>:12: RuntimeWarning: invalid value encountered in double_scalars w_hist[tau,1] = w_hist[tau - 1, 1] - alpha * dmse[1]
該当のソースコード
import numpy as np import matplotlib.pyplot as plt %matplotlib inline #データ X0_n = 16 X0_min = 5 X0_max = 30 X1_min = 40 X1_max = 75 X0 = np.array([15.43, 23.01, 5.00, 12.56, 8.67, 7.31, 9.66, 13.64, 14.92, 18.47, 15.48, 22.13, 10.11, 26.95, 5.68, 21.76]) #x0(年齢) X1 = np.array([70.43, 58.15, 37.22, 56.51, 57.32, 40.84, 57.79, 56.94, 63.03, 65.69, 62.33, 64.95, 57.73, 66.89, 46.68, 61.08]) #x1(体重) #身長を抽出 import math np.random.seed(seed=1) #乱数を固定 h = 10000 * (X1 - 2 * np.random.randn(X0_n)) / 23 #hは(身長)**2のこと T = np.sqrt(h) #ルートで身長を出す X1は身長 T_min = 120 T_max = 180 print(np.round(T,2)) #小数点第2位にする #二次元データを表示 def show_data2(ax, x0, x1, t ): for i in range(len(x0)): ax.plot([x0[i], x0[i]], [x1[i], x1[i]], [120, t[i]], color='gray') ax.plot(x0, x1, t, 'o', color='cornflowerblue', markeredgecolor='black', markersize=6, markeredgewidth=0.5) ax.view_init(elev=35, azim=-75) #メイン plt.figure(figsize=(6,5)) ax = plt.subplot(1,1,1,projection='3d') show_data2(ax, X0, X1, T) plt.show() #面の表示 def show_plane(ax,w): px0 = np.linspace(X0_min, X0_max, 5) px1 = np.linspace(X1_min, X1_max, 5) px0, px1 = np.meshgrid(px0, px1) y = w[0] * px0 + w[1] * px1 + w[2] ax.plot_surface(px0, px1, y, rstride=1, cstride=1, alpha=0.3, color='blue', edgecolor='black') #面のMSE def mse_plane(x0, x1, t, w): y = w[0] * x0 + w[1] * x1 + w[2] mse = np.mean((y - t)**2) return mse #メイン plt.figure(figsize=(6,5)) ax = plt.subplot(1,1,1,projection='3d') W = [1.5, 1, 90] show_plane(ax, W) show_data2(ax, X0, X1, T) mse = mse_plane(X0 ,X1, T, W) print("SD={0:.2f} cm".format(np.sqrt(mse))) plt.show() #平均二乗誤差の勾配法 def dmse_line(x0,x1,t,w): y = w[0] * x0 + w[1] * x1 + w[2] d_w0 = 2 * np.mean((y - t)* x0) d_w1 = 2 * np.mean((y - t)* x1) d_w2 = 2 * np.mean(y - t) return d_w0, d_w1, d_w2 #以下からエラーが出ます #勾配法 def fit_line_num(x0,x1,t): w_init = [10.0, 165.0, 30.0] #初期パラメータ alpha = 0.001 #学習率 tau_max = 100000 #繰り返しの最大級 eps = 0.1 #繰り返しをやめる勾配の絶対値のしきい値 w_hist = np.zeros([tau_max,3]) w_hist[0,:] = w_init for tau in range(1, tau_max): dmse = dmse_line(x0,t,x1,w_hist[tau - 1]) w_hist[tau,0] = w_hist[tau - 1, 0] - alpha * dmse[0] w_hist[tau,1] = w_hist[tau - 1, 1] - alpha * dmse[1] w_hist[tau,2] = w_hist[tau - 1, 2] - alpha * dmse[2] if max(np.absolute(dmse)) < eps: #終了 break w0 = w_hist[tau,0] w1 = w_hist[tau,1] w2 = w_hist[tau,2] w_hist = w_hist[:tau,:] return w0, w1, w2, dmse, w_hist #勾配法呼び出し w0, w1, w2, dMSE, w_history = fit_line_num(X0,X1,T) #面の表示 def show_plane(ax,w): px0 = np.linspace(X0_min, X0_max, 5) px1 = np.linspace(X1_min, X1_max, 5) px0, px1 = np.meshgrid(px0, px1) y = w[0] * px0 + w[1] * px1 + w[2] ax.plot_surface(px0, px1, y, rstride=1, cstride=1, alpha=0.3, color='blue', edgecolor='black') #面のMSE def mse_plane(x0, x1, t, w): y = w[0] * x0 + w[1] * x1 + w[2] mse = np.mean((y - t)**2) return mse #メイン plt.figure(figsize=(6,5)) ax = plt.subplot(1,1,1,projection='3d') W = [1.5, 1, 90] print("w0={0:.1f}, w1={1:.1f}, w2={2:.1f}".format(W[0], W[1], W[2])) show_plane(ax, W) show_data2(ax, X0, X1, T) mse = mse_plane(X0 ,X1, T, W) print("SD={0:.2f} cm".format(np.sqrt(mse))) plt.show()
# 試したこと
同じようなエラーを調べたがよくわからなかったです
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。