機械学習はじめの一歩　part2  ~単回帰分析とは~

## はじめに

あけましておめでとうございます。mizutakawaterです。卒論に飽きたらこの記事を書き進めています。
少し間が空いてしまいましたが、「本当の初心者でもわかりやすい機械学習入門」の第2弾です。

前回のリンクはこちら
[機械学習はじめの一歩 ~pythonによる実装もやってみたい人へ~](https://qiita.com/mizutakawater/items/33c22c979ec932bb5e3d)

### 前回の復習
前回は「教師あり機械学習の回帰」の基礎の基礎を学びました。
復習なので簡単に振り返ってみましょう。

A~D君がいます。彼らの身長、体重は以下のようになっています。
A君: 40kg, 150cm
B君: 50kg, 160cm
C君: 60kg, 170cm
D君: 70kg, 180cm

では、体重が55kgのE君の身長は何cm(と予測できる)でしょうか。

という問題を基に考えてみましたね。


正解は以下のように__たまたま4人の分布が一直線上に並ぶ直線があって__

```
y(身長) = x(体重) + 110
```


そこに体重(前回はxとしました)55kgを代入するというものでした。

そして`この直線の式を求めること(目的関数)が教師あり機械学習の回帰のほぼゴール`ということでした。

思い出してきましたか？

### 今回のゴール

では、今回は4人の分布が一直線上にないときに、目的関数（上記でいうy = x + 110）をどうやって求めるのか？？ということを学びましょう。
これが分かれば、ある程度複雑でも__集まったデータを基に、ほしいデータを予測する__ことができるようになります！

例えば、以下のような身長、体重の4人のデータを与えられたときに、体重55kgの人の身長を予測できるようになります！

![question1](https://vps11-d.kuku.lu/files/20200107-0434_91b2bb54d0100da31b9681523dfc59e7.png)

ここに、
![question2](https://vps11-d.kuku.lu/files/20200107-0436_bb687eb0b1f95c0a9f4eae0a34151ef4.png)

こう直線が引けるようになります！！なんだかデータ分析ぽくなってきました〜

では早速やっていきましょう！！

## 実践

### 直線の式の求め方

上記で述べたような直線を引けば良いということはみなさん、直感的にはわかると思います。では、正確にこの直線の式を求めるにはどうしたら良いでしょうか。。

正解は
`各点からの直線の距離の合計が最も小さくなるように直線を引けば良い`
です！

感覚的には、__各点からの平均値を取っている__という感じに近いでしょうか。（正確な表現ではないかもしれませんが、、）

こんな感じ！

![question3](https://vps11-d.kuku.lu/files/20200107-0454_c726c3acad200ab9a7457f6baafa12e2.png)

上のグラフで

 ```
error1 + error2 + error3 + error4 = 最小値
```

となるように直線を引けばOKです。もうここまでくればただの数学ですね。
ちなみに、
error1 + error2 + error3 + error4
を`損失関数`と言い、損失関数の最小値を求めることが目的関数を求めることに繋がるということです。

wikipediaで、損失関数と調べると


>数学的最適化および決定理論では、損失関数またはコスト関数は、イベントまたは1つ以上の変数の値を、イベントに関連する「コスト」を直感的に表す実数にマッピングする関数です。最適化の問題は、損失関数を最小化しようとします。目的関数は、損失関数またはその負のいずれかであり、その場合、最大化されます。
(https://en.wikipedia.org/wiki/Loss_function)


~~やばくないですか？漏れがないように書いてくれてるんだろうけどさすがに謎すぎ~~


### 損失関数の最小値の求め方(例題)

上の例題だと少し計算が難しくなってしまいそうなので、もっと簡単な例題で考えて見ましょう。


(x, y) = (1, 2)(3, 4)(5, 5)
という点があったとして、損失関数が最小になるように下のような直線を引くときの計算を見ていきます

![question4](https://vps11-d.kuku.lu/files/20200107-0521_be2d35bd7599b9049e84b11c2d0827e6.png)

計算部分はもう数学アレルギーな人は飛ばしてもらって構いません。最後の囲みのところだけ理解してもらえればOK!


方針としては

```
①損失関数の値が最小となるようなa,bの値を求めたい
②損失関数をa, bに関して偏微分する
③その２式を連立してa,bを求める
④y = ax + bに代入する
```

では計算していきましょう！！
求めたい目的関数（直線の式）を
$$y = ax + b$$
と置きます。

上記のグラフより
e1, e2, e3と交わる直線上の点(x, y)はそれぞれ
$$(1, a+b), (3, 3a+b), (5, 5a+b)$$

なので、
$e1 = (a+b-2)^2+ (1-1)^2$
$e2 = (3a+b-4)^2+ (3-3)^2$
$e3 = (5a+b-5)^2+ (5-5)^2$

つまり
$$e1 = (a+b-2)^2$$
$$e2 = (3a+b-4)^2$$
$$e3 = (5a+b-5)^2$$

ここで、損失関数をL(a, b)とおくと、
$L(a, b) = e1 + e2 + e3
         =(a+b-2)^2 + (3a+b-4)^2 + (5a+b-5)^2$

となります。

L(a, b)をまずaについて偏微分すると
$$
\frac{∂L(a, b)}{∂a} = 2(a+b-2)×1 + 2(3a+b-4)×3 + 2(5a+b-5)×5\\
= 70a+18b-78 　・・・①
$$

次にbについて偏微分すると
$$
\frac{∂L(a, b)}{∂a} = 2(a+b-2)×1 + 2(3a+b-4)×1 + 2(5a+b-5)×1\\
= 18a+6b-22 　・・・②
$$

となるので、①、②を連立して

$$
a=0.75, b≒1.4
$$



`よって上のa, bが損失関数L(a, b)を最小にする値となります。
つまりこのa,bをx,yの係数に持つ直線が、各点(1,2)(3,4)(5,5)それぞれにもっとも近い`(←ここをしっかり理解しましょう！上の細かい計算はプログラムが勝手にやってくれます笑)

```
y = 0.75x + 1.4
```

が上の赤線の式となります。つまり、目的関数！！！

## まとめ

これで、`データ分布が一直線上にないときに、目的関数をどうやって求めるのか？？`ということが分かりました。
まとめると

```
①目的関数を設定する（y = ax + b）
②そこから損失関数(e1 + e2 + e3)を求める
③損失関数が最小となるパラメーターを求める（a, b）
④最初に設定した目的関数に代入(y = 0.75x + 1.4)
```

最初に示した、身長、体重の問題でもこれと同じように計算すれば目的関数を求めることができ、体重55kgの人の身長を予測することができます！！！

### 用語紹介
ここで、機械学習らしい単語を紹介すると、上の①~④の考えが、「教師あり機械学習」の最も基本的なアルゴリズムである`「線形単回帰」(最小二乗法)`とよばれるものです。なんだか、いかついですね
　
そして、今回は説明変数（覚えてますか?予測に使われるデータのことです）が一つだったので、これを`単回帰分析`と呼びます！(やっとでてきた今日のテーマ)

これが理解できれば、「このデータを最小二乗法で分析しといて〜」って言われたときに「任せてください！」って言えちゃいます。

これが複数の説明変数（身長と体重から50m走のタイムを予測するとか）になると`重回帰分析`(聞いたことある人いるかも）と呼ばれますが、考え方は全く同じで計算が少し複雑になるだけです。計算が複雑になっても、理屈をわかっていれば計算はコンピューターがやってくれます笑

### わかったこと
- _機械学習は単なる数学_

プログラミング、AIが近年ほぼ同時期に、同じだけ叫ばれて、機械学習をプログラミングの一種と思っている人も少なからずいるみたいですが別物でした。機械学習は数学で、それに適したものがプログラミングということですね。

## 次回
今回は理論だけで長くなってしまったので、pythonによる実装までいきませんでした。すみません、、
次回は、

- __説明変数が多いときにどうやって目的関数をもとめるか__

をプログラミングを主役にして学んでいきましょう！理屈がわかったので次回はコンピューターにガンガン計算してもらいましょう〜

ここわかりずらいとかあれば教えてくださいお待ちしております。