機械学習で用いる行列の単語を整理した② (分散共分散行列、相関行列等)
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$