機械学習で用いる行列の単語を整理した①(固有値、直行行列、正規直交基底等)

機械学習で用いる行列の単語を整理した② (分散共分散行列、相関行列等)
https://qiita.com/harmegiddo/private/09e5ec2dc1f0bdb7e1e9

## 固有値・固有ベクトル
$n$次正方行列の$A$が与えられた時、以下の条件を満たすスカラー$\lambda$とベクトル$\overrightarrow {x}$が存在する場合において、
$\lambda$を$A$の固有値、$\overrightarrow {x}$を$\lambda$の固有ベクトルという。

``` math
A\overrightarrow {x}=\lambda\overrightarrow {x}
\ (\overrightarrow {x}\neq \overrightarrow {0})
```

<b>約まるところ、$\overrightarrow {x}$によって$A$を線形変換(行列式)したときに、
$A$の向きが変わらず、大きさのみ変わるということである。</b>

$\overrightarrow {x}$は向きを変えずに線形変換できるベクトルである。
$\lambda$は線形変換後のスケール量である。

求め方は単純で、まず固有値を求めるため固有方程式(特性方程式ともいう)を以下に従い解く。

``` math
det(A-\lambda E)=0
```

次に、得られた固有値から固有ベクトルを次式で求める。

```math
(A-\lambda E)\overrightarrow {x}=\overrightarrow {0}
```

### 計算
$A$を定義

``` math
A=
\begin{bmatrix}
5 & 1 \\
6 & 4
\end{bmatrix}
```

次に固有方程式を解く。

``` math
A-\lambda E=det
\begin{bmatrix}
5 - \lambda & 1 \\
6 & 4- \lambda
\end{bmatrix}
=(5 - \lambda)(4- \lambda) - 6 = 0
```

よって、固有値$\lambda = 2, 7$が求まった。次に固有ベクトルを求める。

$\lambda = 2$　の場合

``` math
\begin{bmatrix}
5 - 2 & 1 \\
6 & 4 - 2
\end{bmatrix}
\begin{bmatrix}
x_1 \\
x_2
\end{bmatrix}
=\begin{bmatrix}
0 \\
0
\end{bmatrix}
```

``` math
\begin{bmatrix}
x_1 \\
x_2
\end{bmatrix}
=\begin{bmatrix}
1 \\
-3
\end{bmatrix}
```

$\lambda = 7$　の場合

``` math
\begin{bmatrix}
5 - 7 & 1 \\
6 & 4 - 7
\end{bmatrix}
\begin{bmatrix}
x_1 \\
x_2
\end{bmatrix}
=\begin{bmatrix}
0 \\
0
\end{bmatrix}
```

``` math
\begin{bmatrix}
x_1 \\
x_2
\end{bmatrix}
=\begin{bmatrix}
1 \\
2
\end{bmatrix}
```

これから、行列$\begin{bmatrix}5 & 1 \\\\ 6 & 4 \end{bmatrix}$による線形変換で向きが変わらない固有ベクトルが$\begin{bmatrix} 1 \\\\ -3\end{bmatrix}$と$\begin{bmatrix} 1 \\\\ 2\end{bmatrix}$の2つあることが分かった。

それぞれ固有値は$\lambda = 2$及び$\lambda = -7$である。

最後に特性の確認をしておく。

固有ベクトルはスカラー倍しても、計算結果は固有値倍になる。
例えば、求めた固有値$\lambda=2$及び固有ベクトル$\overrightarrow {x}=\begin{bmatrix} 1 \\\\ -3\end{bmatrix}$を用いて、
$t=3$として、$3\begin{bmatrix} 1 \\\\ -3\end{bmatrix}=\begin{bmatrix} 3 \\\\ -9\end{bmatrix}$を平行なベクトル$A$で行列式を計算する。

$t=1$の場合

``` math
\begin{bmatrix}
5 & 1 \\
6 & 4
\end{bmatrix}
\begin{bmatrix}
1 \\
-3
\end{bmatrix}
=\begin{bmatrix}
2 \\
-6
\end{bmatrix}
```

$t=3$の場合

``` math
\begin{bmatrix}
5 & 1 \\
6 & 4
\end{bmatrix}
\begin{bmatrix}
3 \\
-9
\end{bmatrix}
=\begin{bmatrix}
6 \\
-18
\end{bmatrix}
```

両方の計算結果とも$\overrightarrow {x}$が固有値の$\lambda=2$倍されていることが確認できた。



