勉強備忘メモ:固有値分解と特異値分解について
特異値分解を勉強していて、諸々コードを書いて実証しながまとめたので備忘がてら以下に記す。
まず、特異値分解とは以下の形式に任意の行列を分解することである。
数式で表すと以下のようになります:A = UΣV^T。
この式では、Uは直交行列、Σは対角行列であり、要素は特異値と呼ぶ。
V^Tは転置された直交行列です。
利点:特異値分解は、行列の次元削減、画像圧縮、ノイズ除去、潜在的な意味の解釈などの応用に活用。
実際やるとわかるが特異値自体は一意に定まるが、UとV^Tは定まるとは限らない。
A = UΣV^Tを認めると、以下のような形で数式を直せ、
A^T A = (U^TΣ^TV )(UΣV^T)
Uは直行行列なのでU^T=U^-1が等しくなるので、消えて、以下となる。
A^T A = (Σ^TV )(ΣV^T)
そして、
(Σ^T * Σ)= 例えば、[[a, 0, 0], [0, d, 0]] * [[a, 0],[0, c], [0, 0]] = [[a^2, 0], [0, c^2]] = Σ^2
そして、
A^T A = Σ^2 V V^T
そして、固有値方程式を前提にして、Aは行列でラムダはスカラーでxはベクトル、Ax = λxで、これに単位行列Iをかけると、Ax = λxIとなり、 (A - λI)x=0となる。単位行列にAをかけないのは以下の通り。
そして、
A^T A = Σ^2 V V^T
両辺にVをかけると、Vは直行行列なので単位行列Iになり、
A^T A V = Σ^2 V I
そして、
(A^T A - Σ^2I )V=0
(直行行列にとその転置の内積は単位行列Iになる理由は以下。)
(A^T A - Σ^2I )V=0
について、
固有値方程式(A - λI)x=0を思い出すと、これに対応しているので、
A=A^T A, λ=Σ^2として、これを解いて出てくる固有値が、Σ^2がAA^Tの固有値であり、その2乗を外したものがAの特異値となる。以下実際の
pythonによる計算と実装例。
#以下でA A^tを作成し、
# 行列 A の定義
A = np.array([[1, 2], [3, 4], [5, 6]])
# A の転置
AT = A.T
# A^T A の計算
ATA = np.dot(AT, A)
# 結果の表示
print("Matrix A:")
print(A)
print("Matrix A^T A:")
print(ATA)
eigenvalues, eigenvectors = np.linalg.eig(ATA)
# 特異値は固有値の平方根
singular_values = np.sqrt(eigenvalues)
V = eigenvectors
print("Eigenvalues:", eigenvalues)
print("Singular values:", singular_values)
print("V matrix:", V)
解釈としては、
A = UΣV^T
ΣはAの全体の情報を圧縮したものであり、Uは主に行列Aの行要素を、V^Tは列要素を転置した情報を持つ。