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 =
特異値 =
Vh =
$ 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 )