## 直行行列
実正方行列($n×n$)の$U$に対して以下5つの条件を全て満たすもの。
(5つの条件は同値であるため、1つを満たせば全てを満たしていることとなる)

・$U^T = U^{-1}$
・$U$の$n$本の行ベクトルが正規直行基底を成す
・$U$の$n$本の列ベクトルが正規直行基底を成す
・任意の$x\in \mathbb{R}^n$に対して、$\left\| Ux\right\| =\left\| x\right\|$を満たす
・任意の$x, y\in \mathbb{R}^n$に対して、$U_xU_y = xy$を満たす

正則の性質を持つので1行目は$A^{-1}A=A^{T}A=E$が成り立つ。
ここで$E$は単位行列である。

複素正方行列をユニタリー行列という。

以下の置換行列等が直行行列の例である。

``` math
A=\begin{bmatrix} 
0 & 1 & 0 \\
1 & 0 & 0 \\
0 & 0 & 1 \\
\end{bmatrix}
```

実際にプログラムで試したら分かるが、すべての条件を満たしている。



## 正規直交基底
行列の各ベクトルが互いに影響せず、かつ長さが1になるもので、逆行列を計算できるもの。

以下3つのの条件を全て満たすもの。
・正規: それぞれの長さが1である
・直交: 互いに直交している(内積が0)
・基底: 正則であるか

### 計算
正規直交基底か確認するAを定義する。

``` math
A=\begin{bmatrix} 
\dfrac {1}{\sqrt {2}}& \dfrac {1}{\sqrt {2}} & 0 \\
\dfrac {1}{\sqrt {2}}& -\dfrac {1}{\sqrt {2}} & 0 \\
 0                   & 0                      & 1 \\
\end{bmatrix}
```

正規: L2 Normが1か確認する。

``` math
\overrightarrow {\left| A\left[ 0 \right] \right| }
=\sqrt {\left( \dfrac {1}{\sqrt {2}}\right)^{2} + \left( \dfrac {1}{\sqrt {2}}\right) ^{2}}
=1
```

``` math
\overrightarrow {\left| A\left[ 1 \right] \right| }
=\sqrt {\left( \dfrac {1}{\sqrt {2}}\right)^{2} + \left(- \dfrac {1}{\sqrt {2}}\right) ^{2}}
=1
```

``` math
\overrightarrow {\left| A\left[ 2 \right] \right| }
=\sqrt {\left(0\right)^{2} + \left(0\right)^{2} + \left(1\right)^{2} }
=1
```

直交: 内積を計算して0になっているか

``` math
\overrightarrow {\left| A\left[ 0 \right] \right| } \cdot \overrightarrow {\left| A\left[ 1 \right] \right| } 
=\overrightarrow {\left| A\left[ 0 \right] \right| } \cdot \overrightarrow {\left| A\left[ 2 \right] \right| } 
=\overrightarrow {\left| A\left[ 2 \right] \right| } \cdot \overrightarrow {\left| A\left[ 3 \right] \right| } 
= 0
```

基底: 正則か

``` math
AA^{-1} = A^{-1}A  
```

``` math
det(A) \neq 0
```


### コード

``` python
import numpy as np

def regular_matrix(_A):
  detA = np.linalg.det(A)
  #print("行列式: {0}".format(detA))

  if detA == 0:
    #print("not regular matrix")
    return -1
  
  invA = np.linalg.inv(_A)
  #print("逆行列: {0}".format(invA))
  dot_A_vs_invA = np.dot(_A, invA)
  dot_invA_vs_A = np.dot(invA, _A)
  #print("ドット積1: \n{0}".format(dot_A_vs_invA))
  #print("ドット積2: \n{0}".format(dot_invA_vs_A))

  if dot_A_vs_invA.all() == dot_invA_vs_A.all():
      #print("Regular matrix")
      return 0

  #print("not regular matrix")
  return -1


A = np.array([
              [1/np.sqrt(2), 1/np.sqrt(2),  0],
              [1/np.sqrt(2), -1/np.sqrt(2), 0],
              [0,            0,             1]
              ])

# regular matrix
rm = regular_matrix(A)


# L2 norm
l2 = -1
v1 = np.linalg.norm(A[0], ord=2) 
v2 = np.linalg.norm(A[1], ord=2) 
v3 = np.linalg.norm(A[2], ord=2) 
if round(v1, 5) == 1 and round(v2, 5) == 1  and round(v3, 5) == 1:
  l2 = 0


# Inner dot
orthogonal = -1
A01 = A[0] @ A[1]
A02 = A[0] @ A[2]
A12 = A[1] @ A[2]
if round(A01, 5) == 0 and round(A02, 5) == 0  and round(A12, 5) == 0:
  orthogonal = 0

if rm == 0 and l2 == 0 and orthogonal == 0:
  print("orthonormal basis")
```


