最小二乗法とは、誤差の2乗の合計を最小にする方法
最小二乗法(さいしょうにじょうほう)とは、点の集まりにいちばんよく合う直線を、予測の誤差の2乗の平均が最小になるように決める方法です。回帰直線を求める、基本の考え方です。
勉強時間と小テストの点のように、2つの数の関係を直線で言い表せると、まだ測っていない時間の点を予想できます。
このレッスンのゴール
メモ
誤差の2乗の平均を最小にして、点の集まりに直線を当てはめることができる。
キーワード
| ことば | いみ | れい |
|---|---|---|
| 誤差 | 実際の値から、直線の予測を引いた値 | |
| 平均二乗誤差 | 誤差を2乗して、その平均を取った値 | |
| 傾き | 直線の m。x が1増えたときの y の増え方 | m = 1.4 |
| 切片 | 直線の b。x が 0 のときの y の値 | b = 1.5 |
| 最小二乗法 | 平均二乗誤差が最小になる直線を選ぶ方法 |
学生が入力するセルは、このプレビューでは空白です。
誤差は2乗して平均を取る
4人の勉強時間(時間)と、小テストの点(10点満点)が、(1, 3)、(2, 4)、(3, 6)、(4, 7) とします。直線 y = m × x + b が、どれだけ合うかを測ります。
各人の誤差は「実際の点 − 予測」です。プラスとマイナスが打ち消し合わないように、2乗してから平均を取ります。これが平均二乗誤差です。
例: 3本の直線の平均二乗誤差
| 直線 | 4人の予測 | 誤差の2乗 | 平均二乗誤差 |
|---|---|---|---|
| y = 0 | 0、0、0、0 | 9、16、36、49 | 27.5 |
| y = x + 1 | 2、3、4、5 | 1、1、4、4 | 2.5 |
| y = 1.4x + 1.5 | 2.9、4.3、5.7、7.1 | 0.01、0.09、0.09、0.01 | 0.05 |
学生が入力するセルは、このプレビューでは空白です。
直線 y = x + 1 の誤差を確かめる
docker exec jupyter python3 -c "print(((3 - 2) ** 2 + (4 - 3) ** 2 + (6 - 4) ** 2 + (7 - 5) ** 2) / 4)"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
傾きと切片を勾配降下法で決める
平均二乗誤差は、m と b の2つの変数の関数です。前の回の勾配降下法を、そのまま使えます。m と b の偏微分は、それぞれ 2 × 誤差 × x の平均と、2 × 誤差の平均です。
m = 0、b = 0 から始め、学習率 0.05 で何度も更新します。誤差は、更新のたびに急に減ります。
例: 最初の3回の更新(学習率 0.05)
| 回 | 更新後の m | 更新後の b | 平均二乗誤差 |
|---|---|---|---|
| 1 | 1.425 | 0.5 | 0.9297 |
| 2 | 1.6562 | 0.5938 | 0.2026 |
| 3 | 1.6906 | 0.6203 | 0.179 |
学生が入力するセルは、このプレビューでは空白です。
勾配降下法で直線を当てはめる
# 勉強時間と小テスト(10点満点)の4人分です。
xs = [1, 2, 3, 4]
ys = [3, 4, 6, 7]
m = 0.0
b = 0.0
rate = 0.05
for step in range(1, 2001):
dm = 0.0
db = 0.0
for i in range(len(xs)):
error = m * xs[i] + b - ys[i]
dm = dm + 2 * error * xs[i] / len(xs)
db = db + 2 * error / len(xs)
m = m - rate * dm
b = b - rate * db
if step == 1 or step == 3 or step == 100 or step == 2000:
print("回", step, "傾き m =", round(m, 3), "切片 b =", round(b, 3))
# ys の 7 を 9 に変えて、傾きがどう変わるか見てください。
公式でも同じ直線が求まる
この問題は、公式でも解けます。傾きは「(x − xの平均) × (y − yの平均) の合計」を「(x − xの平均) の2乗の合計」で割ります。切片は、y の平均 − 傾き × x の平均です。
この例では 7 ÷ 5 で、傾きは 1.4、切片は 5 − 1.4 × 2.5 で 1.5 です。勾配降下法の行き先と一致します。
例: 公式の計算
| x | y | x − 2.5 | y − 5 | 2つの積 | x − 2.5 の2乗 |
|---|---|---|---|---|---|
| 1 | 3 | −1.5 | −2 | 3 | 2.25 |
| 2 | 4 | −0.5 | −1 | 0.5 | 0.25 |
| 3 | 6 | 0.5 | 1 | 0.5 | 0.25 |
| 4 | 7 | 1.5 | 2 | 3 | 2.25 |
| 合計 | 7 | 5 |
学生が入力するセルは、このプレビューでは空白です。
NumPy の最小二乗法と比べる
docker exec jupyter python3 -c "import numpy as np; print(np.polyfit([1, 2, 3, 4], [3, 4, 6, 7], 1).round(3))"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
よくある間違い
注意
誤差は、そのまま足せばよいと考えがちです。+1 と −1 の誤差は、足すと 0 になり、悪い直線でも合っているように見えます。2乗してから平均を取れば、誤差は打ち消し合いません。