自習メモ：【キカガク流】人工知能・機械学習 脱ブラックボックス講座 - 初級編 -（その２）

# はじめに
その２では単回帰分析の基礎について記載しています。
数学からうろ覚えの方はその１↓からご確認ください。
https://qiita.com/yuyamaga/items/2e5f26ee85dcddb24b54

# データの中心化（centering）
単回帰分析の学習の前に、機械学習する手間を少し省く手法（データの中心化）について抑えておきましょう。
データの中心化とは、ｙ軸の平均が0になるよう、すべてのデータを変更することです。
y軸の平均値がゼロになると、１次関数 y=ax+b のうち、パラメータbの値がゼロになります。
つまり、出力関数yを求めるために、パラメータa,bを求めなければならなかったのが、
パラメータaのみ求めれば良くなるのです。

具体的なデータの中心化の方法は、これから紹介しますが、
要は学習に使用するすべての値に対して、すべての値の平均値分減らすだけです。

１．まずはデータの平均を求めます（x,yそれぞれ、データの平均を求めます。）

```math
\bar x = (x_{1}+x_{2}...x_{n})/n\\
\bar y = (y_{1}+y_{2}...y_{n})/n\\
```
ちなみに、左辺ｘｙの上に書かれている横棒は平均化した値であることを指します。読み方はバー。
平均値を取得したら、以下のように全データを平均で引くことで中心化できます。

```math
x_{c} = x - \bar x\\
y_{c} = y - \bar y\\
```

# 単回帰分析
## 単回帰分析について
家賃の予測（部屋の広さをxとして入力すると、家賃がyとして出力される）のような目的で利用します。
ちなみにxyは、それぞれｘ＝入力変数、y＝出力変数と呼びます。
xは、実際には部屋の広さだけでなく、駅からの距離等考えられる対象が複数ありますが、単回帰分析の制約として、xは一つしか設定できないので、今回は部屋の広さだけを対象として考慮します。
ちなみに駅からの距離等、複数設定する場合は重回帰分析を利用します。

## 単回帰分析の回答にたどり着くためのステップ
1.学習
機械にモデル（人間が意図する結果に一番近い数式）を求めさせます。
（先程の例でいうと、部屋の広さ(x)、それに伴う家賃(y)のデータを予め機械にインプットさせ、意図する結果に近い数式（y=2x等）を求めます。）
※外挿にならないように、データの正確さよりも、種類の多いデータをインプットすることを心がけましょう。

2.推論
実際にモデルを利用し、x(広さ　等)をインプット→結果（予測値y）を出力します。

## 1.学習
Step1.モデルの決め方
例えば、x=1のときにy=2,x=2のときにy=4の場合、
xとyの関係性を考慮すると、
前者の値(ｘ) ＊　２　がyになっているので、
y=2x
という関係性を見つけて、そこから予測できます。

つまり、xとyの関係をグラフで表したとき、交点が一つの直線で表せそうだ。
　だから１次関数（y=ax+b)で予測できそうだ、と人間側でまず仮定します。
（人間側で勝手に関数を決めます。）

モデルの表現方法について、一次関数の場合は以下のように表します。

```math
\hat y = ax + b\\
```
（yの上についているのは、ハットと読みます。ハットがついていると、予測値であることを指します。）
(aとbを今回決めないといけない。aとbのことをパラメータと読みます。)

Step2.モデルで判断した結果の「正しさ」を判断する
→モデルが正しい値を出しているか判断する、評価関数（損失関数）を決めます。
　　判断基準は、自力で計算した値と、機械学習で計算した値とがなるべく近いものが正しいと判断します。
　　更に、プラスかマイナスかは関係ないので、

```math
　　→（自力で計算した値y - 機械学習で計算した値\hat y)^{2}
```
　　で計算できます。これを2乗誤差と呼びます。

　　　なぜわざわざ2乗した？
　　　２乗しなくても絶対値で計算できるのでは？とも考えられるのですが、
　　　微分は、グラフが放物線でないと計算ができないという特徴があります。
　　　絶対値の場合、計算すると値が小さくなるため、V字型の先になってうまく計算できません。
　　　なので2乗が扱いやすいです。
　　　
・　評価関数（L：エル）の求め方

``` math
L = \sum_{ｎ=1}^{n} (y_{n} - \hat y_{n})^{2}\\
右辺の計算式を、n=1から初めて、最大数nまで計算する、という意味です。つまり以下の短縮形です。 \\ 
L = (y_{1} - \hat y_{1})^{2} + (y_{2} - \hat y_{2})^{2} + ... (y_{n} - \hat y_{n})^{2}　\\
y_{1}からy_{n}まで必要なのは、機械学習の精度を高めるために、評価したい部屋の広さは一つだけではなく、どんどん積み重ねて評価していく必要があるから。 \\ 
```
※　Σの記号が、総和の意味。読み方はサムです。Σの下の値が、開始時の値、上が最後の値。for関数と同じです。

Step3.正解に最も近いパラメータaを求める
評価関数を決めただけでは、それが実際の値とどれだけ離れているか、という判断しかできません。
評価関数の結果(誤差)が最小化する(0になる)、単回帰分析：y=axの「a」の値を求めていく必要があります。（ちなみにxは入力データなので、変えられません）