## 正規直交基底化
基底が与えられた時に、グラム・シュミッドの直交化法を用いて正規直交基底を求める。
ギブンスの回転を用いたQR法等もあるが、手計算ならグラム・シュミッドだろう。

$\overrightarrow {v_{1}},\ldots \overrightarrow {v_{k}}$が正規直交かつ$\overrightarrow {u}$がそれらと一時独立の時、

``` math
\overrightarrow {v}=\overrightarrow {u}-\sum ^{k}_{i\cdot 1}\left( \overrightarrow {u}\cdot \overrightarrow {v_i}\right) \overrightarrow {v_i}
```
で、正規直交基底を求められる。

### 計算
まず、正規直交基底させる$\overrightarrow {u}$を定義する。

``` math
\overrightarrow {u}=
\begin{bmatrix}
1 & 0 & 1 \\
1 &-1 & 1 \\
0 & 1 & 1 
\end{bmatrix}
```

``` math
\overrightarrow {u_{[0]}}=
\begin{bmatrix}
1\\
1\\
0
\end{bmatrix},
\overrightarrow {u_{[1]}}=
\begin{bmatrix}
0\\
-1\\
1
\end{bmatrix},
\overrightarrow {u_{[2]}}=
\begin{bmatrix}
1\\
1\\
1
\end{bmatrix}
```

次に、$\overrightarrow {u_{[0]}}$を正規化し、$\overrightarrow {v_{[0]}}$を求める。

``` math
\overrightarrow {v_{[0]}}
= \dfrac {1}{\sqrt {1^{2}+1^{2}+0^{2}}}\begin{bmatrix} 1 \\ 1 \\ 0 \end{bmatrix}
=\begin{bmatrix}
\dfrac {1}{\sqrt{2}}\\
\dfrac {1}{\sqrt{2}}\\
0
\end{bmatrix}
```

次に、公式を用い$\overrightarrow {u_{[1]}}$と$\overrightarrow {v_{[0]}}$が直交するベクトル$\overrightarrow {f}$を求め、正規化して$\overrightarrow {v_{[1]}}$を求める。

``` math
\overrightarrow {f_1}
= \overrightarrow {u_{[1]}} - (\overrightarrow {u_{[1]}}, \overrightarrow {v_{[0]}})\overrightarrow {v_{[0]}}
= 
\begin{bmatrix} 0 \\ -1 \\ 1 \end{bmatrix}

-(\begin{bmatrix}
0\\
-1\\
1
\end{bmatrix}

\begin{bmatrix}
\dfrac {1}{\sqrt{2}}\\
\dfrac {1}{\sqrt{2}}\\
0
\end{bmatrix})

\begin{bmatrix}
\dfrac {1}{\sqrt{2}}\\
\dfrac {1}{\sqrt{2}}\\
0
\end{bmatrix}

=
\begin{bmatrix}
\dfrac {1}{2}\\
-\dfrac {1}{2}\\
1
\end{bmatrix}

```

次に、$\overrightarrow {f_1}$を正規化し$\overrightarrow {v_1}$にする。

``` math
\overrightarrow {v_{[1]}}
=\dfrac {1}{\sqrt {\left( \dfrac {1}{2}\right) ^{2}+\left( -\dfrac {1}{2}\right) ^{2}+\left( 1\right) ^{2}}}
\begin{bmatrix}
\dfrac {1}{2}\\
-\dfrac {1}{2}\\
1
\end{bmatrix}
=

\dfrac {1}{\sqrt {\left( 1\right) ^{2}+\left( -1\right) ^{2}+\left( 2\right) ^{2}}}
\begin{bmatrix}
1\\
-1\\
2
\end{bmatrix}
=
\begin{bmatrix} \dfrac {1}{\sqrt {6}} \\ -\dfrac {1}{\sqrt {6}} \\ \dfrac {2}{\sqrt {6}} \end{bmatrix}

```

同様に公式を用い、$\overrightarrow {u_{[2]}}$が$\overrightarrow {v_{[0]}}$と$\overrightarrow {v_{[1]}}$に対して直交するベクトル$\overrightarrow {f_2}$を求め、正規化して$\overrightarrow {v_{[2]}}$を求める。

