特異値分解問題を解く

Python, ML, Math16 January 2021

行列の特異値分解問題の解き方を整理する。
始める前に今回学習に当たって、最強に分かりやすいYoutubeの動画があったので感謝の意を込めて、リンクを記載します。

チャンネル 動画
某处生活_LiveSomewhere 特異値分解PART2:特異値分解

ほぼこちらの動画のサマリになる予定

特異値分解とは

特異値分解の前に、固有値分解の整理から。
ある正則行列\(A\)に対しては固有値分解を行い、以下のように変形することができた。

$$ A = V \Lambda V^{-1}$$

これに対し、特異値分解は\(m \times n\)の行列に対し分解を行う。 以下のような式が成立します。

$$ A = U \Sigma V^T $$
  • \(A: m \times n\)
  • \(U: m \times m\)の直交行列(転置行列と逆行列が等しい行列)
  • \(\sum : m \times n\)
  • \(V^T: n \times n\)の直交行列(転置行列と逆行列が等しい行列)
$$ A = \begin{pmatrix} \vec{u_1} & \vec{u_2} & \cdots \end{pmatrix} \begin{pmatrix} \sigma _1 & 0 & \cdots \\ 0 & \sigma_2 & \cdots \\ \vdots & 0 & \ddots \end{pmatrix} \begin{pmatrix} \vec{v_1} & \vec{v_2} & \cdots \end{pmatrix}^T$$
  • \(\vec{u}:\) 単位ベクトル(左特異ベクトル)
  • \(\sigma : A\)の特異値
  • \(\vec{v}:\) 単位ベクトル(右特異ベクトル)

単位ベクトル

長さが1となるベクトル。以下の式で算出できる。

$$ \frac{\vec{x}}{|\vec{x}|}$$

ベクトルの各要素を長さで割る、ちなみに長さの求め方は以下。

$$ |\vec{x}| = \sqrt{a^2+b^2} $$

例題

以下の行列を特異値分解する。

$$A = \begin{pmatrix} 1 & 3 \\ 2 & 2 \\ 3 & 1 \end{pmatrix}$$

解き方

冒頭の式のように行列\(A\)を分解するために必要な情報は\(U, \Sigma, V^T\)の3つです。(当たり前)
これらを求めるには、\(AA^T\)及び\(A^TA\)をそれぞれ固有値分解することで求められます。

1. \(A^TA\)\(V^T\)を求める

$$ A^TA = V\Sigma^TU^T U\Sigma V^T $$

ここで、\(U\)は直交行列なので、\(U^T = U^{-1}\)となり、打ち消せます。

$$ A^TA = V\Sigma^T \Sigma V^T $$

これは、固有値分解の公式から\(A\)\(A^TA\)に、\(\Lambda\)\(\Sigma^T \Sigma\)に変わったものとみなすことができるので、
固有方程式から、以下が成立する。

$$ | A^TA - \lambda E | = 0 $$

計算は省略 〜〜

よって、\(A^TA\)の固有値\(\lambda = 24, 4\)

さらに、\(\Sigma\)の特異値を\(\sigma_1, \sigma_2\)とすると、

$$ \Sigma^T \Sigma = \begin{pmatrix} \sigma_1 & 0 & 0 \\ 0 & \sigma_2 & 0 \end{pmatrix} \begin{pmatrix} \sigma_1 & 0 \\ 0 & \sigma_2 \\ 0 & 0 \end{pmatrix} = \begin{pmatrix} \sigma_1^2 & 0 \\ 0 & \sigma_2^2 \end{pmatrix} = \begin{pmatrix} \lambda_1 & 0 \\ 0 & \lambda_2 \end{pmatrix}$$

となるので、\(\sigma = \sqrt{\lambda}\)が成立する。よって、\(A\)の特異値は\(\sigma = 2\sqrt{6}, 2\)

次に、\(A^TA\)の固有ベクトルを求め、行列とすると以下となる。

$$ \begin{pmatrix} 1 & 1 \\ 1 & -1 \end{pmatrix} $$

これより、\(A\)の右特異ベクトルは\(A^TA\)の固有ベクトルを単位ベクトルに変換すれば良いので、
同様に行列化すると以下の通り。

$$ V = \begin{pmatrix} \frac{1}{\sqrt{2}} & \frac{1}{\sqrt{2}} \\ \frac{1}{\sqrt{2}} & -\frac{1}{\sqrt{2}} \end{pmatrix} $$

この値は一例であり、同条件を満たす特異ベクトルはいくつか存在する

以上から、元々求めたかった\(V^T\)は、

$$ V^T = \begin{pmatrix} \frac{1}{\sqrt{2}} & \frac{1}{\sqrt{2}} \\ \frac{1}{\sqrt{2}} & -\frac{1}{\sqrt{2}} \end{pmatrix} $$

2. \(U, \Sigma\)を求める

右特異ベクトルは冒頭の定義式より、

$$ A = U \Sigma V^T $$
$$ U = AV / \Sigma $$

が成立するので、

$$ \vec{u_1} = \frac{1}{2\sqrt{6}} \begin{pmatrix} 1 & 3 \\ 2 & 2 \\ 3 & 1 \end{pmatrix} \begin{pmatrix} \frac{1}{\sqrt{2}} \\ \frac{1}{\sqrt{2}} \end{pmatrix} = \begin{pmatrix} \frac{1}{\sqrt{3}} \\ \frac{1}{\sqrt{3}} \\ \frac{1}{\sqrt{3}} \end{pmatrix}$$
$$ \vec{u_2} = \frac{1}{2} \begin{pmatrix} 1 & 3 \\ 2 & 2 \\ 3 & 1 \end{pmatrix} \begin{pmatrix} \frac{1}{\sqrt{2}} \\ -\frac{1}{\sqrt{2}} \end{pmatrix} = \begin{pmatrix} \frac{1}{\sqrt{2}} \\ 0 \\ -\frac{1}{\sqrt{2}} \end{pmatrix}$$

3. 分解式に当てはめる

以上から求めた値を、分解式に当てはめると

$$ A = \begin{pmatrix} \frac{1}{\sqrt{3}} & \frac{1}{\sqrt{2}} \\ \frac{1}{\sqrt{3}} & 0 \\ \frac{1}{\sqrt{3}} & -\frac{1}{\sqrt{2}} \end{pmatrix} \begin{pmatrix} 2\sqrt{6} & 0 \\ 0 & 2 \end{pmatrix} \begin{pmatrix} \frac{1}{\sqrt{2}} & \frac{1}{\sqrt{2}} \\ \frac{1}{\sqrt{2}} & -\frac{1}{\sqrt{2}} \end{pmatrix} $$

例題の元ネタ

tags: Python, ML, Math