線形回帰・最小二乗法について、と、その具体例

この記事では、機械学習に用いるモデルの中でも基本的な線形回帰について説明します。機械学習についてはこの記事で説明しているのでこちらも参考にして下さい。
https://qiita.com/aogyt/items/fc1afcf5eabcc016f508

#教師あり学習アルゴリズムの仕組み
本題の線形回帰に入る前に、教師あり学習アルゴリズムに関して説明しようと思います。

教師あり学習には必ず訓練セットが必要です。例えば、
![最小二乗法.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520906/f300d245-809c-0bdd-27e2-59674f58bb1a.png)
このようなデータがあるとします。このデータは学習アルゴリズムに読み込まれ、そのアルゴリズムはある関数を出力します。この関数はよく「h」と表現され、仮説関数（あるいは説明関数とも）といいます。そして、それを評価するのが目的関数です。この仮説関数と目的関数は非常に重要な概念です。といっても抽象的な概念だけでは分かりにくいので後半では具体例を見ていきます。


#線形回帰・最小二乗法とは
今回使うモデルは線形回帰です。線形回帰とは、多数のデータの特徴を線形的に（つまり直線によって）表し、未知のデータを与えられたときに推測するためのモデルのことを言います。線形回帰の中の具体的な方法の１つに最小二乗法というものがあります。

まずここにデータがあります。
![最小二乗法.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520906/f300d245-809c-0bdd-27e2-59674f58bb1a.png)
そして、最終目標は
![最小二乗法.1png.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520906/05f55e3e-55d2-f53b-f97d-5462260dbf52.png)
このように、データの特徴を最もよく表した直線の式を求めることです。その為には、どういう直線が「特徴を最もよく表しているのか」を評価する基準のようなものが必要です。それを今から説明します。
まず、ある１つのデータ（点）に注目します。写真でいうと緑色の点です。
![最小二乗法.3png.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520906/496824ef-bd2b-13f8-ef19-826d7af8a8a2.png)
この点の座標を(x,y)とします。この時、赤色の直線は「xのときのｙの値はh(x)くらいじゃないかな？」と予想しています。実際の値はyなので、誤差が h(x)-y だけあることになります。
![関数3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520906/bb9e6d9b-7ec7-ecb9-3614-9037f82fd931.png)
つまりこの誤差がすべての点で小さくなるように直線をとれば、それは「特徴を最もよく表している」と言えるでしょう。ということで、この誤差の総和をとって、、、と
したいところですが、ここで問題が１つ発生します。この直線の予想よりも大きいときと小さいときの誤差をそのまま足してしまうと正しい誤差を見ることが出来なくなってしまいます。もともと誤差が小さいのか、+と-で打ち消されて小さくなったのか区別がつかないからです。そこで、誤差の２乗の和で評価しようというのが、最小二乗法です。「二乗」を「最小」にする方法ということですね。

直線の式が、

![関数１.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520906/04c274fe-1d83-a54c-a222-79f604516bb9.png)
で与えられているとき、直線の予想の値と実際の値の誤差は、

![関数3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520906/bb9e6d9b-7ec7-ecb9-3614-9037f82fd931.png)
となり、その２乗の総和をとるので

![関数２.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520906/875f534e-3c64-af78-6dbb-157ab5ce5532.png)
という形になります。なお、(1/2m)という係数がついていますが、とりあえず今は気にしなくてもよいです。ただ、mはデータの個数を表しているということは覚えておいてください。これで線形回帰、最小二乗法について分かって頂けたかと思います。

#仮説関数と目的関数
さて、仮説関数と目的関数については最初に言いましたが、最小二乗法について説明したところでもう一度触れたいと思います。
###仮説関数
仮説関数は線形回帰で言うとそれぞれの直線の式です。
![関数１.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520906/82a72d83-e0d9-464e-e332-9e3a3e934521.png)

###目的関数
また、目的関数は最小二乗法の説明で出てきた、誤差を評価する関数です。
![関数２.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520906/2b5a02d3-297a-5908-1d65-7479855b8d92.png)

今回は目的関数が大きければ大きいほど誤差（の２乗）の総和が大きいということになるので、今回の目的は目的関数の最小値を求めること、と言い換えることが出来るでしょう。

#具体例
ではここからは実際のデータに基づいて直線を求めてみましょう。次のデータは与えられたx,yのデータです。
![キャプチャ1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520906/4f68063a-88f9-c666-5de9-eef49d181248.png)
(x,y)=(1,1),(2,2),(3,3)に点があります。仮説関数は h(θ)=θx とします。

θ=1 のとき

x=1の誤差は0、x=2の誤差は0、x=3の時の誤差は0、これらの2乗の総和は0、これを2mで割ると 0 となります。２乗の和は必ず0以上になりますから、θ=1 のときに目的関数は最小値をとることになりそうです（自明なように見えるかもしれませんが、このようなプロセスは理解いただけたと思います）。

θ=0 のとき

x=1の誤差は1、x=2の誤差は2、x=3の時の誤差は3、これらの2乗の総和は14、これを2m(=6)で割ると 
 2.3 となります。

θ=3 のとき

x=1の誤差は2、x=2の誤差は4、x=6の時の誤差は3、これらの2乗の総和は56、これを2m(=6)で割ると 
 9.3 となります。

これを様々なθで計算をしてプロットしたものが次の図です。

![キャプチャ2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520906/32fc0112-1180-9e5d-19ef-d16e9f715858.png)

横軸はθ、縦軸はJ(θ)を表しています。これこそ、目的関数のグラフです。これを見ても、θ=1 が最適であることは分かりますね。

以上のことから、 y=x はこのデータをよく表しているということが分かりました。