``` math
\overrightarrow {f_2}
= \overrightarrow {u_{[2]}} 
- (\overrightarrow {u_{[2]}}, \overrightarrow {v_{[0]}})\overrightarrow {v_{[0]}}
- (\overrightarrow {u_{[2]}}, \overrightarrow {v_{[1]}})\overrightarrow {v_{[1]}}
= 
\begin{bmatrix}
 -\dfrac {1}{3} \\ 
  \dfrac {1}{3} \\ 
  \dfrac {1}{3} \\ 
\end{bmatrix}
```

``` math
\overrightarrow {v_{[2]}}
=\dfrac {1}{\left| \overrightarrow {f_2}\right| }\overrightarrow {f_2}
=
\begin{bmatrix}
 -\dfrac {1}{\sqrt {3}} \\ 
  \dfrac {1}{\sqrt {3}} \\ 
  \dfrac {1}{\sqrt {3}} \\ 
\end{bmatrix}
```

よって、

``` math
\overrightarrow {v_{[0]}}
=\begin{bmatrix}
\dfrac {1}{\sqrt{2}}\\
\dfrac {1}{\sqrt{2}}\\
0
\end{bmatrix},

\overrightarrow {v_{[1]}}
=\begin{bmatrix} \dfrac {1}{\sqrt {6}} \\ -\dfrac {1}{\sqrt {6}} \\ \dfrac {2}{\sqrt {6}} \end{bmatrix},

\overrightarrow {v_{[2]}}
=
\begin{bmatrix}
 -\dfrac {1}{\sqrt {3}} \\ 
  \dfrac {1}{\sqrt {3}} \\ 
  \dfrac {1}{\sqrt {3}} \\ 
\end{bmatrix}
```

が解である。

### コード

``` python
import numpy as np
A = np.array([
              [1,  0, 1],
              [1, -1, 1],
              [0,  1, 1]
              ])
q, r = np.linalg.qr(A)
print(q)
```

## 正則行列
以下の条件を満たすものを正則行列という。
・$AA^{-1}=A^{-1}A=E$
・$\left| A\right| \neq 0$
※ここで$E$は単位行列を示す。

<b>ようは逆行列を持つ行列か否か</b>

### 計算

Aを定義

``` math
A=
\begin{bmatrix}
4 & 5 \\
4 & 7
\end{bmatrix}
```

行列式Aを計算して0出ないことを確認

``` math
det(A)=det
\begin{bmatrix}
4 & 5 \\
4 & 7
\end{bmatrix}
= (4 * 7) - (5 * 4) = 8
```

逆行列を計算

``` math
A^{-1}=\dfrac {1}{det(A)}\begin{bmatrix} d & -b \\ -c & a \end{bmatrix}
=\dfrac {1}{8}\begin{bmatrix} 7 & -5 \\ -4 & 4 \end{bmatrix}
=\begin{bmatrix} 0.875 & -0.625 \\ -0.5 & 0.5 \end{bmatrix}
```

正則条件の確認

``` math
AA^{-1}=
\begin{bmatrix} 4 & 5 \\ 4 & 7 \end{bmatrix}
\begin{bmatrix} 0.875 & -0.625 \\ -0.5 & 0.5 \end{bmatrix}
=\begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix}
```

``` math
A^{-1}A=
\begin{bmatrix} 0.875 & -0.625 \\ -0.5 & 0.5 \end{bmatrix}
\begin{bmatrix} 4 & 5 \\ 4 & 7 \end{bmatrix}
=\begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix}
```

### コード

``` python
import numpy as np

A = np.array([[4, 5],
              [4, 7]])
print(A)

detA = np.linalg.det(A)
print(detA)

if detA == 0:
    exit()

invA = np.linalg.inv(A)
print(invA)

dot_A_vs_invA = np.dot(A, invA)
dot_invA_vs_A = np.dot(invA, A)

print(dot_A_vs_invA)
print(dot_invA_vs_A)

if dot_A_vs_invA.all() == dot_invA_vs_A.all():
  print("Regular matrix")
```


## 逆行列
以下の行列$A$があった時に

``` math
A=
\begin{bmatrix}
a & b \\
c & d
\end{bmatrix}
```

逆行列は以下で求められる。

``` math
A^{-1}=\dfrac {1}{det(A)}\begin{bmatrix} d & -b \\ -c & a \end{bmatrix}
```

## Norm
### L0-Norm
0以外の値を持つ次元の数

### L1-Norm
各次元の値の絶対値の和である。すなわち、マンハッタン距離。
$|x| + |y|$

### L2-Norm
ユークリッド距離のことである。
$r^2 = x^2 + y^2$