クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

最小二乗法で直線を当てはめる

このレッスンのあとで: 誤差の2乗の平均を最小にして、点の集まりに直線を当てはめることができる。

60分のレッスンコマンド2件JupyterLab データサイエンスラボ:pandas、Matplotlib、scikit-learn をブラウザーで

最小二乗法とは、誤差の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 = 00、0、0、09、16、36、4927.5
y = x + 12、3、4、51、1、4、42.5
y = 1.4x + 1.52.9、4.3、5.7、7.10.01、0.09、0.09、0.010.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平均二乗誤差
11.4250.50.9297
21.65620.59380.2026
31.69060.62030.179

学生が入力するセルは、このプレビューでは空白です。

勾配降下法で直線を当てはめる

コード: python
# 勉強時間と小テスト(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 です。勾配降下法の行き先と一致します。

例: 公式の計算

xyx − 2.5y − 52つの積x − 2.5 の2乗
13−1.5−232.25
24−0.5−10.50.25
360.510.50.25
471.5232.25
合計75

学生が入力するセルは、このプレビューでは空白です。

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乗してから平均を取れば、誤差は打ち消し合いません。

このラボとソースについて: JupyterLab データサイエンスラボ:pandas、Matplotlib、scikit-learn をブラウザーで

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。