線形回帰の重み調整の方法 ~ 線形であるとはどういうこと？ ~

# 線形回帰の種類と重み調整の手法

:::note warn
:warning: 注意 :warning: 
本記事は独学での理解をアウトプットしたもので理論の理解が正しいことは保証できません。もし誤りがあればコメントや訂正PRを投げていただけると幸いです。
:::

## 導入

前回のLT発表で線形回帰のLasso回帰、Rdige回帰についての発表があったが、それらの線形回帰の重み（係数）の調整方法について詳しく理解していないので調査し、係数調整の手法について理解する。

### 対象読者

- 線形回帰の全体像を掴みたい方
- 線形回帰の重み調整について理解したい方

## 線形回帰とは？

一応線形回帰の前提についてもお話しします。
かなり確立された手法なので他の記事で詳細に説明されているため、詳しくは他記事を参照いただきたく思います。

### 線形であるとは？

よく線形回帰は線形であると聞きますが、イマイチ100%理解というような感じではないので厳密に確認してみます。

主にはこちらの記事を参考にさせていただきました。

https://ja.wikipedia.org/wiki/%E7%B7%9A%E5%9E%8B%E6%80%A7

https://www.iwanttobeacat.com/entry/2018/04/29/095125

まず、線形である条件があります。

線形関数の性質：
1. 加法性（かほうせい）: $f(x+y) = f(x)+f(y)$
1. 斉次性（せいじせい）: $f(αx) = αf(x)$

#### 1. 加法性（かほうせい）

:::note info
任意の $x$, $y$ に対して $f(x + y) = f(x) + f(y)$
:::


#### 2. 斉次性（せいじせい）

:::note info
作用との可換性）: 任意の $x$, $\alpha$ に対して $f(\alpha x) = \alpha f(x)$
:::

#### 非線形の具体例

 - 多項式関係
     - 二次関数・三次関数など
         - 二次関数：$y = ax^2 + bx + c$, 
         - 三次関数：$y = ax^3 + bx^2 + cx + d$
 - 対数関係
     - $y = a \log{x} + b$
 - 指数関係
     - $y = ax^{bx}$
 - べき乗則関係
     - $y = ax^b$
 - 三角関数関係
     - $y = a \sin{(x)} + b \cos{(x)}$
 - ステップ関数や階段関数
     - ある特定の閾値で従属変数が急激に変化する関係
 - ロジスティック/シグモイド関数
     - 成長モデルや確率モデルでよく使用される、S字型の曲線を示す関数
     - $y = \frac{1}{1 + e^{-x}}$

#### 上記の各種非線形関係が線形ではない証明

上記の非線形の関係のものが何故線形ではないかのロジックを示す。

##### 多項式関係が線形ではない証明

:writing_hand: 加法性（かほうせい）: $f(x+y) = f(x)+f(y)$

$f(x) = x^2を考える$

- $f(x+y) = (x + y)^2 = x^2 + 2xy + y^2$
- $f(x) + f(y) = x^2 + y^2$

よって、
$f(x+y) \neq f(x)+f(y)$

このため、加法性を満たさない。

:writing_hand: 斉次性（せいじせい）: $f(αx) = αf(x)$

$f(x) = x^2を考える$

- $f(\alpha x) = \alpha ^2 x^2$となる。
- $\alpha  f(x) = \alpha  x^2 $

よって、
$\alpha f(x) \neq \alpha x^2$

このため、斉次性を満たさない。

##### 対数関係が線形ではない証明

対数の加法性は以下のように公式化されています。
明らかですが、加法性を満たしていないので線形ではありません。

対数加法定理: 
$$
\log {xy} = log{x} + log(y)
$$

これにより加法性・斉次性どちらも満たさないため、線形ではない。　

##### 指数関係が線形ではない証明

:writing_hand: 法性（かほうせい）: $f(x+y) = f(x)+f(y)$

$f(x) = e^x$ を考える。

- $f(x+y) = e^{x+y}$
- $f(x) + f(y) = e^x + e^y$

よって、
$f(x+y) \neq f(x)+f(y)$

このため、加法性を満たさない。

:writing_hand: 斉次性（せいじせい）: $f(αx) = αf(x)$

$f(x) = e^x$ を考える。

- $\alpha f(x) =  \alpha e^{x}$

- $f(\alpha x) =  e^{\alpha x}$

よって、
$\alpha f(x) \neq \alpha x^2$

このため、斉次性を満たさない。

##### べき乗則が線形ではない証明

:writing_hand: 法性（かほうせい）: $f(x+y) = f(x)+f(y)$

$f(x) = x^b (bはxに依存しない定数)$

- $f(x + y) = (x + y)^b$
- $f(x) + f(y) = x^b + y^b$

よって、
$f(x+y) \neq f(x)+f(y)$

このため、加法性を満たさない。

:writing_hand: 斉次性（せいじせい）: $f(αx) = αf(x)$

$f(x) = x^b (bはxに依存しない定数)$

- $f(\alpha x) = (\alpha x)^b$
- $\alpha f(x) = \alpha x^b$

