線形代数学習記録　#E資格

## 目次
  * [なぜ必要なの？](#なぜ必要なの？)
  * [固有値分解について](#固有値分解について)
  * [特異値分解について](#特異値分解について)
  * [ノルムについて](#ノルムについて)
  * [参考文献](#参考文献)

## なぜ必要なの？
### 結論：プログラムや数式を記述する際に代数を用いるよりも楽だから。
機械学習では、データから複数のパラメータの最適解を繰り返し計算を行うことで最適解を求める。

そのパラメータが数えるほどしか無いのならばさほど問題ないが、特に深層学習など用いるパラメータの数が数万～数億に及ぶ場合がある。

そんな時に効率よく計算を行うために登場するのが今回学ぶ __線形代数__ である。

> まだまだ理解が及んでおらず 最低限かつ間違えた情報を含んでいるかもしれない 記事ではございますがご了承ください。（正確な情報が入り次第記事を更新しようと考えております）

## 固有値分解について

正方行列が与えられたときに固有値と固有ベクトルを求める

$$ \boldsymbol{A\vec{x}} = λ\vec{x} $$　

この時、$ \vec{x} $ を $ \boldsymbol{A}$ の固有ベクトル、λを$ \boldsymbol{A}$の固有値と呼ぶ。
$ \vec{x} $は、$ \vec{0} $　ではないベクトルであり、λはスカラーである。

### やること
 - 特性（固有）方程式の形に直す
 - 固有値を求めそれぞれの固有値について固有ベクトルを求める
 - 正規化を行う

>　特性方程式：$det(\boldsymbol{A} - λ\boldsymbol{I}) = 0$

## 特異値分解について
固有値分解のアルゴリズムを任意の行列に適用できるように一般化したアルゴリズム。
特異値分解とは，$ m \times n $ 行列 $ A $ を$ A = UΣV $ に分解することである。

$ U $：$ m \times m $の直行行列
$ Σ $：非対角成分が0であり左か右にかけて値が小さくなる(0でないものを特異値である)
$ V $：$ n \times n $の直行行列

 - 条件
$\boldsymbol{A}\vec{v} = σ\vec{u} $ と$\boldsymbol{A^T} \\: \vec{v} = σ\vec{v} $を満たす
$\boldsymbol{A}$が$ m \times n $の時、特異値の数は$ min(m, n) $個
    $ |\vec{u}| = |\vec{v}| = 1 $であり、$σ > 0$とする

### やること
 - $ \boldsymbol{A}$の特異値$σ$を求める
 - 各特異値に対する左特異ベクトル$ \vec{u} $を求める
 - 各特異値に対する右特異ベクトル$ \vec{v} $を求める
 - 正規化を行う

いろいろ式変形を行い$ |\boldsymbol{A^T A - σ^2 I}|= 0 $ を満たすσを求める

そして行列$\boldsymbol{A^TA}$の固有値の平方根である$ \sqrt{λ} $が特異値σである

$ (A^T A - σ^2 I)\vec{v} = \vec{0} $もしくは$ (A A^T - σ^2 I)\vec{u} = \vec{0} $を用いて片方の特異ベクトルを導出する

$ A \vec{v} = σ \vec{u} $ もしくは $  A^T \\: \vec{v} = σ \vec{u} $を用いてもう片方の特異ベクトルを導出する。

最後に$ A = UDV^T $(特異値分解の式)に変換する
　つまり $ U = ( \vec{u_1}, \vec{u_2} ) $ と $ V = ( \vec{v_1}, \vec{v_2} ) $と

```math
∑ = \begin{pmatrix}
σ_1 & 0 \\
0 & σ_2 
\end{pmatrix}
```

と変形を行うことで特異値分解ができる。

## ノルムについて

ベクトルのノルムとは、ベクトルの「長さ」を表す数値である。ノルムは、ベクトルのサイズや大きさを計算するために使用され、ベクトルの特性を評価するためのものである。

これから $L^1$ ノルム(マンハッタン距離・1ノルム)と$L^2$ノルム（ユークリッド距離・2ノルム）と$L^∞$ノルム（最大値ノルム・∞ノルム）とマハラノビス距離とハミング距離について順番に説明していく。

### 1ノルムについて

1ノルムは、ベクトルの各成分の要素の絶対値の和として定義される

$$ ||\vec{a}||_1 = |a_1| + |a_2| + \cdots + |a_n| $$

$$ = \sum_{k=1}^{n} |a_k| $$

### 2ノルムについて

2ノルムは、高校数学でも習ったユークリッド距離のことである。

$$ ||\vec{a}||_2 = \sqrt{a^2_1 + a^2_2 + \cdots + a^2_n} $$

$$ = \sqrt{\sum_{k=1}^{n} a^2_k} $$

### ∞ノルムについて

∞ノルムでは、各成分の絶対値の最大値をノルムとします。

$$ ||\vec{a}||_\infty = max (|a_1|, |a_2|, \cdots ,|a_n|) $$

$$ = \max_{1 \leqq k \leqq n}{|a_k|} $$

### マハラノビス距離

実ベクトル$\boldsymbol{x}, \boldsymbol{y}$と、共分散行列$∑$が既知であるような同一の確率分布に従うとき

$$ D(x, y) = \sqrt{(x - y)^T ∑^{-1}(x - y)} $$

> 真ん中の$∑$は「分散共分散行列」という

で与えられる距離をマハラノビスという。同一確率分布に従うと仮定される2つのベクトルの類似度を測る。

異常検知に用いられる距離であり、相関関係を考慮して既知のサンプルとの関係を明らかにする。

### ハミング距離

ハミング距離とは文字列間の類似度の一つで、２つの文字列間のハミング距離が小さいとき、それらの文字列は似ているとされる。


ビットの違いを数えたものです。
同じ長さのビット列を比較し、値が違う箇所を数えると、それがハミング距離になります。

## おまけ
逆行列の計算方法についてふと気になり計算方法を忘れていたので解法を1つ記載しておきます。
- [掃き出し法][掃き出し]

とにかく行基本変形を繰り返し左半分の正方行列を単位行列にする。

行基本変形
1.　ある行を定数倍する
2.　2つの行を交換する
3.　ある行の定数倍を別の行に加える


## 感想
最低限問題を解けるだけの知識を身に着けることが出来たが、数学に対する理解とは程遠い段階であることを記事に書き起こしている中で痛感した。余裕ができ次第周辺知識や、使われている定理の理解に努めたい(2024/6/19)

## 参考文献

https://japan-medical-ai.github.io/medical-ai-course-materials/notebooks/01_Basic_Math_for_ML.html

https://tutorials.chainer.org/ja/03_Basic_Math_for_Machine_Learning.html

https://manabitimes.jp/math

https://zenn.dev/goals_techblog/articles/1c1eded6626c61

[掃き出し]: https://manabitimes.jp/math/1153