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

回帰とは

回帰とは得られたデータ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します。

シンプルなデータの作成

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

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

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

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

重回帰の実行

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

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

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

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

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

ソースコードの全体像

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

最小二乗法とは

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

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

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

二乗誤差

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

数式で表すと、

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

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

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

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

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

二乗誤差の微分

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

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

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

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

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

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