よって、
$\alpha f(x) \neq \alpha x^2$

このため、斉次性を満たさない。

##### 三角関数関係が線形ではない証明

:writing_hand: 法性（かほうせい）: $f(x+y) = f(x)+f(y)$

- $f(x + y) = $
- $f(x) + f(y) = $

よって、
$f(x+y) \neq f(x)+f(y)$

このため、加法性を満たさない。


:writing_hand: 斉次性（せいじせい）: $f(αx) = αf(x)$

- $f(\alpha x) = $
- $\alpha f(x) = $

よって、
$\alpha f(x) \neq \alpha x^2$

このため、斉次性を満たさない。


##### ステップ関数や階段関数が線形ではない証明

単位ステップ関数
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381710/bd2fa2ca-15a1-134a-784b-ffbe075d00dc.png)

```math

u(x) = 
\begin{cases} 
0 & \text{if } x < 0 \\
1 & \text{if } x \geq 0 
\end{cases}
```

:writing_hand: 法性（かほうせい）: $f(x+y) = f(x)+f(y)$

ステップ関数は入力の和に対して非連続です。
ステップ関数は条件によっては加法性が成り立つ場合がありますが、すべての条件について成り立つわけではありません。

x = -3
y = 2
と考えた時、

- $f(x + y) = f(-1) = 0 $
- $f(x) + f(y) = f(-3) + f(2) = 1 $

よって、
$f(x+y) \neq f(x)+f(y)$

このため、加法性を満たさない。

:writing_hand: 斉次性（せいじせい）: $f(αx) = αf(x)$

$x = 1$
$\alpha = 2$

を考える

- $f(1 * 2) = f(2) = 1$
- $2f(1) = 2 * 1 = 2$

よって、
$\alpha f(x) \neq \alpha x^2$

このため、斉次性を満たさない。

##### ロジスティック・シグモイド関数が線形ではない証明

:writing_hand: 法性（かほうせい）: $f(x+y) = f(x)+f(y)$

- $f(x + y) =  f(0 + 0) = f(0) = \frac{1}{1 + e^{-0}} = \frac{1}{1 + 1} = \frac{1}{2}$
- $f(x) + f(y) = f(0) + f(0) = \frac{1}{2} + \frac{1}{2} = 1$

よって、
$f(x+y) \neq f(x)+f(y)$

このため、加法性を満たさない。

:writing_hand: 斉次性（せいじせい）: $f(αx) = αf(x)$

- $f(\alpha x) = f(2 \cdot 0) = f(0) = \frac{1}{2}$
- $\alpha f(x) = 2f(0) = 2 \cdot \frac{1}{2} = 1$

よって、
$\alpha f(x) \neq \alpha x^2$

このため、斉次性を満たさない。

### 線形回帰の種類

線形についてわかったところで次にどのような線形回帰の種類があるかをみてみましょう。

- 単純線形回帰（Simple Linear Regression）
- 重回帰分析（Multiple Linear Regression）
- ポリノミアル回帰（Polynomial Regression）
- リッジ回帰（Ridge Regression）
- ラッソ回帰（Lasso Regression）
- 弾性ネット回帰（Elastic Net Regression）

