LoginSignup
4
5

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-03-15

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

固有値・固有ベクトル

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

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

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

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

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

det(A-\lambda E)=0

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

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

計算

$A$を定義

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

次に固有方程式を解く。

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$ の場合

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

$\lambda = 7$ の場合

\begin{bmatrix}
5 - 7 & 1 \\
6 & 4 - 7
\end{bmatrix}
\begin{bmatrix}
x_1 \\
x_2
\end{bmatrix}
=\begin{bmatrix}
0 \\
0
\end{bmatrix}
\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$の場合

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

$t=3$の場合

\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$は単位行列である。

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

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

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

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

正規直交基底

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

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

計算

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

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か確認する。

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

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

\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

基底: 正則か

AA^{-1} = A^{-1}A  
det(A) \neq 0

コード

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}$がそれらと一時独立の時、

\overrightarrow {v}=\overrightarrow {u}-\sum ^{k}_{i\cdot 1}\left( \overrightarrow {u}\cdot \overrightarrow {v_i}\right) \overrightarrow {v_i}

で、正規直交基底を求められる。

計算

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

\overrightarrow {u}=
\begin{bmatrix}
1 & 0 & 1 \\
1 &-1 & 1 \\
0 & 1 & 1 
\end{bmatrix}
\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]}}$を求める。

\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]}}$を求める。

\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}$にする。

\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]}}$を求める。

\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}
\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}

よって、

\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}

が解である。

コード

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$は単位行列を示す。

ようは逆行列を持つ行列か否か

計算

Aを定義

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

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

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

逆行列を計算

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}

正則条件の確認

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}
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}

コード

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$があった時に

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

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

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$

4
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
5