- 線形回帰・最小二乗法
\hat{\beta}=\arg\min_\beta \lVert y-X\beta\rVert^2
小さな謎
僕は毎日、町工場で同じ部品を作っている。
前回、同じ条件、同じ材料でも、部品にはどうしてもばらつきが生まれることが分かった。
そして、データを眺めていて別のことに気がついた。
暑い日に作った部品は、少しだけ大きい気がする。
室温が高いほど、部品も大きくなっているのだろうか。
横軸に工場の室温、縦軸に部品の直径をとってみた。
もちろん前回知ったように、点はばらばらだった。
でも――
完全なばらばらではなかった。
室温が上がるほど、少しだけ直径が大きくなっているように見える。
僕は思った。
この点の群れを、
一本の線で表すことはできないだろうか。
数式で謎解き
散布図を見ると、点はかなりばらついている。それでも、なんとなく右上がりに見える。
この点の集まりを一本の線で表せるのだろうか?
もっとも単純なのは、こんな直線だ。
\hat{y}=b_0+b_1x
$x$ は室温、$\hat{y}$ はその室温から予測した部品の直径。「$\hat{}$」(ハット)は、ここでは予測値を表す記号だ。
$b_0$ は切片、$b_1$ は線の傾き。
傾き $b_1$ が正なら、
室温が高いほど、部品の直径も大きくなる傾向がある
という線になる。
でも、ここで問題がある。
直線なら、いくらでも引ける。
傾きが急な線も引けるし、緩やかな線も引ける。切片を変えれば、線の上下の位置も変わる。
では、どの線を選べばいいのだろう。
点と線の「ずれ」を測る
ある測定値を $(x_i,y_i)$ とする。
直線が予測する値は、
\hat{y}_i=b_0+b_1x_i
となる。
実際の値 $y_i$ と、予測値 $\hat{y}_i$ の差を、
e_i=y_i-\hat{y}_i
とする。これを残差という。
要するに、
この点は、引いた線から縦方向にどれくらい外れているか
を表した数字だ。
ならば、すべての点について、このずれをなるべく小さくする線を探せばよさそうだ。
ところが、残差をそのまま足してもうまくいかない。
線より上の点はプラス、下の点はマイナスになるので、互いに打ち消し合ってしまうからだ。
そこで、ずれを二乗してみる。
e_i^2=(y_i-\hat{y}_i)^2
二乗すれば、プラスもマイナスも0以上の値になる。
しかも、大きく外れた点ほど、その影響が大きくなる。
そして、すべての点について足し合わせる。
\sum_{i=1}^{n}(y_i-\hat{y}_i)^2
これが残差平方和だ。
この値が小さいほど、点の集まりと直線とのずれが、二乗和という基準では小さいことになる。
つまり、僕たちが探したいのは、
残差平方和が最も小さくなる一本の線
なのだ。
数式で表すと、
\min_{b_0,b_1}
\sum_{i=1}^{n}
\left[y_i-(b_0+b_1x_i)\right]^2
これが最小二乗法。
名前の通り、ずれの二乗の合計を最小にする方法だ。
こうして、ばらばらだった測定値に一本の直線を引けるようになった。
もちろん、すべての点が線の上に乗るわけではない。
それでも僕たちは、
この複雑な点の集まりを、一本の線で近似するとしたら?
と問いかけることができる。
散らばった世界を、一本の線として読んでみる。
そのための方法なのだ。
ただし、一つ気になることが残っている。
室温が高いほど、部品の直径が大きくなるように見える。
では、
室温が高くなったから、部品が大きくなったのだろうか。
それは、この一本の線だけからは分からない。
その「なぜ」は、もう少し先――第17話で因果関係を考えるときに、あらためて戻ってくることにしよう。
数式解説
最小二乗法の考え方は分かった。
では、実際にどうやって最適な傾き $b_1$ と切片 $b_0$ を求めるのだろうか。
無数の直線を一本ずつ試すわけにはいかない。
そこで、微分の登場となる。
1. 残差平方和を最小化する
先ほど求めた残差平方和を、あらためて書いてみる。
L(b_0,b_1)=
\sum_{i=1}^{n}
\left[y_i-(b_0+b_1x_i)\right]^2
この $L$ は、切片 $b_0$ と傾き $b_1$ によって決まる関数。
目標は、この $L$ を最小にすること。
そこで $b_0$ と $b_1$ について、それぞれ偏微分する。
偏微分とは、ほかの変数を固定して、一つの変数について微分すること。
まず、$b_0$ で微分すると、
\frac{\partial L}{\partial b_0}
=
-2\sum_{i=1}^{n}(y_i-b_0-b_1x_i)
同じように、$b_1$ で微分すると、
\frac{\partial L}{\partial b_1}
=
-2\sum_{i=1}^{n}x_i(y_i-b_0-b_1x_i)
それぞれを0とおく。
\frac{\partial L}{\partial b_0}=0
\frac{\partial L}{\partial b_1}=0
これは、関数が最小になる場所では、各方向の傾きが0になるという考え方。
今回の残差平方和は、$b_0,b_1$ に関する下に凸の二次関数なので、この条件から最小値を求められる。
2. 最適な傾きと切片を求める
まず、$b_0$ についての式を整理すると、
\sum_{i=1}^{n}y_i
=
nb_0+b_1\sum_{i=1}^{n}x_i
となる。
両辺を $n$ で割れば、
\bar{y}=b_0+b_1\bar{x}
ここで、$\bar{x}$ は室温の平均、$\bar{y}$ は部品直径の平均。
したがって、
切片
b_0=\bar{y}-b_1\bar{x}
が得られる。
次に、この関係を $b_1$ についての式に代入して整理すると、
傾き
b_1=
\frac{
\sum_{i=1}^{n}(x_i-\bar{x})(y_i-\bar{y})
}{
\sum_{i=1}^{n}(x_i-\bar{x})^2
}
となる。
一見複雑だが、意味を考えてみよう。
分子は、室温と部品直径が、それぞれの平均からどのように一緒に変化しているかを表している。
分母は、室温そのもののばらつきだ。
つまり、二つの値の一緒に動く度合いを、室温のばらつきで割ることで、傾きが決まる。
そして切片は、求めた直線がデータの平均点 $(\bar{x},\bar{y})$ を通るように決まる。
こうして、最適な傾きと切片を直接計算できるようになった。
※ここでは室温の測定値がすべて同じではないとする。すべて同じ場合は分母が0となり、傾きを一意に決められない。
3. 実際のデータに当てはめる
今回の町工場の15点の測定データに当てはめると、
\hat b_0 \approx 9.9311
\hat b_1 \approx 0.003302
となる。
つまり、求めた回帰直線は、
\hat{y}=9.9311+0.003302x
だ。
この式では、室温が1℃高くなると、予測される直径が約0.0033mm大きくなる。
ちなみに、切片の9.9311は室温が0℃のときの予測値だ。今回の散布図は16℃から表示しているため、図の左端の値とは異なる。
この線は、すべての測定点を正確に通るわけではない。
それでも、直線で表すという条件のもとで、残差平方和が最小となる一本なのだ。
4. 冒頭の数式に戻ろう
実は、ここまでの計算は、ベクトルと行列を使って一つの式にまとめられる。
\hat{\beta}=
\arg\min_{\beta}
\lVert y-X\beta\rVert^2
ここで、
- $\beta$:切片と傾き $(b_0,b_1)$ を並べたベクトル
- $X$:各測定について、定数1と室温を並べた行列
- $y$:部品直径の測定値を並べたベクトル
である。
$\arg\min$ は、「その値を最小にする引数(今回はパラメータ)を求める」という意味だ。
つまり、冒頭の少し難しそうな数式は、
点の集まりから、ずれの二乗和が最小となる直線を探す
という、今回の問題をまとめて表現したものだったということ。
触れるデモ
これまで作った「9通りの直線」と「最小二乗法で選ばれた直線」の図を、実際に触れるようにするデモです。
一本の線を探してみよう
基本機能
| 操作 | 表示・変化 |
|---|---|
| 切片 $b_0$ を動かす | 赤い直線が上下に動く |
| 傾き $b_1$ を動かす | 赤い直線の傾きが変わる |
| 「ずれを表示」をON | 各点と直線の間に縦線(残差)が現れる |
| スライダーを動かす | 残差平方和(RSS)がリアルタイムで変わる |
| 「最小二乗解を表示」を押す | RSSが最小となる直線へ移動する |
| 「もう一度挑戦」を押す | 初期状態に戻る |
デモの学習体験
- 第1段階:直感で探す
- 最初は点と赤い直線だけ。スライダーを動かしながら、点の集まりに合いそうな直線を探す
- 第2段階:数値で考える
- 残差を表示し、RSSを確認する
- 見た目にはよさそうでも、RSSはまだ大きいかもしれない。もっと小さくできるだろうか?
RSS=\sum_{i=1}^{n}\left[y_i-(b_0+b_1x_i)\right]^2
- 第3段階:数学の答えを見る
- 「最小二乗解を表示」ボタンを押すと、直線が最適な位置へ移動。求めた $b_0,b_1$ とRSSの最小値を表示します
- 自分で探した線と、数学的に求めた線を比べられる
See the Pen 04 by aokikenichi (@aokikenichi) on CodePen.
別分野への接続
町工場の測定データから、一本の線を見つけた。でも、最小二乗法が活躍するのは工場だけではない。
機械学習:AIも「ずれ」を小さくして学ぶ
機械学習でも、予測値と正解のずれを小さくすることが基本的な考え方の一つになっている。
例えば、ニューラルネットワークによる数値予測では、予測値と正解の差を二乗した平均二乗誤差(MSE) を損失関数に使うことがある。
損失関数
- 予測と目標値のずれを数値化する指標
- AIの学習では、損失関数の値を小さくするように、勾配降下法などを使ってパラメータを調整する
$$
MSE=\frac{1}{n}\sum_{i=1}^{n}(y_i-\hat{y}_i)^2
$$
最小二乗法とそっくり。
違うのは、一本の直線ではなく、何層ものニューラルネットワークで複雑な関係を表現できること。
そして、単純な線形回帰では公式から最適解を計算できるが、ニューラルネットワークでは一般に勾配降下法などを使ってパラメータを調整する。
「予測して、ずれを測り、ずれを小さくする」
この考え方が、現代のAIにもつながっている。
脳科学:ニューロンの反応を一本の線で読む
脳科学でも回帰分析が使われる。
例えば、光の強さを変えたとき、あるニューロンの発火頻度がどう変わるのか。
刺激の強さを $x$、発火頻度を $y$ として測定すると、やはりデータはばらつく。
そこに回帰直線を引けば、刺激の強さと神経活動の関係を定量的に捉えることができる。
もちろん、ニューロンの応答は必ずしも直線的ではない。一定以上の刺激で反応が頭打ちになることもある。
それでも、複雑な脳の働きを理解するために、まずは単純なモデルから考えてみる。
町工場でやったことと、基本的な発想は同じになる。
統計学:正規分布と最尤推定が再びつながる
実は、ここまでの連載で登場した数式ともつながっている。
第2話で学んだ最尤推定と、第3話で学んだ正規分布。
もし、直線からのずれが、平均0で分散が一定の正規分布に従い、それぞれ独立だと仮定すると、最尤推定によって求めた直線は、最小二乗法で求めた直線と一致する。
つまり、
- 最尤推定:観測されたデータが最も起こりやすいパラメータを探す
- 最小二乗法:予測と実測のずれの二乗和が最も小さいパラメータを探す
一見違う二つの考え方が、正規分布という仮定のもとで同じ答えにたどり着くのだ。
数式は、それぞれ独立して存在しているわけではない。
一本の線を引くという素朴な問題の中にも、統計学、機械学習、そして脳科学へと続く道が隠れている。
この数式が提示する「世界観」
世界は、一本の線のように整ってはいない。
同じ機械で作った部品でも、直径は少しずつ違う。室温との関係を調べてみても、測定値はあちこちに散らばっている。
それでも僕たちは、そのばらつきの中に何か傾向がないだろうかと考える。
線形回帰は、そんな複雑な世界を、たった一本の直線で表そうとする。
そして最小二乗法は、「ずれの二乗の合計が最も小さい」 という基準で、その直線を選ぶ。
でも、少し考えてみよう。
この一本の線は、もともと世界のどこかに隠れていた「正解」なのだろうか。
そうではない。
僕たちが「直線で表してみよう」と決め、「ずれの二乗で評価しよう」と決めたから、この線が選ばれたのだ。
別の曲線を選んだら? 別の評価基準を使ったら?
きっと、違う答えが出てくるだろう。
だから、線から外れた点が間違っているわけではない。一本の線では表現しきれないものが、そこに残っているのだ。
数式は、世界そのものではない。世界を理解するために、僕たちが作った模型なのだ。
けれど、模型だからこそ役に立つ(のかも)。
複雑な現実から、今知りたい特徴だけを取り出すことができる。予測したり、比較したり、新しい問いを生み出したりできる。
大切なのは、一本の線が引けたことだけではない。
なぜその線を選んだのか。そして、その線では何が見えなくなっているのか。
それを忘れなければ、たった一本の線でも、世界を少し深く読むことができる。
僕はまた一つ、世界の見方を手に入れた。
- 構成案、文案、デモ生成、内容チェックなどにChatGPT 6.0 Solを用いております
- ただ文章自体は本記事著者、青木が手直ししております



