機械学習

最小二乗法をPythonで理解

こんにちは、チズチズです!

最小二乗法について、自分なりにまとめてみます。

僕が実装した方法は完璧な計算ではなくて勾配降下法も混じってるようなものですが、今はそうします。

最小二乗法って何?

最小二乗法は、測定で得られた数値の組を、適当なモデルから想定される1次関数、対数曲線など特定の関数を用いて近似するときに、想定する関数が測定値に対してよい近似となるように、残差の二乗和を最小とするような係数を決定する方法、あるいはそのような方法によって近似を行うことである。

(参照wikipedia

関数を用いて残差の二乗和を最小にする値、又は近似値を目的としています。

下では、1次関数を用いて残差の二乗和を最小にする近似値を求めます。

ここでは、原点を通る比例のグラフなので多分簡単に理解できると思います。

例えば、$$f(x)=wx$$ のときを考えてみましょう。

※w(重み)ではなくw(傾き)です。間違えました。

徐々に傾きを変化させ、誤差が最小になるところの傾きを取り入れれば良いモデルを作ることが出来ますよね。

上の絵を見ていただくとわかると思いますが、何をしているかっていうと微分して0(傾きが0)になるところを求めたいってところです。

ここで注意してほしいのが、必ず微分して0になる点が最小というわけではないということです。3次関数、4次関数等は微分して0になるところはいくつかあります。

ここでは、2次関数なので良いのですが理解を間違えると痛い目に遭います。

超簡単に書いてみる

こんなデータがあったとします。では早速書いてみましょう。

誤差関数は

\[ error(x) = \sum_{i=0}^n (y_i – \hat{y}_i)^2 \]

と定義します。ここでの
$$\hat{y}=実測値$$
とします。

誤差が小さければ更新のようにしただけです。

tgd(train, y_train)を実行すると

となり、傾きが1.15のとき最小になるとわかりました。

誤差と傾きの関係をグラフにしてみると

やはり二次関数のような双曲線?を描いています。

約1.5のときが最小になるとわかりました。

差の総和は23.7…… データは5つあるから1つあたり約4.7くらいですか。

散布図の中に回帰直線を入れてみました。良いですね……

問題点

  • 設定してグラフ見てまた設定し直さなければいけない手間がかかる
  • パラメータ次第で精度が変わる
  • 計算量が多い
  • 比例のグラフでは精度低い

まずは精度的な問題ですが、

$$y=bx+a$$

このような1次関数を使えば精度は上がるでしょう。

そのために、データを標準化させて上の式に当てはめてb(傾き)を求めてまた上のような式でaを求める方法を使えば出来ます。

ですが、今は原理を覚えることが目的なのでやりません。

計算量ですが、これに関しては偏微分を使ってちゃんと計算すればちゃちゃっと出来ます。(追記

まとめ

最小二乗法は

\[ error(x) = \sum_{i=0}^n (y_i – \hat{y}_i)^2 \]

が最小になるようなwを見つけることが目的。

実装としてはとても簡単にできます。

怠惰にループ回して最小値求めるだけで実装できます。

追記:微分のすゝめ

僕の脳では到底理解が追いつきませんでした。

最小二乗法の基礎を丁寧に

偏微分からの連立方程式……逆行列……

理解できなかったのでURLだけ貼っておきます。(いずれ戻ってくる宣言

最小二乗法のアルゴリズムを理解したのでメモ。そしてPythonで書いてみた。

こちらでは、1次関数だけではなく一般化してあるものが紹介されています。

二次関数、三次関数……にも対応しています。

こちらも微分を使っています。

グラフのコード

上が誤差と傾きの関係のグラフで、下が回帰直線と散布図のグラフです。

シンプルに書きました。(応用が効かないだけ

 

お読み頂きありがとうございました!

COMMENT

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です