2024.6.25 特異値分解【numpy】
フルランクな行列$ A \in R^{ m\times n}は次のように分解できる。
$ A = U\Sigma V^\top
これを行列$ Aの特異値分解(SVD : Singular Value Decomposition)という。ただし、
$ U\in R^{m\times m}, V\in R^{n\times n}は直交行列
$ \Sigma\in R^{m\times n}は対角行列
である。また、
$ U = [u_1, u_2, ... ,u_m], V = [v_1, v_2, ..., v_n]
としたとき、
$ u_i :左特異ベクトル
$ v_i :右特異ベクトル
という。
code:svd1.py
import numpy as np
from numpy.linalg import svd
data1 = 1, 2, 3], 2, 1, 3, [3, 1, 2
A = np.array(data1)
U, S, Vh = svd(A)
print('U =\n', U)
print('特異値 =\n', S)
print('Vh =\n', Vh)
$ \Sigmaの対角要素に並ぶ値を特異値という。
$ \Sigma = \mathrm{diag}(\sigma_1, \sigma_2, \ldots , \sigma_n)
結果
code:result1.txt
U =
[-5.67144158e-01 7.07106781e-01 4.22312094e-01
-5.97239491e-01 -1.38777878e-16 -8.02062959e-01
-5.67144158e-01 -7.07106781e-01 4.22312094e-01]
特異値 =
6.22011584 1.73205081 0.55691915
Vh =
[-0.55675098 -0.36955453 -0.74394744
-0.81649658 0.40824829 0.40824829
0.15284527 0.83472318 -0.52903264]
$ Aのランクが$ r < nの場合、$ r個の特異値が存在する。
$ \Sigma = \left[ \begin{array}{cc} \tilde\Sigma&0\\ 0&0 \end{array} \right]
$ \tilde\Sigma = \mathrm{diag}( \sigma_1, \sigma_2, \ldots , \sigma_r )
公式