【数式をていねいに】重回帰 〜簡単な例で試す〜

回帰とは

回帰とは得られたデータxを \({\bf y}=f({\bf x})\)という関数に当てはめることを言います。
この関数のことをモデルとも言います。

例えば、以下のようなデータがあった場合、

f:id:ttt242242:20190905145606g:plain

以下のように\({\bf y}=f({\bf x})\)に当てはめることです。

f:id:ttt242242:20190905145716g:plain

そして作成したモデル\({\bf y}=f({\bf x})\)を用いて、
新しいデータ\(x_{new}\)が出た時の予測値\(y_{new}\)を算出します。

重回帰とは

入力データが多次元の場合の回帰のことを言います。

つまり入力データ\({\bf x}\)が以下のように多次元のときです。

逆に入力データが一次元の場合、単回帰と言います。

重回帰を試してみる(sklearnを用いて)

今回は入力が2つ\(x_0, x_1\)のシンプルなモデルを仮定します。

$$
\begin{aligned}
y = a x_0+ b x_1 + c
\end{aligned}
$$

まず、必要なライブラリ等をimportします。

import numpy as np
import matplotlib.pyplot as plt
from sklearn import linear_model

シンプルなデータの作成

テスト用のデータはこのモデルから出力された値に
一様乱数を加えた値とします。

$$
\begin{aligned}
y = 0.2 x_0+ 0.5 x_1 + 1.0
\end{aligned}
$$

コードとしては以下のようになります。

tx0 = np.arange(-5,5,0.2)
tx1 = np.arange(-5,5,0.2)
x0 = tx0 + np.random.randn(len(tx0))
x1 = tx1 + np.random.randn(len(tx1))

y = 0.2*x0 + 0.5*x1 + 1.0 + np.random.randn(len(x0))

どのようなデータになるかplotしてみます。

plt.figure(figsize=(6,5))
from mpl_toolkits.mplot3d import axes3d, Axes3D
plt.legend()

ax = plt.subplot(1,1,1,projection="3d")
ax.set_xlabel("x0")
ax.set_ylabel("x1")
ax.set_zlabel("y")

ax.scatter(x0, x1, y, label="datas")

重回帰の実行

scikit-learnを用いるの重回帰自体は非常に簡単に実行できます。

# データの結合。[[x0_0, x1_0], [x0_1, x1_1], ...]
x0_x1 = np.c_[x0, x1]  

# 回帰モデルの作成と実行
model = linear_model.LinearRegression()
reg = model.fit(x0_x1, y)

a = reg.coef_[0]
b = reg.coef_[1]
c = reg.intercept_

print("a:", a)
print("b:", b)
print("c:", c)

得られたパラメータはcoef_とintercept_に格納されています。出力してみます。

a: 0.15718402291219993
b: 0.5663712446368052
c: 0.8816472811124664

各変数にノイズを加えているので、元々のモデルのパラメータとは完璧に一致していませんが、けっこう良い線いっています。

まぁ得られたパラメータによって、どんな回帰直線を引けるかプロットしてましょう。

y_hat = a*tx0+b*tx1+c
ax.plot(tx0, tx1, y_hat, c="r", label="result")

うまくデータに対する回帰直線が引けていますね!

ソースコードの全体像

重回帰のパラメータの解析解を最小二乗法によってもとめる

最小二乗法とは

解析的(数学的)にパラメータを求めてみましょう。

最小二乗法とは、データ群とモデル(関数)の二乗誤差を最小にするパラメータを求める手法で、回帰問題等でよく用いられる手法です。

少し数式が多くなりますが丁寧に解説していきます。

二乗誤差

まず最小化したい二乗誤差ですが、
これは重回帰モデル(関数)と実際のデータと差(誤差)を二乗した誤差です。

数式で表すと、

二乗誤差の最小化するパラメータ

では、先程の二乗誤差を最小化するパラメータを求めてみましょう。

手順としては、以下のようになります。

  1. 二乗誤差をパラメータ𝑎, 𝑏によって微分(偏微分)し、勾配が0となる2つの方程式を得る
  2. 各パラメータを微分したことによって得られた方程式を解いて、パラメータを求める

では、最小二乗法によってパラメータを求めてみましょう。

二乗誤差の微分

まず、二乗誤差を各パラメータ\(w_i\)によって偏微分します。

各パラメータによって偏微分して得られた方程式を1つの式で表現すると、

勾配が最小となる\({\bf w}\)を求める

得られた方程式を展開して、
勾配が0となる\({\bf w}\)を求めます。
丁寧に展開していきます。

中々長かったですが、
最小二乗法によってパラメータを求めることができました。

タイトルとURLをコピーしました