線形回帰(最小二乗法)

最終更新: 2 分で読めます このページを編集
5分で分かる最小二乗法

線形回帰(Linear Regression)は、最小二乗法を用いてデータに直線を当てはめる基本的な手法です。 観測されたデータ $(x_i, y_i)$ の関係を「できるだけよく説明する直線」を求めることを目的としています。


1. 線形回帰の数式モデル #

単回帰モデル #

入力 $x$ と出力 $y$ の関係を直線で表すと、次のようになります。

$$ y = w x + b $$

  • $w$: 傾き(係数)
  • $b$: 切片(バイアス項)

これにより「$x$ が1増えると $y$ が $w$ 増える」という解釈ができます。


2. 損失関数(残差平方和) #

直線がどれだけデータにフィットしているかを測るために、残差(観測値と予測値の差)を考えます。

$$ \epsilon_i = y_i - (w x_i + b) $$

この残差を二乗して全データで合計したものを 損失関数(残差平方和)とします。

$$ L(w, b) = \sum_{i=1}^n \big(y_i - (w x_i + b)\big)^2 $$

最小二乗法とは、この $L(w, b)$ を最小化する $w, b$ を求める方法です。


3. 解析解(解の導出) #

損失関数を $w, b$ で偏微分しゼロと置くと、次の解析解が得られます。

$$ w = \frac{\sum_{i=1}^n (x_i - \bar{x})(y_i - \bar{y})}{\sum_{i=1}^n (x_i - \bar{x})^2}, \quad b = \bar{y} - w \bar{x} $$

ここで、

  • $\bar{x} = \frac{1}{n}\sum_{i=1}^n x_i$ ($x$ の平均)
  • $\bar{y} = \frac{1}{n}\sum_{i=1}^n y_i$ ($y$ の平均)

です。

つまり、回帰直線は平均値 $(\bar{x}, \bar{y})$ を通ることがわかります。


4. Pythonによる実装例 #

scikit-learn を使うと、線形回帰を簡単に実装できます。

import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
from sklearn.linear_model import LinearRegression
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler

# データ作成
n_samples = 100
X = np.linspace(-5, 5, n_samples)[:, np.newaxis]
epsolon = np.random.normal(scale=2, size=n_samples)
y = 2 * X.ravel() + 1 + epsolon  # 真の関係: y = 2x + 1 + ノイズ

# モデル学習
lin_r = make_pipeline(StandardScaler(with_mean=False), LinearRegression()).fit(X, y)
y_pred = lin_r.predict(X)

# 可視化
plt.figure(figsize=(10, 5))
plt.scatter(X, y, marker="x", label="観測データ", c="orange")
plt.plot(X, y_pred, label="回帰直線(最小二乗法)")
plt.xlabel("$x$")
plt.ylabel("$y$")
plt.legend()
plt.show()

5. 学習結果の解釈 #

  • 傾き $w$
    • 入力 $x$ が1増えたとき、$y$ がどの程度変化するかを表す。
  • 切片 $b$
    • $x=0$ のときの $y$ の予測値。

この $w, b$ を求めることで「データの傾向」を数式で表すことができます。


6. まとめ #

  • 線形回帰は「データを直線で説明する」基本的な手法。
  • 最小二乗法で「観測値と予測値のズレ(二乗和)」を最小にする。
  • 解析的に解を導けるだけでなく、ライブラリを使えば簡単に実装できる。
  • 今後は多変量回帰や正則化(リッジ回帰・ラッソ回帰)などに拡張可能。