[前回の記事](https://qiita.com/vit_nakajin/private/71d2272788675a82132e)で紹介されていたリッジ回帰、ラッソ回帰はコスト関数に正則化項を追加することによって過学習を防ぐ方法だったので今回の重みの調整には出てきません。

重みの調整については単純線形回帰や重回帰分析で利用される「正規方程式」と「勾配降下法」になります。

## 線形回帰の重み調整

線形回帰の重みの調整には主に２種類の手法があり、「正規方程式」と「勾配降下法」によって計算される。

正規方程式は、損失関数を偏微分によって微分した値が0になる地点を求めることで一発で最適な重さを導出できる。
一方、取り掛かれるやデータの数が多くなるとその分計算量が増加するため最適解を出力するのが困難になってしまいます。

その欠点を補ったのが勾配降下法です。
勾配降下法では、ある地点の微分した値から、次に重さを調整すべきポイントを学習率を学習率分更新して、最適な重さに到達するまで

### 正規方程式

https://datawokagaku.com/normal_equation/

正規方程式についてはこちらの記事にかなーーーーり詳しく記載されていたので、この記事を読んだ方が早いが要約すると

損失関数（二乗和誤差）が最小になるポイントを微分を用いて計算して最適な重さを計算する。

二乗和誤差（MSE）

```math
L(\theta)=MSE=\frac{1}{m}\sum^{m}_{i=1}(y_i-\hat{y_i})^2
```

上記の$L(\theta)$を最小にするために偏微分[^henbibun]を用いて、$L(\theta) = 0$のポイントを探す。
$L(\theta) = 0$のポイントのそれぞれの重さが最適な重さの値として線形回帰に使用される。

線形回帰で回帰予測を行う場合は一般的に複数の特徴量やデータが存在します。
それらを公立的に計算するために、線形代数の行列を利用して計算します。

複数のデータと特徴量を行列で表すと以下のようになります。

$\hat{y_i} = i番目の教師データ$
$x_{ij} = i番目のj個目の特徴量$
$\theta_i = i番目の係数（重さ）$

```math
\begin{bmatrix} 
\hat{y}_1 \\ 
\hat{y}_2 \\ 
\vdots \\ 
\hat{y}_{m-1} \\ 
\hat{y}_m \\ 
\end{bmatrix} 
= 
\begin{bmatrix} 
x_{10} & x_{11} & \cdots & x_{1n-1} & x_{1n}   \\ 
x_{20} & x_{21} & \cdots & x_{2n-1} & x_{2n}   \\ 
\vdots & \vdots & \cdots & \vdots & \vdots \\ 
x_{m-10} & x_{m-11} & \cdots & x_{m-1n-1} & x_{m-1n}   \\ 
x_{m0} & x_{m1} & \cdots & x_{mn-1} & x_{mn}   \\ 
\end{bmatrix} 
\begin{bmatrix} 
\theta_0 \\ 
\theta_1 \\ 
\vdots \\ 
\vdots \\ 
\theta_{n-1} \\ 
\theta_n \\ 
\end{bmatrix}
```

上記の行列はまとめてこのように表せる。

$$
\mathbf{\hat{y}}=\mathbf{X}\mathbf{\theta}
$$

この行列を用いて損失関数を表すと、

```math
\sum^{m}_{i=1}(y_i-\hat{y_i})^2 = (\mathbf{y}-\mathbf{X}\mathbf{\theta})^T(\mathbf{y}-\mathbf{X}\mathbf{\theta})
```

```math
= (\mathbf{y}^T-\mathbf{\theta}^T\mathbf{X}^T)(\mathbf{y}-\mathbf{X}\mathbf{\theta})
```

```math
= \mathbf{y}^T\mathbf{y} - 2\mathbf{\theta}^T\mathbf{X}^T\mathbf{y} + \mathbf{\theta}^T\mathbf{X}^T\mathbf{X}\theta
```

と表せる。
最後 $\mathbf{y}^T\mathbf{y} - 2\mathbf{\theta}^T\mathbf{X}^T\mathbf{y} +\mathbf{\theta}^T\mathbf{X}^T\mathbf{X}\theta$ の部分を$\theta$で偏微分して0になることで得られる$\theta$を考えるとこのようになる。
（この点の$\theta$が最適な重みの行列の一覧となる）

```math
\begin{align*} 
-2\mathbf{X}^T\mathbf{y}+2\mathbf{X}^T\mathbf{X}\theta=0 
\end{align*}
```

これを解くと、

```math
\theta=(\mathbf{X}^T\mathbf{X})^{-1}\mathbf{X}^T\mathbf{y}
```

となり、これが「正規方程式」と呼ばれるものです。
学習データの$\mathbf{X}$と$\mathbf{y}$をこの式に当てはめて計算してあげれば一発で最適な重みを計算することができます。


:::note info
上記の式を偏微分して0になることで得られる $\theta$ が行列となるので、その行列から各特徴量の係数（重み）が計算できる。
:::


### 勾配降下法

この記事ですべて知りたいことが書かれているので、この記事を参照すると勾配降下法が理解できると思います。

https://datawokagaku.com/gradient_descent/

勾配降下法は、ある重みの組み合わせの損失関数を微分した時に得られる傾き（勾配）から、損失関数の損失が最も少なくなるポイントに向かって徐々に学習していき、最適な重みに調整していくという手法です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381710/1cd79971-a22a-249a-59c6-4e3ae8c2d848.png)


勾配降下法の問題点：

https://zero2one.jp/ai-word/problems-in-gradient-descent-methods/#:~:text=%E5%8B%BE%E9%85%8D%E9%99%8D%E4%B8%8B%E6%B3%95%E3%81%AF%E8%AA%A4%E5%B7%AE,%E5%BC%B1%E7%82%B9%E3%82%92%E6%8A%B1%E3%81%88%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82

① 勾配が0の地点は1つだけではない可能性があるので、局所解に陥ることがある。（局所解は最適な解とはいえない）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381710/643fb409-2295-1035-9cc1-b1639eba6987.png)

②逐一勾配を計算して学習する必要があるので、学習速度が遅い。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381710/8f8d169a-d95d-7889-08e4-a49f3686dcab.png)

#### 勾配降下法の重み更新式と導出

手書きで見づらいかも・・・

勾配降下法の重み更新式：
（$\theta_0, \theta_1$の更新式）

![メモ-46.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381710/f83f1612-f01e-b65d-7504-ceabb4fcd9ea.jpeg)

<details><summary>更新式の導出：</summary>

![メモ-47.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381710/f89a79c6-1105-a4e0-fea8-9f2d4529c270.jpeg)

</details>


## 結び

- 線形についての理解を深められた（今までは単純にグラフ化した時に直線的になるものが、線形であると思っていた）
- 線形回帰の重みの調整の仕方についての理解が深められた


## 注釈
[^henbibun]: 多変数関数に関して，ある1変数のみを変数とみて，残りの変数を定数と見たときの微分を偏微分と言います。（https://mathlandscape.com/partial-derivative/）