特異値分解(Singular Value Decomposition, SVD) は、任意の行列を3つの行列に分解する手法。
import numpy as np
A = np.array([[3, 1],
[1, 3],
[2, 1]])
A.T @ Aarray([[14, 8],
[ 8, 11]])A @ A.Tarray([[10, 6, 7],
[ 6, 10, 5],
[ 7, 5, 5]])A.Tarray([[3, 1, 2],
[1, 3, 1]])SVDのアルゴリズム¶
1. の固有値分解¶
行列 は対称かつ半正定値(symmetric & positive semi-definite)であるため、固有値分解ができる。
:直交行列(列は固有ペクトル)
:非負の固有値
この固有値 の平方根
を 特異値 とよぶ
実装¶
numpy.linalg.svd()を使う場合¶
import numpy as np
A = np.array([[3, 1],
[1, 3],
[2, 1]])
U, S, VT = np.linalg.svd(A)Uarray([[-0.64871739, 0.54898814, -0.52704628],
[-0.59110282, -0.7996789 , -0.10540926],
[-0.47933622, 0.24315772, 0.84327404]])Sarray([4.54306178, 2.08820251])VTarray([[-0.76950911, -0.63863584],
[ 0.63863584, -0.76950911]])# 対角行列に変換
Sigma = np.zeros_like(A, dtype=float)
np.fill_diagonal(Sigma, S)
# 検証:A ≈ U @ Sigma @ VT
reconstructed = U @ Sigma @ VT
reconstructedarray([[3., 1.],
[1., 3.],
[2., 1.]])import numpy as np
A = np.array([[3, 1, 2],
[1, 3, 1]])
A.T @ Aarray([[10, 6, 7],
[ 6, 10, 5],
[ 7, 5, 5]])A @ A.Tarray([[14, 8],
[ 8, 11]])