数学やプログラミングの備忘録

数理最適化, Python, C++をメインに紹介するブログ。

MENU

(理論編)線形回帰モデルの計算方法

 n 個のサンプルデータ


(y_i, x_{i1}, \dots, x_{ip}), \ i =1,\dots,n

が与えられたとき、最小二乗法線形回帰モデル を求める方法をまとめます(いつも忘れちゃう)。

線形回帰モデル

例えば、上のサンプルデータが、 n 人の身長、体重、座高だったとして、身長の値を体重と座高を線形の式で表したいなー、ってときに、線形回帰モデルを使います。

この場合、線形回帰モデルを求めるというのは、下の線形回帰モデルの係数  \beta_{0}, \beta_1, \beta_2 を求めることに対応します。


(身長) = \beta_0 + \beta_1 (体重) + \beta_2 (座高)

 n 人のデータから、上の線形回帰モデルを1つ求めるわけだけど、一般的に  n 人のデータと求める線形回帰モデルには誤差があります。

だってそうでしょう?みんなの体重が同じ式で、ぴったり表せるわけないじゃん。

で、人はこう考えるわけさ。

「線形回帰モデルとサンプルデータとの誤差が一番小さい係数求めよ!」

これが最小二乗法のざっくりとした説明。

最小二乗法

次は、で?実際にどう求める?って話。

改めて、問題設定を書くと、、

 n 個のサンプルデータ


(y_i, x_{i1}, \dots, x_{ip}), \ i =1,\dots,n

が与えらたとき、線形回帰モデル


y = \beta_0 + \beta_1 x_1 + \cdots + \beta_{p} x_p

を求める。

まず、誤差ベクトル  \epsilon を定義する。


\begin{align}
\epsilon&=(\epsilon_1,\dots,\epsilon_n)^T \in \mathbb{R}^n\\
\epsilon_i &= y_i - (\beta_0 + \beta_{i1} x_1 + \cdots + \beta_{p} x_{ip})
\end{align}

 \epsilon i 番目の成分は、 i 番目のサンプルデータと線形回帰モデルの誤差である。

この誤差ベクトル  \epsilon の大きさ(ノルム)を最小化するのが、最小二乗法だ。誤差ベクトル  \epsilon を最小化する問題を下記の問題  (P) とする。


(P):\min_{\epsilon} \|\epsilon\|^2

今、 n 個のサンプルデータに対し、行列  X\in\mathbb{R}^{n\times (p+1)} とベクトル  y\in\mathbb{R}^n を定義する。


X=\left(\begin{array}{cccc}
1 & x_{11} & \cdots & x_{1p}\\
1 & \vdots & \ddots & \vdots \\
1 &x_{n1} & \cdots & x_{np}
\end{array}\right),\
y =\left(\begin{array}{c}
y_1\\
\vdots\\
y_n
\end{array}\right).

さらに、係数ベクトル


\beta = (\beta_0,\dots,\beta_p)^T

を定義すると、 問題  (P) は次のように書ける。


(P):\min_{\beta} \|y-X\beta\|^2

ここでは証明しないけど、目的関数


\|y-X\beta\|^2

は凸関数である。よって、微分して0となる  \beta が問題  (P) の最小解。


f(\beta)=\|y-X\beta\|^2
= \beta^TX^TX\beta - 2 y^TX\beta + y^T y

とおくと、 f の勾配ベクトルは、


\nabla f(\beta) = 2X^TX\beta -2y^TX

最小解  \tilde{\beta} は、 \nabla f(\tilde{\beta})=0 満たすので、以下の線形方程式を解けばよい。


X^TX \tilde{\beta} = y^T X

そして、係数ベクトルとして、


\tilde{\beta} = (X^T X)^{-1} y^T X

を得る。逆行列が存在する条件は、行列  X の列ベクトルが線形独立であることです。

以上、最小二乗法で線形回帰モデルを求める方法でした。