``` math
L = \sum_{ｎ=1}^{n} (y_{n} - \hat y_{n})^{2}\\
Lが0になることで、評価関数の値が最小化します。（正解に最も近くなります）\\
正解に近づけるために、Lが0になるような、\hat y = axのaを求めていきます。\\
誤差を求めるために、ここで微分が登場します。\\

\frac{\partial}{\partial a}(L) = 0 \\
(※　L = \sum_{ｎ=1}^{n} (y_{n} - \hat y_{n})^{2})\\
まず、Lにはaがないので式変形を行います。\\
ちなみに予測値\hat yは、以下の式の計算結果でしたよね。\\
\hat y = ax \\
ということは、n番目の予測値の求め方は、\\
\hat y_{n} = ax_{n} \\
評価関数の式に代入すると、\\
L = \sum_{ｎ=1}^{n} (y_{n} - ax_{n})^{2}\\
右辺を展開すると、\\
L = \sum_{ｎ=1}^{n} (y_{n}^{2} - 2ax_{n}y_{n} + a^{2}x_{n}^{2})\\
計算しやすいよう、aの位置を後ろにずらすと、\\
L = \sum_{ｎ=1}^{n} (y_{n}^{2} - 2x_{n}y_{n}a + x_{n}^{2}a^{2})\\
更に式を展開すると、\\
L = \sum_{ｎ=1}^{n} y_{n}^{2} - 2(\sum_{ｎ=1}^{n}x_{n}y_{n})a + (\sum_{ｎ=1}^{n}x_{n}^{2})a^{2})\\
更に、aで微分することを考え、一時的に不要な箇所をC_{n}で置き換えると、\\
L = C_{0} - 2C_{1}a + C_{2}a^{2}\\
これで、評価関数にパラメータaがある式に変形することができました。
```

``` math
次に、微分の式に先程式変形した評価関数を代入していきましょう。\\
\frac{\partial}{\partial a}(L) = 0 \\
L = C_{0} - 2C_{1}a + C_{2}a^{2}\\
\frac{\partial}{\partial a}(C_{0} - 2C_{1}a + C_{2}a^{2})\\
更に式展開を行います。\\
\frac{\partial}{\partial a}(C_{0}) - \frac{\partial}{\partial a}(2C_{1}a) + \frac{\partial}{\partial a}(C_{2}a^{2})\\
自習メモ：【キカガク流】初級編（その1）で\frac{\partial}{\partial a}(C_{0})は0になると判明しているため、それ以外を計算していきます。\\
-2C_{1} * \frac{\partial}{\partial a}(a) + C_{2} * \frac{\partial}{\partial a}(a^{2})\\
-2C_{1} + 2aC_{2} = 0\\
式変形をすると、\\
2aC_{2} = 2C_{1}\\
aC_{2} = C_{1}\\
a = \frac{C_{1}}{C_{2}}\\
C_{1},C_{2}の値をもとに戻すと、\\
a = \frac{\sum_{ｎ=1}^{n}x_{n}y_{n}}{\sum_{ｎ=1}^{n}x_{n}^{2}}\\
これで、評価関数の中で、誤差が0になる傾きaを出力できる計算式が導かれました。\\
```

例題：
x=1のとき、y=2
x=2のとき、y=3.9
ｘ＝３のとき、y=6.1
の場合、傾きaの値はなにか。


まず、データの中心化を行い、パラメータb(切片)を0にします。

```math
\bar x = (1 + 2 + 3)/3\\
\bar x = 2\\
\bar y = (2 + 3.9 + 6.1)/3\\
\bar y = 4\\
```
すべてのデータから平均値分引いて中心化すると、
x=-1のとき、y=-2
x=０のとき、y=-0.1
ｘ＝1のとき、y=2.1
次にパラメータaを求めましょう。実際の値yと予測値yの誤差が最小となるパラメータaの計算式は以下でしたね。

```math
a = \frac{\sum_{ｎ=1}^{n}x_{n}y_{n}}{\sum_{ｎ=1}^{n}x_{n}^{2}}\\
実際にデータを代入してみましょう。\\
a = \frac{(-1 * -2)+(0 * -0.1) + (1 * 2.1)}{(-1)^{2} + (0)^{2} + (1)^{2}}\\
a = \frac{4.1}{２}\\
a = 2.05 \\
パラメータaをもとに、yを出力してみましょう。果たして例題のｙに近い値が出力されるでしょうか。
```
## 2.推論
１の学習内容を元に、家賃相場を出してみましょう。

ちなみに、パラメータaを出力するためにx,yを中心化しましたが、中心化したxからそのまま家賃相場を出そうとすると、中心化したyが出力されてしまい、求める結果になりません。
また、中心化してないxを使うことも考えられますが、パラメータaの値はデータを中心化した値をもとに出力した値のため、別途パラメータbを求めなければならなくなります。（今回は値が小さいので似た値になりますが大きくしていくとどんどん誤差が出てくる、はずです。。。。）
これは面倒なので避けたいところです。
ということでまず、今まで求めてきたy=axのうち、中心化したx,yを一旦変換前の式に戻してみましょう。

```math
\begin{align}\\
(y - \bar{y}) & = a(x - \bar x) \\
\end{align}\\
```

```math
すると、中心化する前のyを求めるためには、\\
{\bar y}を右辺に移動させれば良いことがわかります。\\
```

```math
\begin{align}\\
y & = a(x - {\bar x}) + {\bar y}\\
\end{align}\\
```

```math
これで、中心化していないyを求められるようになりました。\\
```

例えば広さxが2の場合、
y = 2.05 * (2 - 2) + 4 
y = 4

例えば広さxが３の場合、
y = 2.05 * (3 - 2) + 4 
y = 6.05