pythonで回帰分析してみる③scipy.optimize.minimize編

この記事ではpythonを使って回帰分析する際のコードをまとめていく。いくつか方法がありそうなので、ライブラリごとに書いていければと思う。

 今回はscipy.optimize.minimize編。

curve_fitに比べるとやってることは変わらないし、手間が増えるだけなのだけれど、ある関数の最小化をするとういのは汎用性が高そうなので、一応メモ代わりに残しておく。

%matplotlib notebook
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

#データを作成
x = np.array([1, 2, 3, 4, 5])
y = np.array([2, 6, 6, 9, 6])

#近似する関数を定義
def func1(X, a, b): # 1次式近似
    Y = a + b * X
    return Y

#平均二乗誤差を計算する関数
def func_rmse(param, x, y):
    residual = y - func1(x,*param)
    rmse = np.sqrt((( residual ** 2).sum()) / len(x))
    return rmse

#scipy.optimize.minimize
import scipy.optimize as optimize
init_para = [0, 0] #最適化されるパラメータの初期値(ここでは[a, b]
mi_rmse = optimize.minimize(func_rmse, init_para, args=(x, y)) #func_rmseを最小化するparamを求める)
#結果
print("回帰係数(b)=", mi_rmse.x[1])
print("切片(a):",mi_rmse.x[0])


#予想値
x_ex = np.arange(-1, 7, 0.1)
y_ex =  mi_rmse.x[1] * x_ex + mi_rmse.x[0]

#プロット
sns.set_style("whitegrid", {'grid.linestyle':'--'})
plt.rcParams["font.family"] = 'meiryo'

fig1 = plt.figure(figsize=(3,3), facecolor='w')
ax1 = fig1.add_subplot(111)
ax1.set_xlim(-1, 7)
ax1.set_ylim(-2, 10)
ax1.set_xlabel("X",fontsize=10,fontname='meiryo')
ax1.set_ylabel("Y",fontsize=10,fontname='meiryo')

ax1.scatter(x, y, marker="o",alpha=1,edgecolors="#08699E",facecolor="#08699E", s=40) #実データ
ax1.plot(x_ex, y_ex ,'r--',color="#000000") #回帰の予想値

 

 出力はこんな感じ。

回帰係数(b)= 1.1000007555247273
切片(a): 2.4999974039619537

f:id:Chemstat:20201101171351p:plain

 

予想値を出したいときは、func1を使って計算すればよい。 

y_pred = func1(x, *mi_rmse.x)

ax1.scatter(x, y_pred, marker="o",alpha=1,edgecolors="#08699E",facecolor="#08699E", s=40) #回帰の予想値
ax1.plot(x_ex, y_ex ,'r--',color="#000000") #回帰の直線

f:id:Chemstat:20201101171636p:plain

 

 

参考

minimizeの使い方:scipyで任意の目的関数を最小化する - Qiita